iptables的“4表5链”-NAT功能

一、背景

        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 链的规则会对转发的数据包进行过滤。
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表即可,如果实在遇到复杂的需求,再查找相关资料进行满足即可。一般情况下的需求也用不到那么多表的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Rocky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值