请考虑以下几点:
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忽略你的以下命令。
在 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
在路由器上,我假设默认情况下启用 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
在该表中查找。