У меня есть VPS с 2 доступными IP-адресами. Я хотел бы использовать один из них для получения подключений, а другой использовать, когда сервер устанавливает подключение. Таким образом, если соединение запускается не с VPS, он будет использовать IP-адрес A, а если он есть, он будет использовать IP-адрес B.
VPS работает под управлением Ubuntu 16.04
, как мне это сделать? Спасибо!
Когда Linux устанавливает исходящее соединение, он сначала пытается использовать тот адрес, который приложение запросило при создании сокета. Если оно не запросило ничего конкретного (или запросило 0.0.0.0
), оно ищет подсказку в маршруте.
Вы можете установить маршрут с таким hint на любой назначенный вами адрес, это делается с помощью ключевого слова 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
(Маршрут по умолчанию не имеет подсказки по умолчанию; система использует подсказку "connected" в этом случае). Также обратите внимание, что некоторые src уже будут в маршруте "connected", созданном командой ip address add
и определенном маской сети:
192.168.168.0/24 dev br0 proto kernel scope link src 192.168.168.4
Это потому, что адрес .4
был "основным" в этой системе, а .6
был добавлен позже. Эти два маршрута - все, что у меня есть в главной таблице, так что теперь я буду подключаться с .4
к машинам в той же локальной сети (когда я иду через "connected" маршрут) и с .6
к машинам вне ее (когда я иду через "default" маршрут). Я могу обновить и этот маршрут, чтобы использовать в нем адрес .6
:
ip route change 192.168.168.0/24 dev br0 src 192.168.168.6
Чтобы использовать адрес .4
сейчас, я должен привязаться к нему явно, например, с помощью ssh -b
, или настроить дополнительные маршруты с "более длинным префиксом" к определенным системам, для которых я хочу использовать адрес .4
.
Все это время машина доступна для входящих соединений с обоих IP-адресов. Если я хочу, чтобы она принимала соединения только с одним из них, я могу просто заблокировать нежелательные соединения в брандмауэре.