我有一个带有 2 个可用 IP 地址的 VPS。我想使用其中一个来接收连接,并在服务器建立连接时使用另一个。因此,如果连接的启动者不是 VPS,它将使用 IP 地址 A,如果是,它将使用 IP 地址 B。
VPS 运行的是 Ubuntu 16.04
我该怎么做呢?谢谢!
答案1
当 Linux 建立传出连接时,它首先尝试使用应用程序在套接字创建时请求的地址。如果它没有请求任何特定内容(或请求0.0.0.0
),它会寻找一个暗示在路线中。
您可以设置这样的路线暗示到您指定的任何地址,这可以通过src
命令关键字完成ip
:
ip route add DESTINATION via GATEWAY src PREFERRED_SRC_ADDRESS
例如,在我的计算机上有两个地址,192.168.168.4/24
并且192.168.168.6/24
(为了清晰起见,输出被精简):
muon ~ # ip addr
...
3: br0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 ... state UP ...
inet 192.168.168.4/24 brd 192.168.168.255 scope global br0
inet 192.168.168.6/24 scope global secondary br0
...
要192.168.168.6
用于传出路线,我必须告诉所有程序明确绑定到它,例如:
ssh -b 192.168.168.6 dst-address
或者设置我的默认路线,以便默认选择它:
ip route add default via 192.168.168.1 src 192.168.168.6
(默认路由默认没有提示;在这种情况下系统使用“已连接”提示。)另请注意,一些 src 已经位于“已连接”路由中,由命令生成ip address add
并由网络掩码定义:
192.168.168.0/24 dev br0 proto kernel scope link src 192.168.168.4
这是因为.4
地址是此系统上的“主要”地址,.6
之后才添加。这两条路由是我在主表中拥有的全部路由,因此现在我将从连接到.4
同一 LAN 中的机器(当我通过“已连接”路由时)并从连接.6
到其外部的机器(当我通过“默认”路由时)。我可能也会更新此路由以使用.6
其中的地址:
ip route change 192.168.168.0/24 dev br0 src 192.168.168.6
要现在使用.4
地址,我必须明确地绑定到它,例如使用ssh -b
,或者使用“更长的前缀”设置到我想要使用.4
地址的某些系统的附加路由。
任何时候机器都可以接受来自两个 IP 地址的传入连接。如果我希望它只接受其中一个 IP 地址的连接,我只需在防火墙中阻止不需要的连接即可。