iptables

iptables,第1张

iptables iptables netfilter

iptables的底层实现是netfilter。netfilter是linux 内核2.4版引入的一个子系统,最初是由Linux内核防火墙和网络维护者Rusty Russell提出。netfilter的架构就是在整个网络流程的若干位置放置一些钩子,并在每个钩子上挂载一些处理函数进行处理。
IP层的5个钩子点的位置,对应iptables就是5条内置链,分别是***PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD***。
netfilter的原理图如下图所示:

路由决策:例如,决定从机器的哪块儿网卡出去,下一跳地址是多少等。

iptables 的三板斧:table, chain和rule

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的常规武器 命令说明iptables - L -n输出的是iptables的filter表的所有规则。默认是filter表中的规则iptables -t nat - L -n输出的是iptables的nat表的所有规则iptables --policy INPUT DROP默认的不让进iptables --policy FORWARD DROP默认的不允许转发iptables --policy OUTPUT ACCEPT默认的可以出去

配置防火墙策略

# 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
``

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5720290.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存