我有一台计算机 (A),它向 Web 服务发出请求。它没有通过有线方式连接到路由器,但它与另一台计算机 (B) 位于同一 LAN 上,该计算机具有 2 个网络接口(一个连接到 LAN 172.25.0.0/23 (enp27s0),另一个连接到路由器 192.168.255.0/24 (enp29s0))。
如果我从计算机 B 发出请求(我在计算机 B 中添加了一条路由),那么我能够连接并接收响应,但如果我从计算机 A 发出请求,则无法连接并接收响应。
我有这样的配置:
- 计算机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
- 计算机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 了。然而,并非所有所谓的“路由器”都能做到这一点。