共计 3248 个字符,预计需要花费 9 分钟才能阅读完成。
背景
上文介绍了,如何使用 socat 实现四层转发。但是 socat 并不支持端口段的转发,这种情况 iptables 可以很好的实现。
iptables 不仅支持源端口段,还能支持目的端口段,下文进行介绍
实操
对于CentOS 7 和 Ubuntu 20.04,配置的方式会有出入。
谨记,现如今云服务器使用居多,一般通过安全组进行了防火墙的控制,而iptables默认是未启动的。
这种情况下启动前先加好放行流量的规则,默认是不放行的。
CentOS 7
前置准备
- 关闭 firewall
systemctl stop firewalld systemctl disable firewalld
- 安装 iptables-service,若无法安装请自行配置软件源,例如阿里源
yum install iptables-services
- 添加放行规则
iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT
- 固化到配置文件,以便在系统重启后自动加载规则
iptables-save > /etc/sysconfig/iptables systemctl enable iptables
- 启动 iptables
systemctl start iptables
- 查看当前规则
# iptables L -n Bad argument `L' Try `iptables -h' or 'iptables --help' for more information. [root@123 ~] # iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination
- 配置内核参数,编辑
/etc/sysctl.conf
文件并设置net.ipv4.ip_forward
的值为 1后,执行命令sysctl -p
如果机器上之前已经安装过 iptables,并且已有规则,请酌情添加放行规则,避免造成安全问题。
配置端口转发
iptables 的端口转发是运行在 nat
表上。
在 nat
表中,主要用于网络地址转换(Network Address Translation,NAT)相关的规则。nat
表中包含了三个重要的链:PREROUTING
、POSTROUTING
和 OUTPUT
。
-
PREROUTING
链:在数据包进入路由之前应用规则,用于修改目标 IP 地址和端口。在这个链中,可以实现端口转发和目标地址转换等功能。 -
POSTROUTING
链:在数据包离开路由之前应用规则,用于修改源 IP 地址和端口。在这个链中,可以实现源地址转换和网络地址转换等功能。 -
OUTPUT
链:用于处理本地生成的数据包,即数据包的源 IP 地址是本地主机的 IP 地址。
现在的场景主要使用到 PREROUTING
、POSTROUTING
。
场景1:将本地的 50001~51000 端口,转发到本地的 59999 端口
iptables -t nat -A PREROUTING -p tcp --dport 50001:51000-j REDIRECT --to-ports 59999
场景2:将本地的10000 ~ 30000端口,转发到远端的 60000 ~ 61000 端口。本地网卡IP为:192.168.2.1,远端IP为:1.1.1.1
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10000:30000 -j DNAT --to-destination 1.1.1.1:60000-61000
iptables -t nat -A PREROUTING -p udp -m udp --dport 10000:30000 -j DNAT --to-destination 1.1.1.1:60000-61000
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p tcp -m tcp --dport 60000:61000 -j SNAT --to-source 192.168.1.1
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp -m udp --dport 60000:61000 -j SNAT --to-source 192.168.1.1
记得使用 iptables-save > /etc/sysconfig/iptables
固化规则。
查看规则:
iptables -t nat -L --numeric
删除规则:
格式:iptables -t [表] -D [链] [规则序号]
iptables -t nat -D PREROUTING 1
Ubuntu 20.04
Ubuntu 中,一般使用 ufw
进行防火墙的管理。ufw 操作系统一般内置,无需额外安装。
- 修改内核参数开启 ipv4 转发,编辑
/etc/sysctl.conf
文件并设置net.ipv4.ip_forward
的值为 1后,执行命令sysctl -p
- 添加 ufw 规则,先放行 22 端口
ufw allow 22
- 启动 ufw,会自动配置开机自启
ufw enable
- 查看 ufw 状态
ufw status
ufw 是一种简化版的防火墙管理工具,如果想对 nat 表 做操作,不能直接使用命令添加规则,而是需要编辑配置文件
场景1:将本地的10000 ~ 30000端口,转发到远端的 60000 ~ 61000 端口。本地网卡IP为:192.168.2.1,远端IP为:1.1.1.1
- 编辑配置文件添加规则,防止在独立的块中,例如加在文件内容最上方
# vim /etc/ufw/before.rules *nat :PREROUTING ACCEPT [0:0] -A PREROUTING -p tcp -m tcp --dport 10000:30000 -j DNAT --to-destination 1.1.1.1:60000-61000 -A PREROUTING -p udp -m udp --dport 10000:30000 -j DNAT --to-destination 1.1.1.1:60000-61000 -A POSTROUTING -d 1.1.1.1 -p tcp -m tcp --dport 60000:61000 -j SNAT --to-source 192.168.1.1 -A POSTROUTING -d 1.1.1.1 -p udp -m udp --dport 60000:61000 -j SNAT --to-source 192.168.1.1 COMMIT
- 重载 ufw
ufw reload
需要注意的是,每次执行 ufw reload 后,刚才添加的 nat 规则都会被重复的加载,首次reload 是4条,再次reload是8条,以此类推。
所以在执行重复 reload 前,先执行 iptables -F -t nat
清理现有规则。(生产环境请勿如此操作,请单条进行删除)
总结
iptables 对比 socat,优势在于支持端口段的转发。
劣势在于配置较为复杂,且 iptables 作为防火墙,转发并不是它的主要目的。
机器如果是k8节点,维护 iptables 进行转发,相关依赖将更难处理和维护,不熟悉的话可能会影响到现有的环境。