iptables的学习与使用
IPTABES的状态机制
- ESTABLISHED
在连接建立后(三次握手完成),远程主机于本地主机的通信状态
2.INVALID
不能被识别属于哪个链接或没有任何状态。通常会丢弃
3.NEW
本地主机向远程主机发起一个连接请求,这个数据包状态为new。
4.RELATED
和现有联接相关的新数据包。如FTP服务用21传送命令,其他端口传数据.其他端口的状态就是RELATED。
IPTALBES的数据流向
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端