学习iptables 学习查看docker网络配置

目录

四表五链

filter表

nat表

mangle表

raw表

数据包处理流程

表调用顺序

内置链调用顺序

规则调用顺序

iptables 常用命令

管理选项

控制选项

iptables 查看docker 网络


iptables是运行在用户空间的应用软件,通过控制Linux内核netfilter模块,来管理网络数据包的处理和转发。iptables操作需要超级用户权限,其可执行文件通常位于 /sbin/iptables 或 /usr/sbin/iptables 。同时需要说明的是,iptables 通常只用于处理 IPv4 数据包;而对于 IPv6 数据包,则使用类似的 ip6tables 命令

学习iptables 后可以轻松理解主机上的网络配置,本文会利用iptables知识解析docker网络配置。

四表五链

iptables 使用Xtables框架。存在“表(tables)”、“链(chain)”和“规则(rules)”三个层面。

每个“表”指的是不同类型的数据包处理流程,如filter表表示进行数据包过滤,而nat表针对连接进行地址转换操作。每个表中又可以存在多个“链”,系统按照预订的规则将数据包通过某个内建链,例如将从本机发出的数据通过OUTPUT链。在“链”中可以存在若干“规则”,这些规则会被逐一进行匹配,如果匹配,可以执行相应的动作,如修改数据包,或者跳转。跳转可以直接接受该数据包或拒绝该数据包,也可以跳转到其他链继续进行匹配,或者从当前链返回调用者链。当链中所有规则都执行完仍然没有跳转时,将根据该链的默认策略(“policy”)执行对应动作;如果也没有默认动作,则是返回调用者链。

四表五链

filter表

filter表是默认的表,如果不指明表则使用此表。其通常用于过滤数据包。其中的内建链包括:

  • INPUT,输入链。发往本机的数据包通过此链。
  • FORWARD,转发链。本机转发的数据包通过此链。
  • OUTPUT,输出链。从本机发出的数据包通过此链。

nat表

nat表如其名,用于地址转换操作。其中的内建链包括:

  • PREROUTING,路由前链,在处理路由规则前通过此链,通常用于目的地址转换(DNAT)。
  • INPUT,输入链,更改发往本地套接字的数据包。
  • OUTPUT,输出链,类似PREROUTING,但是处理本机发出的数据包。
  • POSTROUTING,路由后链,完成路由规则后通过此链,通常用于源地址转换(SNAT)。

mangle表

mangle表用于处理数据包。其和nat表的主要区别在于,nat表侧重连接而mangle表侧重每一个数据包。其中内建链列表如下。

  • PREROUTING
  • INPUT
  • FORWARD
  • OUTPUT
  • POSTROUTING

raw表

raw表用于处理异常,有如下两个内建链:

  • PREROUTING
  • OUTPUT

数据包处理流程

数据包到达iptables后,处理流程是什么样子的? 借用维基百科中数据包的一张整体处理流程图,这里我们只关心网络层。

数据包处理流程

表调用顺序

raw => mangle => nat => filter

内置链调用顺序

  • 数据包流入时,
    内建链调用顺序:PREROUTING => 路由选择 => INPUT => 应用程序
  • 数据包转发时
    内建链调用顺序:PREROUTING => 路由选择 => FORWARD => POSTROUTING
  • 数据包流出时
    内建链调用顺序:应用程序 => OUTPUT => 路由选择 => POSTROUTING

规则调用顺序

按规则在调用链中的顺序依次调用,若找到一条匹配规则,将不再检查链中的其他规则;若没有匹配的规则,按照此链的默认规则处理

数据包处理简化流程

iptables 常用命令

常用命令格式:iptables -t [表名] [管理选项] [链名] [匹配条件] -j [控制选项]。若没有通过-t 指定表名,默认使用filter 表。

管理选项

管理选项含义示例用法
-A在指令链末尾追加一条 规则iptables -A INPUT -j ACCEPT
-I在指定链中插入一条新规则,未指定序号默认作为第一条iptables -I INPUT -j ACCEPT
-R修改或替换某一条规则iptables -R INPUT 1 -j ACCEPT
-D删除某一条规则iptables -D INPUT 1
-L列出链中的规则iptables -L
-F删除链中的所有规则iptables -t raw -F OUTPUT
-P指定链的默认策略iptables -P INPUT ACCEPT
-N新建用户自定义链iptables -N DOCKER
-n以数字形式展示iptables -t nat -nL
-n --line-number展示规则时带编号iptables -nL --line-number

控制选项

ACCEPT允许数据包通过
REJECT拒绝数据包通过,必要时会给数据包发送端一个响应信息
DROP丢弃数据包
LOG在/var/log/messages文件中记录日志信息,然后将数据包给下一条规则处理,自身不处理数据包

iptables 查看docker 网络

掌握一个工具的最佳方法是实践。在ubuntu18.04 系统上安装docker 19.03.7。使用iptables 查看docker网络配置,加深对iptables理解。下面通过iptables -S 查看各个表的链和规则时,对各个规则做了注释。

iptables -t raw -S 查看raw表的链和规则。

Ξ ~/work → sudo iptables -S -t raw      
# PREROUTING 链的默认策略为允许数据包通过
-P PREROUTING ACCEPT
# OUTPUT 链的默认策略为允许数据包通过
-P OUTPUT ACCEPT

iptables -t mangle -S 查看mangle表的链和规则。

Ξ ~/work → sudo iptables -t mangle -S
# PREROUTING 链的默认策略为允许数据包通过
-P PREROUTING ACCEPT
# INPUT 链的默认策略为允许数据包通过
-P INPUT ACCEPT
# FORWARD 链的默认策略为允许数据包通过
-P FORWARD ACCEPT
# OUTPUT 链的默认策略为允许数据包通过
-P OUTPUT ACCEPT
# POSTROUTING 链的默认策略为允许数据包通过
-P POSTROUTING ACCEPT

iptables -t nat -S 查看nat 表的链和规则。

Ξ ~/work → sudo iptables -t nat -S   
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
# 新建用户自定义链DOCKER
-N DOCKER
# PREROUTING链添加规则:目标地址类型属于本地网络类型的数据包交给DOCKER链处理
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
# OUTPUT链添加规则:目标地址不是回环地址且目标地址类型属于本地网络类型的数据包交给DOCKER链处理
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
# POSTROUTING链添加规则:来自172.17.0.0/16且目标地址不是docker0网段的数据包实现自动化的snat
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
# DOCKER链中添加规则:来自docker0网段的数据包停止这条链的匹配,到前一个链的下一条规则进行匹配
-A DOCKER -i docker0 -j RETURN

iptables -S 查看filter表的链和规则。

Ξ ~/work → sudo iptables -S       
-P INPUT ACCEPT
# FORWARD 链默认策略是丢弃包
-P FORWARD DROP
-P OUTPUT ACCEPT
# 新建用户自定义链DOCKER
-N DOCKER
# 新建用户自定义链DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-1
# 新建用户自定义链DOCKER-ISOLATION-STAGE-2
-N DOCKER-ISOLATION-STAGE-2
# 新建用户自定义链DOCKER-USER
-N DOCKER-USER
# FORWARD链添加规则:数据包交给DOCKER-USER链处理
-A FORWARD -j DOCKER-USER
# FORWARD链添加规则:数据包交给DOCKER-ISOLATION-STAGE-1处理
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
# FORWARD链添加规则:接受目标地址是docker0网段且连接状态是RELATED或ESTABLISHED的数据包
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# FORWARD链添加规则:目标地址是docker0网段的数据包交给DOCKER链处理
  -A FORWARD -o docker0 -j DOCKER
# FORWARD链添加规则:接受来自docker0网段且目标地址不是docker0网段的数据包
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
# FORWARD链添加规则:接受来自docker0网段且目标地址是docker0网段的数据包
-A FORWARD -i docker0 -o docker0 -j ACCEPT
# DOCKER-ISOLATION-STAGE-1链添加规则:来自docker0网段且目标地址不是docker0网段的数据包发送给DOCKER-ISOLATION-STAGE-2链处理
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
# DOCKER-ISOLATION-STAGE-1链添加规则:数据包停止这条链的匹配,到前一个链的下一条规则进行匹配
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
# DOCKER-ISOLATION-STAGE-2链添加规则:丢弃发送到docker0网段的数据包
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
# DOCKER-ISOLATION-STAGE-2链添加规则:数据包停止这条链的匹配,到前一个链的下一条规则进行匹配
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
# DOCKER链添加规则:数据包停止这条链的匹配,到前一个链的下一条规则进行匹配
-A DOCKER-USER -j RETURN

结合数据包整体处理流程,可以得到安装docker后数据包处理流程如下,这里也是只考虑网络层。

docker 网络层数据包处理流程

处理流程相比之前复杂很多,但是查看这个图更有助于我们理解iptables

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值