iptables的底层实现是netfilter。netfilter是linux 内核2.4版引入的一个子系统,最初是由Linux内核防火墙和网络维护者Rusty Russell提出。netfilter的架构就是在整个网络流程的若干位置放置一些钩子,并在每个钩子上挂载一些处理函数进行处理。
IP层的5个钩子点的位置,对应iptables就是5条内置链,分别是***PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD***。
netfilter的原理图如下图所示:
路由决策:例如,决定从机器的哪块儿网卡出去,下一跳地址是多少等。
iptables:5X5,即5张表(table)和5条链(chain)。5条链即iptables的5条内置链,对应上述图中的netfilter的5个钩子。
5条链分别是:
INPUT链:一般用于处理输入本地进程的输入数据包OUTPUT链:一般用于处理输入本地进程的输出数据包FORWARD链:一般用于处理转发到其他机器/network namespace的数据包。PREROUTING链:可以在此进行DNATPOSTROUTING链:可以在此进行SNAT
除了上述系统预定义的5条iptables链,用户还可以在表中定义自己的链。
5张表:filter表: 用于控制到达某条链上的数据包是继续放行(accept),直接丢弃(drop)或者拒绝(reject)。nat表: 用于修改数据包的源和目的地址。mangle表: 用于修改数据包的IP头信息。raw表: iptables是有状态的,即iptables对数据包有连接追踪(connection tracking)机制,而raw是用来去除这种追踪机制的。security: 用于在数据包上应用SELinux。security表是新加入的特性。
iptables表的优先级:
注意: iptables不支持用户自定义表
iptables的工作原理:
一个网络包经过iptables的处理路径如下图所示:
其实,iptables的表是用来分类管理iptables的规则(rule)的,系统所有的iptables都被划分到不同的表集合上。*iptables的规则是用户真正要书写的规则。*一般情况下,一条iptable规则=匹配条件+动作。
匹配条件:即匹配数据包背这条iptables规则“捕获”的条件,例如协议类型、源IP、目的IP、源端口、目的端口、连接状态等。每条iptables规则允许多个匹配条件任意组合,从而实现多条件的匹配,多条件之间是逻辑与(&&)的关系。动作:数据包匹配后,常见的动作有以下几个
DROP:直接将数据包丢弃,不用进行后续的处理。应用场景是不让某个数据源意识到你的系统的存在,可以用来模拟宕机;
REJECT:给客户端返回一个connection refused猴子destination unreachable报文。应用场景是不让某个数据源访问你的系统,善意的告诉他:我这里没有你要的服务内容。
QUEUE:将数据包放入用户空间的队列,供用户空间的程序处理;
RETURN:跳出当前链,该链里后续的规则不再执行。
ACCEPT:同意数据包通过,继续执行后续的规则;
JUMP:跳转到其他用户自定义的链继续执行。iptables的常规武器
配置防火墙策略
# 1)配置允许SSH连接 iptables -A INPUT -s 10.20.30.40/24 -p tcp --dport 22 -j ACCEPT # 2) 阻止来自某个IP网段的所有连接 iptables -A INPUT -s 10.10.10.10 -j DROP # 也可以使用-j REJECT,这样就会发出一个连接拒绝的回程报文,客户端收到后立刻结束。 -j DROP不返回任何相应,客户端只能一直等待直到请求超时。如果要“闭关锁国”,即屏蔽所有的外来包,则可以使用-s 0.0.0.0/0 # 3)封锁端口 # 要阻止从本地1234短裤建立对外连接,可以使用以下命令: iptables -A OUTPUT -p tcp --dport 1234 -j DROP !!!注意:规则挂在OUTPUT链上是因为我们的需求是屏蔽本地进程对外的连接。如果我们要阻止外部连接访问本地1234端口,就需要在INPUT链上挂规则,命令如下: iptables -A INPUT -p tcp --dport 1234 -j DROP # 4) 端口转发 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 # 5) 禁用PING, # 大部分公有云默认都是屏蔽ICMP的,即禁止ping报文。 iptables -A INPUT -p icmp -j DROP !!!以上命令的-p icmp -j DROP即表示匹配ICMP报文,然后丢弃。 # 6)删除规则 # 暴力清除当前所有的规则命令(!!!慎用!!!) iptables -F # 清空特定的表可以使用-t参数进行指定,eg: iptables -t nat -F # 删除规则的最直接的需求是解封某条防火墙策略。建议使用iptables的 -D参数: iptables -D INPUT -s 10.10.10.10 -j DROP !!! -D 表示从链中删除一条或者多条指定的规则,后面跟的就是要删除的规则。 # 当某条链上的规则被全部清空变成空链后,可以使用-X参数删除: iptables -X FOO # 删除FOO这条用户自定义的空链 !!! 注意:系统内置链无法删除。 # 7)自定义链 iptables -N BAR #在filter表(因为未指定表,默认是filter。可以使用-t 参数指定)创建了一条用户自定义的链BAR
DNAT
DNAT根据指定条件修改数据包的目标IP地址和目标端口。
# iptables做目的地址转换 iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destionation 10.20.30.40:8080 !!! 注意:当涉及转发的目的IP地址是外机时,**需要确保启用ip forward功能,即把linux当交换机用**,命令如下: echo 1 >/proc/sys/net/ipv4/ip_forward
SNAT网络地址欺骗
网络地址欺骗其实是SNAT的一种。SNAT根据指定条件修改数据包的源IP地址,即DNAT的逆 *** 作。与DNAT的限制类似,SNAT策略只能发生在nat表的POSTROUTING链,具体命令如下:
iptables -t nat -A POSTROUTING -s 192.168.1.2 -j SNAT --to-source 10.172.16.1
保存和恢复
# 永久保存iptables规则的改变 iptables-save # 如果需要重定向到一个文件 iptables-save > iptables.bak # 还原iptables_save 命令备份的iptables配置,原理就是逐条的执行文件里的iptables规则,如下所示: iptables-restore < iptables.bak
[root@cni-master01 ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination cali-INPUT all -- 0.0.0.0/0 0.0.0.0/0 KUBE-EXTERNAL-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 ctstate NEW KUBE-FIREWALL all -- 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP) target prot opt source destination cali-FORWARD all -- 0.0.0.0/0 0.0.0.0/0 KUBE-FORWARD all -- 0.0.0.0/0 0.0.0.0/0 KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 ctstate NEW KUBE-EXTERNAL-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 ctstate NEW DOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0 DOCKER-ISOLATION-STAGE-1 all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 mark match 0x10000/0x10000 MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x10000 ``
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)