iptables的学习与使用

IPTABES的状态机制

  1. ESTABLISHED

在连接建立后(三次握手完成),远程主机于本地主机的通信状态

​ 2.INVALID

不能被识别属于哪个链接或没有任何状态。通常会丢弃

​ 3.NEW

本地主机向远程主机发起一个连接请求,这个数据包状态为new。

​ 4.RELATED

和现有联接相关的新数据包。如FTP服务用21传送命令,其他端口传数据.其他端口的状态就是RELATED。

IPTALBES的数据流向

graph LR A[流入的数据包]-->B{PREROUTING} B-->|Forward|E{POSTROUTING} B-->D[INPUT] D-->F[内部处理] F-->G[OUTPUT] G-->E E-->H[流出的数据包]

IPTALBES的三张表

filter

默认的表,包含真正的防火墙规则。内建的规则链包括:INPUT,OUTPUT,FORWARD

nat

表包含源地址,目的地址,端口转换使用的规则。内建的规则链包括:PREROUTING,OUTPUT,POSTROUTING.

mangle

manage表包含用于设置特殊的数据包路由标志的规则,这些标志随后被filter表中的规则检查。内建的规则连包括:PREROUTING,INPUT,FORWARD,POSTROUTING,OUTPUT.

IPTABLES的五条规则链

INPUT

当一个数据包由内核中的路由计算确定为发送给本地后,他会通过INPUT的检查。

OUTPUT

保留给系统自身生产的数据包

FORWARD

经过Linux系统路由的数据包。即当iptables防火墙用于连接两个网络时,两个网络的数据包必须流经该防火墙。

PREROUTING

用于修改目的地址(DNAT)

POSTROUTING

用于修改源地址(SNAT)

iptables [-t 表名] <-A I D R >链名 规则编号 [-i | o 网卡名称] [-p 协议类型] [-s 源IP|源子网] [--sport 源端口] [ -d 目标 地址|子网] [--dport 目标端口] <-j 动作>

动作有

ACCEPT
DROP
REDIRECT

将数据包重新转向到本机或另一台主机的某一个端口,通常实现透明代理或对外开放内网的某些服务。

REJECT

拦截数据包并发回封包通知对方

SNAT

修改包的源IP地址为某指定IP,故不适用于DHCP环境。

DNAT
MASQUERADE

特殊的SNAT,能用于DHCP模式IP的伪装,若IP为静态,则使用SNAT。

LOG

将符合规则的数据包记录在日志中,供以后分析。

命令举例

iptables -A INPUT -m state --state NEW -j DROP

这条命令将所有主动向本机发起的链接丢弃,亦即不允许其他机器发送往本机的链接。

iptables -A INPUT -m state  --state ESTABLISHED,RELATED -j ACCEPT

允许所有已经建立的链接,或与之相关的数据通过。

iptables -F
iptables -X
iptables -Z
iptables -F -t NAT
iptables -X -t NAT
iptables -Z -t NAT
iptables -x -t mangle

清空防火墙规则

iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20/sec --limit-burst 200 -j ACCEPT

限制防火墙SYN和SYN ACK每秒只能200个。防止端口扫描。

iptables -L -n --line-number 
iptables -t nat -D PREROUTING   2


删除某策略

IPTABLES是用户态的agent,本身工作的是内核态的NetFilter。

表是特定链规则的集合,每个链可对应多个表,多个表是由优先级的。raw>mangle>nat>filter.

表与链对应关系

PREROUTEING FORWARD POSTROUTING INPUT OUTPUT
raw
manage
nat ✔(Centos7有6无)
filter

实验解释何谓基于状态得防火墙及NEW和EST两种状态。

当iptables中只有NEW得进入策略,没有EST策略时,telnet是可以通端口得。且服务端会处于SYN_RECV状态,因为其发出SYN+ACK后,再也收不到后面得包了。此时Clinet发送给Server得包已经是ESTABLISHED状态。若Server上有基于EST状态得规则,此时链接可建立.

关于SNAT和DNAT


如图,要求内网主机192.168.1.10通过公网1.1.1.1访问内网服务192.168.1.2,此时需要在路由做两条NAT策略。
首先是prerouting的DNAT,把192.168.1.10→1.1.1.1变成192.168.1.10→192.168.1.2
其次是postrouting的SNAT,把已经DNAT过的192.168.1.10→192.168.1.2变成1.1.1.1→192.168.1.2
参考 https://www.cnblogs.com/dream397/p/14522392.html

iptables的debug案例

在k8s中某pod上搭建VPN,用于打通k8s的overlay网络和主机同网段服务器。可以正常访问overlay网络但是无法访问同网段主机。

使用LOG模块在任意位置打印报文信息

#在/etc/rsyslog.conf添加
kern.=debug     /var/log/kern.debug.log
touch /var/log/kern.debug.log
systemctl restart rsyslog

overlay网络走的是路由,主机网络走的是nat,判断是nat表出现问题。添加如下两条策略

iptables -t nat -A PREROUTING -p icmp  -m limit --limit 500/minute -j LOG --log-level 7 --log-prefix "nat prerouting: "
iptables -t nat -A POSTROUTING -p icmp  -m limit --limit 500/minute -j LOG --log-level 7 --log-prefix "nat postrouting: "


对比上面数据流向图,判断在forward链出现问题。查看forward链默认策略是DROP,修改为ACCEPT后正常,
iptables -P FORWARD ACCEPT
能ping通了,但是log里面还是看不到对应postrouting策略。

使用如下命令,将log的规则添加到 postrouting链的第一位
iptables -t nat -I POSTROUTING 1 -p icmp -m limit --limit 500/minute -j LOG --log-level 7 --log-prefix "nat -I postrouting: "
ICMP协议不会出现再linux的conntrack表中,ICMP几乎总是会把“引起问题的原始数据包”作为ICMP的载荷附着在数据当中,如果是一个TCP数据段由于TTL到期引发了ICMP,那么content就是这个TCP数据段本身。conntrack解析这个,就知道该怎么转换IP地址了。

参考 https://www.lijiaocn.com/%E6%8A%80%E5%B7%A7/2018/06/15/debug-linux-network.html

posted on 2022-03-16 18:35  yangras  阅读(162)  评论(0编辑  收藏  举报

导航