端口转发之 iptables (三)

272次阅读
没有评论

共计 3248 个字符,预计需要花费 9 分钟才能阅读完成。

背景

上文介绍了,如何使用 socat 实现四层转发。但是 socat 并不支持端口段的转发,这种情况 iptables 可以很好的实现。

iptables 不仅支持源端口段,还能支持目的端口段,下文进行介绍

实操

对于CentOS 7 和 Ubuntu 20.04,配置的方式会有出入。

谨记,现如今云服务器使用居多,一般通过安全组进行了防火墙的控制,而iptables默认是未启动的。

这种情况下启动前先加好放行流量的规则,默认是不放行的。

CentOS 7

前置准备

  1. 关闭 firewall
    systemctl stop firewalld
    systemctl disable firewalld
    
  2. 安装 iptables-service,若无法安装请自行配置软件源,例如阿里源
    yum install iptables-services
    
  3. 添加放行规则
    iptables -P INPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -P OUTPUT ACCEPT
    
  4. 固化到配置文件,以便在系统重启后自动加载规则
    iptables-save > /etc/sysconfig/iptables
    systemctl enable iptables
    
  5. 启动 iptables
    systemctl start iptables
    
  6. 查看当前规则
    # 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
    
  7. 配置内核参数,编辑 /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 操作系统一般内置,无需额外安装。

  1. 修改内核参数开启 ipv4 转发,编辑 /etc/sysctl.conf​ 文件并设置 net.ipv4.ip_forward​ 的值为 1后,执行命令
    sysctl -p
    
  2. 添加 ufw 规则,先放行 22 端口
    ufw allow 22
    
  3. 启动 ufw,会自动配置开机自启
    ufw enable
    
  4. 查看 ufw 状态
    ufw status
    

ufw 是一种简化版的防火墙管理工具,如果想对 nat 表 做操作,不能直接使用命令添加规则,而是需要编辑配置文件

场景1:将本地的10000 ~ 30000端口,转发到远端的 60000 ~ 61000 端口。本地网卡IP为:192.168.2.1,远端IP为:1.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
    
  2. 重载 ufw
    ufw reload
    

需要注意的是,每次执行 ufw reload 后,刚才添加的 nat 规则都会被重复的加载,首次reload 是4条,再次reload是8条,以此类推。
所以在执行重复 reload 前,先执行 iptables -F -t nat​ 清理现有规则。(生产环境请勿如此操作,请单条进行删除)

总结

iptables 对比 socat,优势在于支持端口段的转发。

劣势在于配置较为复杂,且 iptables 作为防火墙,转发并不是它的主要目的。
机器如果是k8节点,维护 iptables 进行转发,相关依赖将更难处理和维护,不熟悉的话可能会影响到现有的环境。

正文完
 
pengyinwei
版权声明:本站原创文章,由 pengyinwei 2023-09-22发表,共计3248字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处:https://www.opshub.cn
评论(没有评论)