一、背景
iptables的“4表5链”吓退了多少曾经的少年,包括以前的自己,哈哈😆。这玩意真的要玩得很6,确实要记的东西比较多,也很杂。但是最近重新温故而知新,发现好像掌握基本常见的使用也不是那么复杂,和大家分享下常见filter和nat表的使用,和常见掌握的操作。
iptables 是 Linux 系统中用于配置防火墙规则的工具,它借助内核中的 netfilter 框架来实现对网络数据包的过滤、网络地址转换(NAT)以及数据包处理等功能。
二、4表5链
1、5链代表5个处理数据包的时机(hook钩子)
1. PREROUTING 链
- 位置:数据包刚进入防火墙,还未进行路由判断时就会进入该链。
- 功能:主要用于目的地址转换(DNAT)和修改数据包的目的地址。常见应用场景是端口转发,即把外部对特定 IP 和端口的访问转发到内部网络的其他主机和端口上。此外,
mangle
表和raw
表也会在这个阶段对数据包进行相应处理,比如修改数据包的 IP 首部信息或者决定是否进行状态跟踪。
2. INPUT 链
- 位置:当数据包经过路由判断,确定是要进入本地主机时,就会进入该链。
- 功能:对进入本地主机的数据包进行过滤,决定是否允许这些数据包进入本地主机。这是保障本地主机安全的重要防线,可以根据源 IP 地址、端口、协议等条件来制定过滤规则,阻止恶意攻击和非法访问。
3. FORWARD 链
- 位置:当数据包经过路由判断,确定该数据包不是要进入本地主机,而是要经过本地主机转发到其他主机时,会进入此链。
- 功能:对经过本地主机转发的数据包进行过滤,只有通过
FORWARD
链规则检查的数据包才会被转发出去。这个链常用于路由器或者网关设备,确保转发的数据包符合安全策略。
4. OUTPUT 链
- 位置:当本地主机产生要发送出去的数据包时,数据包会先进入该链。
- 功能:对本地主机发出的数据包进行过滤和处理,决定是否允许这些数据包从本地主机发出。可以根据目的 IP 地址、端口、协议等条件来制定规则,防止本地主机向外发送非法或者不安全的数据包。
5. POSTROUTING 链
- 位置:数据包即将离开防火墙之前会进入该链。
- 功能:主要用于源地址转换(SNAT)和修改数据包的源地址。常见的应用场景是让内部网络的主机共享一个公共 IP 地址访问外部网络,即把内部主机的私有 IP 地址转换为公共 IP 地址。
6.数据包流经链的流程
不同流向的数据包流经链的顺序有所不同:
- 进入本地主机的数据包:
PREROUTING
->INPUT
。 - 经过本地主机转发的数据包:
PREROUTING
->FORWARD
->POSTROUTING
。 - 从本地主机发出的数据包:
OUTPUT
->POSTROUTING
。
2、4表代表4个功能[重点掌握filter表、nat表]
1. filter 表
- 功能:这是使用最频繁的表,主要用于对数据包进行过滤操作。它能决定是否允许数据包进入系统、从系统发出或者在系统中进行转发。
- 常用链:
- INPUT 链:处理进入本地主机的数据包。例如,若要阻止外部主机对本地主机的 SSH 暴力破解,可在
INPUT
链添加规则,限制短时间内同一 IP 地址的 SSH 连接次数。 - OUTPUT 链:处理本地主机发出的数据包。比如,可在
OUTPUT
链设置规则,禁止本地主机访问某些不良网站。 - FORWARD 链:处理经过本地主机转发的数据包。当本地主机作为路由器时,
FORWARD
链的规则会对转发的数据包进行过滤。
- INPUT 链:处理进入本地主机的数据包。例如,若要阻止外部主机对本地主机的 SSH 暴力破解,可在
2. nat 表
- 功能:主要用于网络地址转换(NAT),包括源地址转换(SNAT)和目的地址转换(DNAT)。源地址转换常用于让内部网络的主机通过一个公共 IP 地址访问外部网络;目的地址转换常用于将外部网络的请求转发到内部网络的特定主机。
- 常用链:
- PREROUTING 链:在数据包进入防火墙后,对其目的地址进行转换之前进行处理。常用于端口转发,如将外部对服务器 80 端口的访问转发到内部服务器的 8080 端口。
- POSTROUTING 链:在数据包离开防火墙之前,对其源地址进行转换之后进行处理。常用于让内部网络主机共享一个公共 IP 地址访问外部网络。
- OUTPUT 链:处理本地主机发出的数据包的地址转换。
3. mangle 表
- 功能:用于修改数据包的 IP 首部信息,如修改 TTL(生存时间)、TOS(服务类型)等。通过修改这些信息,可以对数据包的传输特性进行调整。
- 常用链:
- PREROUTING 链:在数据包进入防火墙后,对其进行 IP 首部修改。
- INPUT 链:处理进入本地主机的数据包的 IP 首部修改。
- FORWARD 链:处理经过本地主机转发的数据包的 IP 首部修改。
- OUTPUT 链:处理本地主机发出的数据包的 IP 首部修改。
- POSTROUTING 链:在数据包离开防火墙之前,对其进行 IP 首部修改。
4. raw 表
- 功能:主要用于决定数据包是否进行状态跟踪。状态跟踪会消耗系统资源,对于一些不需要状态跟踪的数据包,可以使用
raw
表来跳过状态跟踪,从而提高系统性能。 - 常用链:
- PREROUTING 链:在数据包进入防火墙后,决定是否对其进行状态跟踪。
- OUTPUT 链:处理本地主机发出的数据包,决定是否对其进行状态跟踪。
三、实操部分
1、filter表查看、新增规则
1、允许源192.168.1.1地址来访问本机的9090 TCP端口
iptables -t filter -I INPUT -s 192.168.1.1 --dport 9090 -j ACCEPT
-t filter 指定是filter表
-I INPUT insert插入第一条 INPUT链, -D 删除, -R 替换
-s 192.168.1.1 源IP地址
--dport 9090 目标端口
-j --jump ACCEPT、DROP、REJECT 三个动作,允许、丢弃、拒绝
2、查看iptables表的信息
iptables -t filter/nat -L -n -v
3、清空iptables表, 所有链规则信息
iptables -t filter/nat -F
4、--line-numbers 查看规则的索引序号, 根据序号可以删除、替换等
iptables -t filter -L -n -v --line-numbers
2、nat表创建SNAT、DNAT
需要开启Linux的ip数据包转发功能:
1、永久开启
/etc/sysctl.conf => net.ipv4.ip_forward = 1
执行sysctl -p
2、临时开启
echo 1 > /proc/sys/net/ipv4/ip_forward
实现网络拓扑图如下:
192.168.2.104访问192.168. 2.116:9090 就会将数据包修改,转发到192.168.2.117:9090, 并且做了SNAT, 查看192.168.2.117的nginx访问日志,客户端IP是192.168.2.116而不是192.168.2.104
1、SNAT 源地址转换
iptables -t nat -A POSTROUTING -d 192.168.2.117 -p tcp --dport 8080 -j SNAT --to-source 192.168.2.116
2、DNAT 目标地址转换
iptables -t nat -I PREROUTING -d 192.168.2.116 -p tcp --dport 9090 -j DNAT --to-destination 192.168.2.117:8080
3、默认FORWARD无规则也是不转发数据包
为了安全考虑,就算你查看iptables的FORWARD也是空的,但是配置了SNAT、DNAT不起作用,就是数据包没有被转发出去。 还需要添加FORWARD规则:
iptables -A FORWARD -p tcp -j ACCEPT #允许tcp协议数据包转发
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT #进一步限定转发规则
3、实际测试查看
客户端访问情况,正常访问:
查看192.168.2.117 nginx日志,查看客户端ip是192.168.2.116而不是192.168.2.104:
查看192.168.2.116并没有9090在监听,此时192.168.2.116就是一个“路由器”设备,只是这个路由器设备是Linux服务器而已。 LVS的原理也是如此,相对路由器设备而言,此时的Linux服务器就是一个“智能路由器”!!!
查看192.168.2.116的iptables规则:
四、总结
iptables掌握基本的filter表、nat表即可,如果实在遇到复杂的需求,再查找相关资料进行满足即可。一般情况下的需求也用不到那么多表的操作。