Linux iptables是什么?iptables和docker的关系?

简介: iptables是Linux系统中用来配置防火墙的命令。iptables是工作在TCP/IP的二、三、四层,当主机收到一个数据包后,数据包先在内核空间处理,若发现目标地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目标不是自身,则会将包丢弃或进行转发。

iptables的核心概念

iptables是Linux系统中用来配置防火墙的命令。iptables是工作在TCP/IP的二、三、四层,当主机收到一个数据包后,数据包先在内核空间处理,若发现目标地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目标不是自身,则会将包丢弃或进行转发。

四表:

  • filter(用于过滤)
  • nat(用于 NAT)
  • mangle(用于修改分组数据)
  • raw(用于原始数据包)

最常用的是filter 和 nat。对应下图中的绿色块。

五链:

  • PREROUTING:用于路由判断前所执行的规则,比如,对接收到的数据包进行 DNAT。
  • POSTROUTING:用于路由判断后所执行的规则,比如,对发送或转发的数据包进行 SNAT 或 MASQUERADE。
  • OUTPUT: 类似于 PREROUTING,但只处理从本机发送出去的包。
  • INPUT: 类似于 POSTROUTING,但只处理从本机接收的包。
  • FORWARD

  1. 流入本机:PREROUTING --> INPUT-->用户空间进程
  2. 流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
  3. 转发:PREROUTING --> FORWARD --> POSTROUTING

内网至外网用postrouting SNAT 外网至内网用prerouting DNAT

f69fd249b767449aaceba32742e8b2d7.png下图中白色背景方框,则表示链(chain)

iptables命令

一、链管理:

-N: new 自定义一条新的规则链

-X: delete 删除自定义的空的规则链

-P:policy 设置默认策略

       ACCEPT:接受

       DROP:丢弃

-E:重命名自定义链

二、查看:

-L: list

-n:以数字格式显示地址和端口号

-v:详细信息

三、规则管理:

-A : append 追加

-I:insert 插入

-D:delete 删除

-F:flush 清空指定规则链

-R:replace 替换指定链上的规则编号

-Z: zero :置零


iptables -L 列出规则,默认为filter表的规则。

[root@node100 ~]# iptables  -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  anywhere             anywhere
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
Chain DOCKER (1 references)
target     prot opt source               destination
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere
Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

iptables -t nat -L 列出nat表的规则。

[root@node100 ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere            !loopback/8           ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        anywhere
Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

iptables中的第一个选项可以是-A, 表明向链(chain)中添加一条新的规则,也可以是-I,表明将新的规则插入到规则集的开头。接下来的参数指定了链。

所谓链就是若干条规则的集合

OUTPUT链它可以控制所有的出站流量(outgoing traffic)。

INPUT链它能够控制所有的入站流量(incoming traffic)。

-d指定了所要匹配的分组目的地址,

-s指定了分组的源地址。

-j指示iptables执行到特定的处理(action)

c683946533c84e569f3c087ec415ee38.png

实战

需求:

在192.168.56.3 上启动一个nginx,暴露8088端口

想要在192.168.56.4 上使用8099访问192.168.56.3 上的nginx服务。使用iptables如何实现?

1、192.168.56.3 拉起nginx服务,并暴露8088端口

11504cb674d34d0393b248718927c2cb.png

2、在192.168.56.4上配置iptables

  • 配置iptables将192.168.56.3  nginx 8088的数据包转发到192.168.56.4的8099端口上
  • 把.192.168.56.3发送到.3:8088的数据包源地址修改为192.168.56.4 的地址。

pre 路由前

post路由后

-j 后跟执行的action

# -j表示iptables要执行的动作; DANT 目的地址转换为 部署的nginx
]# iptables -t nat -A PREROUTING -p tcp --dport 8099 -j DNAT --to 192.168.56.3:8088
# -d指定了所要匹配的分组目的地址,此处应该是可以支持cidr的
]# iptables -t nat -A POSTROUTING -p tcp -d 192.168.56.3 --dport 8088 -j SNAT --to 192.168.56.4

查看iptables nat表

此时访问192.168.56.4:8099 无法看到nginx访问页面。

查看linux主机是否开启了ip转发功能

]# cat /proc/sys/net/ipv4/ip_forward

0

开启主机的转发功能

sysctl -w net.ipv4.ip_forward=1

net.ipv4.ip_forward = 1

成功转发

b870c73559934797aa4af533fdac737a.png流程图:  

iptables和docker的关系?

vagrant拉起一台虚拟机

vagrant up

查看iptables nat表

我们应该关注postrouting链和docker链比较启动nginx前后的对比

启动一个nginx命令

~]#docker run -d -p 8088:80 --name=nginx251 nginx

比较iptables

iptables中的内容均为docker 自动新增的.

解读新增的nat链

nginx容器启动后分别在postrouting 链和docker chain新增了SANT 和DANT。


先解读DANT

DNAT       tcp  --  anywhere             anywhere             tcp dpt:radan-http to:172.17.0.2:80


这个对应的iptables 命令为:

# -j表示iptables要执行的动作; DANT 目的地址转换为 部署在容器中的nginx

]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 172.17.0.2:80


postroting链新增

MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:http

这个对应的iptables 命令为:

# -d指定了所要匹配的目的地址, -j执行的action,-j后也可以写成 SNAT --to 10.50.10.251

# Linux 选择默认的出口 IP。这实际上就是经常说的 MASQUERADE

]#iptables -t nat -A POSTROUTING -p tcp -d  172.17.0.2 --dport 80 -j MASQUERADE

如何禁止docker的默认行为-修改 iptables?

--iptables=false

docker启动命令加入如上参数然后关闭默认添加iptables的功能.

参考:

https://www.ichenfu.com/2018/09/09/packet-flow-in-netfilter/


目录
相关文章
|
11月前
|
Linux iOS开发 Docker
MyEMS开源系统安装之Linux/macOS上的DOcker
本指南详细介绍了如何在Linux/macOS上使用Docker部署MyEMS系统。主要内容包括:前置条件(如安装Docker、npm和MySQL),以及分步骤部署各个组件(如myems-api、myems-admin、myems-modbus-tcp等)。每个步骤涵盖源代码复制、环境配置、镜像构建、容器运行及日志管理等操作,并提供了多平台构建的支持。最后,指南还说明了默认端口和登录凭据,帮助用户快速启动并访问MyEMS的管理界面和Web界面。
389 1
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
546 28
|
Linux 网络性能优化 网络安全
Linux(openwrt)下iptables+tc工具实现网络流量限速控制(QoS)
通过以上步骤,您可以在Linux(OpenWrt)系统中使用iptables和tc工具实现网络流量限速控制(QoS)。这种方法灵活且功能强大,可以帮助管理员有效管理网络带宽,确保关键业务的网络性能。希望本文能够为您提供有价值的参考。
3089 28
|
Linux 网络安全 虚拟化
linux怎么把文件传到docker里面
在现代应用开发中,Docker作为流行的虚拟化工具,广泛应用于微服务架构。文件传输到Docker容器是常见需求。常用方法包括:1) `docker cp`命令直接复制文件;2) 使用`-v`选项挂载宿主机目录,实现数据持久化和实时同步;3) 通过SCP/FTP协议传输文件;4) 在Dockerfile中构建镜像时添加文件。选择合适的方法并确保网络安全是关键。
1640 1
|
Linux 虚拟化 Docker
Linux服务器部署docker windows
在当今软件开发中,Docker成为流行的虚拟化技术,支持在Linux服务器上运行Windows容器。流程包括:1) 安装Docker;2) 配置支持Windows容器;3) 获取Windows镜像;4) 运行Windows容器;5) 验证容器状态。通过这些步骤,你可以在Linux环境中顺利部署和管理Windows应用,提高开发和运维效率。
2328 1
|
Linux Docker 容器
Linux 中停止 Docker 服务报 warning 导致无法彻底停止问题如何解决?
在 Linux 系统中,停止 Docker 服务时遇到警告无法彻底停止的问题,可以通过系统管理工具停止服务、强制终止相关进程、检查系统资源和依赖关系、以及重置 Docker 环境来解决。通过以上步骤,能够有效地排查和解决 Docker 服务停止不彻底的问题,确保系统的稳定运行。
1170 19
|
机器学习/深度学习 安全 网络协议
Linux防火墙iptables命令管理入门
本文介绍了关于Linux防火墙iptables命令管理入门的教程,涵盖了iptables的基本概念、语法格式、常用参数、基础查询操作以及链和规则管理等内容。
582 73
|
Linux Docker 容器
Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!
本篇博客重在讲解Centos安装docker,经博主多次在不同服务器上测试,极其的稳定,尤其是阿里的服务器,一路复制命令畅通无阻。
22674 5
Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo

热门文章

最新文章