![如何通过另一台服务器路由流量?](https://linux22.com/image/745650/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E5%8F%A6%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%B7%AF%E7%94%B1%E6%B5%81%E9%87%8F%EF%BC%9F.png)
我有两台 Linux(Ubuntu)服务器,A 和 B。服务器 A 可以访问互联网,而 B 则不能。服务器可以通过各自(单独的)默认网关相互通信。
我可以通过服务器 A 的端口转发从互联网访问服务器 B。以下是允许 ssh 的示例:
iptables --table nat --insert PREROUTING --protocol tcp --dport 61000 --jump DNAT --to-destination <B_IP>:22
但是如何让服务器 B 通过服务器 A 访问互联网呢?服务器 A 准备进行后路由:
iptables --table nat --insert POSTROUTING --protocol tcp --jump MASQUERADE
尝试用 A 的 IP 替换服务器 B 的默认网关会RTNETLINK answers: Network is unreachable
导致无法再路由到 A。我只能访问服务器 A 和 B。我无法访问它们的网关。
答案1
默认路由必须位于同一网段(以太网广播域),并且看起来您的两台服务器是通过路由器连接的。
但是,您可能可以在两者之间设置某种隧道。最简单的是 IPv4-over-IPv4 隧道。为了便于解释,假设10.1.0.100
是服务器 A 地址,服务器 B 地址。您可以在服务器 B 上10.2.0.1
添加/etc/network/interfaces
(或添加文件):/etc/network/interfaces.d
iface tun0 inet tunnel
address 192.168.0.1
local 10.2.0.1
endpoint 10.1.0.100
mode ipip
netmask 24
gateway 192.168.0.2
在服务器 A 上:
iface tun0 inet tunnel
address 192.168.0.2
local 10.1.0.100
endpoint 10.2.0.1
mode ipip
netmask 24
根据您的网络拓扑和网关配置,这可能就足够了。
解释:这将设置一个虚拟接口,该接口不直接在线上发送 IPv4 数据包,而是将它们包装到另一个 IPv4 数据包中,然后将其从 发送address
到endpoint
。
您没有解释您的网络拓扑,但如果 A 的网关可能知道如何到达 B,那么SNAT/MASQUERADE
可能没有必要(除非防火墙阻止传入 B 的数据包)。