使用 Linux 和 IPTABLES 解决重叠子网问题!

网络工程 路由 linux
2021-07-16 08:01:42

我有两难;我有一个客户的应用程序服务器运行在 CentOS 5(最新)上。应用服务器配置了2个接口:

eth0 - connect to the client network with subnet 192.168.3.0/24
eth1 - connects to local subnet which hosts all the devices the application manages with subnet 192.168.1.0/24

问题是客户端有一个远程办公室,该办公室的子网与应用服务器内部网络(即 192.168.1.0/24)重叠,并且希望该子网中的用户可以访问应用服务器。这里有一些 ascii 艺术来帮助理解拓扑:

|--------------------------------------------|                |---------------------------------------------------|
|    Application Server Internal Network     |                |            Internal Client Network                |
|                                            |                |                                 Remote Network    |
|                       ----------------     |                |    ---------------            ------------------  |
|                       |              |     | 192.168.3.0/24 |    |    Client    |           |                |  |
|  192.168.1.0/24 <>--<>   App Server   <>------<>      <>-------<>   Controlled  |           | 192.168.1.0/24 |  |
|                   eth1|              |eth0 |                |  .1| Cisco Router |           |                |  |
|                     .1----------------.10  |                |    ----------------           ------------------  |
|--------------------------------------------|                |---------------------------------------------------|

我试图通过调用 Linux 路由器功能(iptables 以 DNAT、SNAT、NETMAP、ROUTE 等为目标)来解决这个问题,但我很难过。客户端尝试访问 192.168.3.10 以访问 Web 应用程序,但数据包永远不会返回,因为应用程序服务器将连接尝试视为来自本地连接的设备并继续对 MAC 地址进行 arp。我已经在我们的实验室中设置了一个测试环境,这就是当我尝试从客户端 PC 执行 ping 操作时 tcpdump 显示的内容:

tcpdump -n -l -i eth0 net 192.168.1.0/24
15:50:40.006196 IP 192.168.1.48.10689 > 192.168.3.10.10690: S 1413694241:1413694241(0) win - <mss 1460,nop,nop,timestamp 1413694241 0,nop,wscale 1>
15:50:41.002813 IP 192.168.1.48.10689 > 192.168.3.10.10690: S 1413694241:1413694241(0) win - <mss 1460,nop,nop,timestamp 1413694242 0,nop,wscale 1>

tcpdump -n -l -i eth1 net 192.168.1.0/24
15:50:40.008269 arp who-has 192.168.1.48 tell 192.168.3.10
15:50:41.003657 arp who-has 192.168.1.48 tell 192.168.3.10

我已经要求客户在他们的 Cisco 路由器上实施 NAT,他们已经开始变更批准流程。但是,他们的网络更改请求需要 3 周多的时间才能获得批准,因此他们希望这个问题可以在 Linux 端尽快解决;应用程序服务器不在他们的变更批准过程中,因为它是一个孤立的网络并在我们的直接控制之下!我们唯一不能做的就是更改应用服务器eth0接口上的IP地址!

干杯,好。

2个回答

我能够找到解决我的困境的方法。由于从重叠子网进入应用程序服务器的所有流量都流向端口 80(并且本地重叠子网上没有主机与端口 80 通信 - 很抱歉忽略了我上面问题中的那部分),我需要做的就是标记使用iptables将80端口的数据包发送出去,为远程重叠子网创建一个新的路由表,为新的路由表添加路由信息,最后对标记的数据包实施策略路由。

以下是我使用的命令:

iptables -t mangle -A OUTPUT -p tcp --sport 80 -d 192.168.1.0/24 -j MARK --set-mark 30
echo "200 overlap" >> /etc/iproute2/rt_tables
ip route add 192.168.1.0/24 via 192.168.3.1 table overlap
ip rule add fwmark 30 lookup overlap

这解决了这个问题,让 Linux 路由器真正可以完成的事情大开眼界!

干杯,好。

在 VirtualBox 中具有命名空间的一台 Archlinux i686 上进行了测试:

iptables 1.6.1-1
iproute2 4.11.0-1
linux 4.10.13-1

在您的应用服务器上执行以下操作,假设您的客户端 IP 从右侧为 192.168.1.100。

如果您的应用服务器位于 192.168.1.1:

ip ro add 192.168.1.100/32 via 192.168.3.1
iptables -t nat -A PREROUTING  -i eth0 -s 192.168.1.100/32 -d 192.168.3.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1

如果独立服务器 192.168.1.48 与 eth1 位于同一网络:

sysctl net.ipv4.ip_forward=1
ip ro add 192.168.1.100/32 via 192.168.3.1
iptables -t nat -A PREROUTING  -i eth0 -s 192.168.1.100/32 -d 192.168.3.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.48
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.100/32 -d 192.168.1.48 -p tcp --dport 80 -j SNAT --to-source 192.168.1.1

根据需要调整 IP/范围/PAT。

漂亮的 ASCII 顺便说一句。