通过计算机转发 TCP 流量

通过计算机转发 TCP 流量

我有一台计算机 (A),它向 Web 服务发出请求。它没有通过有线方式连接到路由器,但它与另一台计算机 (B) 位于同一 LAN 上,该计算机具有 2 个网络接口(一个连接到 LAN 172.25.0.0/23 (enp27s0),另一个连接到路由器 192.168.255.0/24 (enp29s0))。

如果我从计算机 B 发出请求(我在计算机 B 中添加了一条路由),那么我能够连接并接收响应,但如果我从计算机 A 发出请求,则无法连接并接收响应。

我有这样的配置:

  1. 计算机A:

default via 172.25.0.1 dev ens192 proto static metric 100 172.25.0.0/23 dev ens192 proto kernel scope link src 172.25.1.24 metric 100 217.xxx.yyy.0/24 via 172.25.1.14 dev ens192

  1. 计算机B:

default via 172.25.0.1 dev enp27s0 proto static metric 100 default via 192.168.255.2 dev enp29s0 proto static metric 101 172.25.0.0/23 dev enp27s0 proto kernel scope link src 172.25.1.14 metric 100 192.168.255.0/24 dev enp29s0 proto kernel scope link src 192.168.255.14 metric 100 217.xxx.yyy.0/24 via 192.168.255.2 dev enp29s0 proto static metric 99

在计算机 B 上,我尝试插入此 iptables 配置,并且计算机已启用 ipv4 转发:

iptables -A FORWARD -i enp27s0 -o enp29s0 -p tcp --syn --dport 8080 -m conntrack --ctstate NEW -j ACCEPT iptables -A FORWARD -i enp27s0 -o enp29s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i enp29s0 -o enp27s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -t nat -A PREROUTING -i enp27s0 -p tcp --dport 8080 -j DNAT --to-destination 217.124.156.199 iptables -t nat -A POSTROUTING -o enp29s0 -p tcp --dport 8080 -d 172.25.1.24 -j SNAT --to-source 172.25.1.14 root@joaquin2:~# iptables -A PREROUTING -t nat -i enp27s0 -p tcp --dport 8080 -j DNAT --to-destination 172.25.1.14:8080 iptables -A FORWARD -p tcp -d 172.25.1.14 --dport 8080 -j ACCEPT iptables -A POSTROUTING -t nat -s 172.25.1.14 -o enp27s0 -j MASQUERADE

如果我在计算机 A 上执行 traceroute 命令,得到的结果如下:

traceroute webservice.example.com traceroute to webservice.example.com (217.xxx.yyy.199), 30 hops max, 60 byte packets 1 172.25.1.14 (172.25.1.14) 0.309 ms 0.231 ms 0.200 ms 2 * * * 3 * * * 4 * * * 5 * * * 6 * * *

但我无法收到回复。请求似乎在计算机 B 上停止了。

为了澄清起见,我附上了一张图片:

详细图表

详细图表

在两台计算机上,我都有 Debian 9 Linux。

答案1

你的设置几乎应该可以工作,除了:

  • 防火墙规则中只有一半适用于你的情况,另一半则无法满足要求,
  • 您所做的就是设置一种从机器 B 的端口 8080 到特定 Web 服务的反向代理。如果您在浏览器中打开 Web 服务,它应该可以工作,但 ping 和 traceroute 肯定不行,因为 SNAT 规则不涵盖 ICMP 协议。
  • 主机 B 上有两个默认路由。这可能应该更正。如果您以前/etc/network/interfaces配置过网络,则应删除gateway接口选项enp27s0

我建议使用更简单、更容易掌握的配置。基本上,您要将计算机 B 配置为网关,因此刷新防火墙链并重新开始:

iptables -t filter -F; iptables -t nat -F

你需要:

  • 在机器B上激活路由(默认情况下可能是活动的):

    sysctl net.ipv4.ip_forward=1
    
  • 允许所有流量通过机器并在enp29s0接口上设置源 NAT:

    iptables -P FORWARD ACCEPT
    iptables -t nat -A POSTROUTING -o enp29s0 -s 172.25.0.0/23 -j SNAT --to-source 192.168.255.14
    
  • 您可以使用以下命令检查防火墙配置的正确性:

    iptables -nvL
    iptables -t nat -nvL
    


    并且对于从主机 A发送的每个数据包,匹配的数据包数量都会增加。

为了使其在重启后永久生效,请添加:

net.ipv4.ip_forward=1

/etc/sysctl.conf和:

post-up /usr/sbin/iptables-restore /etc/iptables.conf
pre-down /usr/sbin/iptables-save -f /etc/iptables.conf

enp29s0中的接口配置/etc/network/interfaces

附言:当然,最简单的配置是在路由器上为具有172.25.0.0/23下一跳的网络添加静态路由192.168.255.14,这样就不需要 SNAT 了。然而,并非所有所谓的“路由器”都能做到这一点。

相关内容