欢迎加入本站的kubernetes技术交流群,微信添加:加Blue_L。
iptables命令用来管理ip数据包的过滤。iptables由命令行工具和一系列内核模块组成,iptables命令行工具用来管理规则配置,内核模块负责执行具体的规则。iptables内核模块依托于linux的netfilter网络框架,netfilter框架提供了一系列的网络钩子,ip数据包在经过网络协议栈的时候会触发这些钩子以执行注册到这些钩子上的函数。iptables内核模块会在这些钩子上注册处理函数来实现对ip数据包的过滤等。
netfilter中提供了ip钩子,ipv6钩子,arp钩子和bridge钩子等,都有对应的命令行工具和内核模块,如ip6tables,ebtables等,可以为不同网络层提供过滤功能,关于这些不同的功能,可以参考对应的文档查看。我们主要关心iptables,来看下netfilter中包含的ip钩子:
NF_IP_PRE_ROUTING
ip数据包达到网络协议栈后最先触发的是这个钩子,在还未执行路由决策之前触发。NF_IP_LOCAL_IN
在linux对ip数据包执行了路由之后,如果目的地是给本地系统时触发。NF_IP_FORWARD
在linux对ip数据包执行了路由之后,如果需要转发给其他主机时触发。NF_IP_LOCAL_OUT
本地数据包将要从本地发出时触发。NF_IP_POST_ROUTING
在任何本地发出的或本地进行转发的数据包将要在网络设备发发出时触发。
ip数据包在netfilter框架中会经过上面的钩子进行处理,iptables内核模块在这些钩子上注册了不同的处理函数,可以对数据包进行处理。iptables中包含这几种对数据包的处理功能:
- 包过滤,主要用来实现防火墙功能
- 包修改,修改数据包中的信息
- 网络地址转换,实现网络地址转换功能
表、链和目标
iptables中有不同类型的表:默认的filter表,nat表,mangle表raw表,每张表里存放不同类型的规则。
不同的表中还包含不同的链,可以是内置的链或用户自定义的链,内置的链包括:INPUT,PREROUTING,FORWARD,POSTROUTING,OUTPUT,这些是和netfilter中的钩子相对应的,是执行我们规则的入口。
每个链中又包含不同的规则,规则定义如何对数据包进行匹配,以及匹配之后要执行的目标动作,这些动作可以是跳转到用户的自定义链或者是内置的ACCEPT,DROP,RETURN,还可以是扩展模块中的,如REJECT,MARK等。这些目标可以分为终结和非终结型,终结型规则在执行完之后不会再匹配接下来规则,如ACCEPT,DROP,REJECT,MASQUERADE(nat的都是),而非终结类型再执行完当前规则后还会继续匹配后面的规则,如MARK,LOG。链中的规则匹配是按照顺序机型匹配执行的,如果当前规则不匹配则会一直匹配下一条规则,直到终结或匹配结束。
ACCEPT是允许数据包通过。DROP是丢弃数据包。RETURN是从当前链返回到调用该链的上层链中的下一条继续匹配。如果是内置链,则当匹配结束,或有规则使用了RETURN作为目标动作时,则使用这个内置链的策略决定是否允许通过。
关注Network Layer,以及注意图中包的路径,表的先后顺序。
命令行工具
iptables规则表,链和规则的关系为:table <-> chain -> rule。
指定表
-t, --table table
指定要操作的表,如果不指定这个参数则操作默认的filter表,针对所有命令生效。
默认策略
-P, --policy chain target
指定内置表的默认策略,target必须是ACCEPT或DROP。
链操作
-L, --list [chain]
列出指定链内的规则,如果chain
未指定,则列出该表下的所有规则。可以和-n
选项结合使用,来讲ip地址和端口以数字形式显示。可以和--line-numbers
结合使用,显示行号。-S, --list-rules [chain]
列出指定链内的规则,如果chain
未指定,则列出该表下的所有规则。该命令以定义规则所使用的命令方式展示。-F, --flush [chain]
清空指定链内的规则(链仍然保留),如果chain
未指定,则清空该表下的所有规则。-N, --new-chain chain
创建新的链。-X, --delete-chain [chain]
删除用户自定义链。被删除的链不能有其他链引用,被删除的链必须为空,即里面没有规则。如果不指定chain
的话将会尝试删除所有的用户自定义链。-E, --rename-chain old-chain new-chain
修改链的名称。
规则操作
-A, --append chain rule-specification
添加规则到链中。-C, --check chain rule-specification
测试指定规则是否存在-D, --delete chain rule-specification 或 -D, --delete chain rulenum
删除指定规则。-I, --insert chain [rulenum] rule-specification
插入指定规则,如果指定了rulenum
,则规则插入到链中的指定位置。-R, --replace chain rulenum rule-specification
替换指定行号位置的规则。
规则的定义
-4, --ipv4
指定规则应用于ipv4。-6, --ipv6
指定规则应用于ipv6。[!] -p, --protocol protocol
指定规则针对的ip协议。可以为tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh或all代表所有协议。可选的感叹号为取反的意思。[!] -s, --source address[/mask][,...]
指定源地址,可以使ip地址,ip网段或者是主机名等,主机名会在提交规则之前进行解析。可以指定多个地址,相应的会生成多个规则。也可以使用–src这个别名参数。可选的感叹号为取反的意思。[!] -d, --destination address[/mask][,...]
- 指定目的地址。解释同上面-s参数。也可以使用–src这个别名参数。可选的感叹号为取反的意思。
-m, --match match
除了使用上面列出的ip版本,协议和源/目的地址,网卡进行数据包匹配之外,我们还可以通过iptables的扩展模块进行匹配。-m
参数就是干这个用的,这个参数可以指定多次,代表使用多个扩展模块进行匹配,多个模块匹配先后顺序按照命令行中指定的顺序执行。如果前面一个模块匹配失败,则不会对后面模块再执行匹配了。每个模块可以指定模块相关的参数。-j, --jump target
规则要执行的目标动作。可以是用户的自定义链、内置目标或扩展模块中的目标,执行结束会返回到当前链的下一条规则继续执行。-g, --goto chain
转到用户的自定义链中继续处理,用户自定义链执行完或RETURN时,不会回到当前链执行下一条规则,而是返回到使用-j调用到当前链之前的那个链。如果规则中不指定-j和-g,则数据包得到匹配后什么也不会做,只有规则的计数器会增加。[!] -i, --in-interface name
指定数据包流入的网卡名,只对INPUT,FORWARD和OUTPUT链有效,如果名称后面带个“+”号,则会匹配网卡名称中任何具有该前缀的网卡。如果不指定则匹配所有网卡。可选的感叹号为取反的意思。[!] -o, --out-interface name
解释同上面-i
参数。-c, --set-counters packets bytes
初始化规则的包和字节计数器,可以应用在规则的插入,添加和替换时。
规则速查
iptables [-t table] {-A|-C|-D} chain rule-specification
ip6tables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
扩展模块
除了使用一些如根据协议,源/目的之地址等对数据包进行匹配的功能,以及基本的ACCEPT,DROP和RETURN匹配之后执行的目标动作。还可以通过使用扩展模块提供的功能可以帮助我们定制出更强大的过滤功能。下面是扩展模块链接,扩展分为匹配扩展和目标扩展,可参考链接中的具体模块进行测试。
语法:
ip6tables [-m name [module-options...]] [-j target-name [target-options...]
iptables [-m name [module-options...]] [-j target-name [target-options...]
https://ipset.netfilter.org/iptables-extensions.man.html
kubernetes使用
addrtype 地址类型匹配
MASQUERADE 地址转换
CONNMARK/connmark 标记链接
recent,probably,mark
命令示例
清空规则
iptables -F
或
iptables --flush
设置默认策略
默认策略是允许,将下列三个链默认策略设置为DROP。
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
这需要我们额外指定运行的规则,只允许特定的数据包经过。
特定的ip或网段
iptables -A INPUT -s x.x.x.x -j DROP
iptables -A INPUT -s ! x.x.x.0/24 -j DROP
”!“是取反的意思。还可以针对特定的协议和网络接口:
iptables -A INPUT -i eth0 -s x.x.x.x -j DROP
iptables -A INPUT -i eth0 -p tcp -s ! x.x.x.0/24 -j DROP
允许eth0接口的ssh服务
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
只针对特定网段开放ssh服务
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
放行http和https
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
参考
https://jcf94.com/2016/08/30/2016-08-30-iptables/
https://en.wikipedia.org/wiki/Iptables
https://linux.die.net/man/8/iptables
https://lwn.net/Articles/267140/
https://unix.stackexchange.com/questions/189905/how-iptables-tables-and-chains-are-traversed
https://rlworkman.net/howtos/iptables/chunkyhtml/c962.html