将 IP 地址路由到另一个并保留源地址?

将 IP 地址路由到另一个并保留源地址?

请考虑以下几点:

WAN IP1: aaa.aaa.aaa.aaa/23 
WAN IP2: bbb.bbb.bbb.bbb/25
LAN Subnet: 10.3.0.0/24

两个 WAN 地址都路由到 Linux 服务器,并且 Linux 服务器在两个地址上均可访问。我想将 bbb.bbb.bbb.bbb 路由到 LAN 接口 (10.3.0.2) 上的另一台主机。

INTERNET -- Linux Server
            (aaa.aaa.aaa.aaa/23, bbb.bbb.bbb.bbb/25 ens3)
            (10.3.0.1/24 tap0) -------- Router
                                        (10.3.0.2/24 tap0)
                 INTERNET -- ISP NAT -- (xxx.xxx.xxx.xxx/xx eth0)
                                        (172.16.1.0/24 br-lan)

现在我想通过 tap0 将 bbb.bbb.bbb.bbb 路由到 10.3.0.2 上的路由器上(bbb.bbb.bbb.bbb 是 ens3 上的地址)。这样我的路由器就会有一个公网 IP 地址。我这样做了:

ip addr del bbb.bbb.bbb.bbb/25 dev ens3 # remove from ens3
ip route add bbb.bbb.bbb.bbb dev tap0   # route it to tap0

该图表将如下所示:

INTERNET -- Linux Server
            (aaa.aaa.aaa.aaa/23 ens3)
            (10.3.0.1/24 tap0) -------- Router
                                        (10.3.0.2/24, bbb.bbb.bbb.bbb tap0)
                 INTERNET -- ISP NAT -- (xxx.xxx.xxx.xxx/xx eth0)
                                        (172.16.1.0/24 br-lan)

并且,Linux服务器上的路由表:

% ip -4 route
default via aaa.aaa.aaa.1 dev ens3 onlink 
10.3.0.0/24 via 10.3.0.1 dev tap0 
10.3.0.1 dev ens3  scope link 
aaa.aaa.aaa.0/23 dev ens3  proto kernel  scope link  src aaa.aaa.aaa.aaa 
bbb.bbb.bbb.bbb dev tap0  scope link 
169.254.0.0/16 dev ens3  scope link

在我的路由器上,我添加了地址bbb.bbb.bbb.bbb,现在我能够bbb.bbb.bbb.bbb在 Linux 服务器上 ping 通。

但是,我无法 pingbbb.bbb.bbb.bbb通其他主机。因此我尝试:

iptables -t nat -A POSTROUTING -j MASQUERADE

有了这条规则,我就能 pingbbb.bbb.bbb.bbb互联网了。如果我执行跟踪路由,我可以看到 bbb.bbb.bbb.bbb 位于 aaa.aaa.aaa.aaa 后面,即:

... 
10. ???
11. aaa.aaa.aaa.aaa                   0.0%    16   45.3  43.6  43.1  45.5   0.8
12. bbb.bbb.bbb.bbb                   0.0%    16   53.7  54.8  51.2  79.4   7.1

但是,我想要隧道端点处的真实源 IP(10.3.0.2)——现在我在路由器上获取所有流量 10.3.0.1,因为 Linux 服务器执行 SNAT。我该怎么做?

答案1

这是一个有点令人困惑的问题,因为你给出的命令没有这样做,......我想通过 tap0 将 bbb.bbb.bbb.bbb 路由到 10.3.0.2 上的路由器上。如果我理解正确的话,您希望路由器穿过 Linux 服务器才能连接到互联网。如果这是正确的,那么这就是获取它的方法,从第一个图中的配置开始,IE忽略你的以下命令。

  1. 在 Linux 服务器上,启用IPv4转发然后发出:

      iptables -t -nat -A POSTROUTING -o eth0 -j MASQUERADE
      ip route add 172.16.0.0/24 via 10.3.0.2 dev tap0
    
  2. 在路由器上,我假设默认情况下启用 IPv4 转发:

    ip route del default
    ip route add default via 10.3.0.1 dev tap0 
    iptables -A INPUT -s 10.8.3.0.1 -j ACCEPT
    

这样做的好处是,它在 Linux 服务器上执行单级 NAT,然后路由会处理所有事情。如果您希望 LAN 客户端按名称找到 Linux 服务器(例如,它称为 LS),请添加以下行:

10.3.0.2    LS

到路由器的/etc/hosts文件:这么小的需求,没必要设置DNS服务器。

然而,这确实不是擁有...所以我的路由器将有一个公共 IP 地址,因为公共 IP 地址属于 Linux 服务器。如果有人试图联系啊啊啊啊啊啊啊啊啊啊,Linux 服务器必须回复。唯一可以提供的例外是通过转发端口, 意思就是全部给定端口上的通信将被传输到路由器,但您无法将所有端口上的所有通信都传输到路由器(这将真的意思是 ...所以我的路由器将有一个公共 IP 地址)。当然,除非你的 Linux 服务器拥有2 个 IP 地址,在这种情况下,您可以为路由器保留一个,为 Linux 服务器保留另一个。

答案2

刚刚明白了——这很简单,我不知道为什么我以前没有注意到。

由于我的路由器上的默认网关是不是隧道服务器 - 路由器正在尝试通过 eth0 的网关回复来自 tun0 的数据包。执行 SNAT 使源地址变为 10.3.0.1 - 路由器知道将它们发回何处,这就是它与 MASQUERADE 一起工作的原因。

因此,在路由器上创建一个新的路由表并将其默认网关设置为 tun0。然后,让源 IPbbb.bbb.bbb.bbb在该表中查找。

相关内容