iptables转发tcp/udp端口请求

前言

路由转发是计算机网络中的一种重要概念,特别是在网络设备和系统之间。它涉及到如何处理和传递数据包,以及决定数据包应该发送到哪个网络设备或路由表中的哪条路径,iptables是本文主要应用的软件技术。

本文主要介绍以下几个情况的配置:

  1. 本机端口转发到本机其它端口
  2. 本机端口转发到其它机器

本文所描述技术可以应用的几种场景:

  1. 本地服务器搭建samba共享文件夹,挂载到云服务器
  2. 本地服务器搭建gitlab服务器,挂载到云服务器
  3. 本地搭建的其它服务器挂载到云服务指定端口

一、路由转发涉及点

路由转发涉及到以下几个方面:

  • 路由表:这是网络中用于确定数据包应该发送到哪个物理网络或下一个路由器的表。路由表通常包含有关到达不同网络的目标地址的信息,例如下一跳路由器、路径权重等。
  • 数据包转发:当一个路由器收到一个数据包时,它会根据其路由表确定如何将该数据包发送到下一个路由器或目标网络。这可以通过直接将数据包发送到下一个路由器或通过另一个路由器(即链路)转发来实现。
  • 数据包过滤:路由器通常还具有过滤机制,用于确定哪些数据包应该被转发到下一个路由器,哪些应该被丢弃或被拒绝。这可能涉及到诸如防火墙规则、病毒防护或访问控制列表等安全功能。
    路由转发的过程通常由路由器硬件和软件协同完成,并且受到网络拓扑、路由协议(如静态路由、动态路由等)以及网络流量等因素的影响。

路由转发是计算机网络中网络设备之间传递数据包的关键过程,它涉及到如何确定数据包的下一跳位置以及如何处理和传递数据包以到达最终目的地。

二、转发如何配置

测试网站:

docker run --rm --name web1 --publish 8080:8080 nigelpoulton/web

修改/etc/sysctl.conf文件,让包转发功能在系统启动时自动生效:

# 启动当前设备的包转发功能,增加下边这句
net.ipv4.ip_forward = 1

使用sudo sysctl -p应用修改

【让云服务器更灵活】iptables转发tcp/udp端口请求-LMLPHP

本机端口转发到本机其它端口

将网内其它设备访问本IP的 9000 端口转发到 8080端口,同网段内其它设备可以通过9000端口访问服务。

$ sudo iptables -t nat -A PREROUTING -p tcp --dport 9000 -j REDIRECT --to-port 8080

$ curl 192.168.1.66:9000
# Out put
<html><head><title>Docker Rocks</title><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"/></head><body><div class="container"><div class="jumbotron"><h1>Hello Docker learners!!!</h1><p>Be careful. The last time I updated the packages in this app was April 2020.</p><p> </p></div></div></body></html>

将本机访问本机的 9000 端口转发到 8080端口,本机可以通过 9000端口访问服务。

sudo iptables -t nat -A OUTPUT -p tcp --dport 9000 -j REDIRECT --to-port 8080

curl 192.168.1.66:9000
# Out put
<html><head><title>Docker Rocks</title><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"/></head><body><div class="container"><div class="jumbotron"><h1>Hello Docker learners!!!</h1><p>Be careful. The last time I updated the packages in this app was April 2020.</p><p> </p></div></div></body></html>

【让云服务器更灵活】iptables转发tcp/udp端口请求-LMLPHP

修改后的路由表如下:

$ sudo iptables -t nat -nL --line
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL
2    REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9000 redir ports 8080

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL
2    REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9000 redir ports 8080

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
2    MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:8080

Chain DOCKER (2 references)
num  target     prot opt source               destination         
1    RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
2    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.17.0.2:8080

本机端口转发到其它机器

将网内其它设备访问本IP的 9000 端口转发到另一台机器的 8080端口,同网段内其它设备可以通过9000端口访问服务。

$ sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.66:8080
$ sudo iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.66 --dport 8080 -j SNAT --to-source 192.168.1.85

# 如果配置上述两个后还是上不了网,请检查filter FORWARD表
$ sudo iptables -nvL
# Out put,这里可以看到默认配置是丢弃
Chain FORWARD (policy DROP 813 packets, 42988 bytes)

# 修改对应网卡为接受
$ ip a
# Out put, 这里看到对应网卡为enp1s0
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether ec:d6:8a:fa:c2:91 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.85/24 brd 192.168.1.255 scope global dynamic noprefixroute enp1s0
       valid_lft 65632sec preferred_lft 65632sec

$ sudo iptables -A FORWARD -o enp1s0 -j ACCEPT

【让云服务器更灵活】iptables转发tcp/udp端口请求-LMLPHP

修改后的路由表如下:

$ sudo iptables -t nat -nL --line
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:192.168.1.66:8080

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    SNAT       tcp  --  0.0.0.0/0            192.168.1.66         tcp dpt:8080 to:192.168.1.85
$ sudo iptables -t filter -nvL --line
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy DROP 813 packets, 42988 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1       52  5506 ACCEPT     all  --  *      enp1s0  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination 

三、固化iptables

这里只记录一种比较简单的方式,还有其它方式可以自行搜索。

$ sudo apt-get install iptables-persistent


/etc/iptables$ tree -f
# 打印输出,可以看到这里多了一个/etc/iptables的文件夹
.
├── ./rules.v4
└── ./rules.v6

如果需要更新调用下边的命令:

# 保存ipv4路由信息
$ sudo iptables-save -f /etc/iptables/rules.v4

# 保存ipv6路由信息
$ sudo ip6tables-save -f /etc/iptables/rules.v6

如果需要重启恢复初始路由或卸载,使用下边命令:

$ sudo apt-get remove iptables-persistent
$ sudo rm -rf /etc/iptables/

总结

如果是云服务器,对应上述情况建立ip转发即可,例如samba转发tcp 445 139端口,udp 137 138端口,通过iptables -p参数切换udp/tcp。


12-22 09:59