Как использовать один IP-адрес для получения соединений, а другой - для установления соединений

У меня есть VPS с 2 доступными IP-адресами. Я хотел бы использовать один из них для получения подключений, а другой использовать, когда сервер устанавливает подключение. Таким образом, если соединение запускается не с VPS, он будет использовать IP-адрес A, а если он есть, он будет использовать IP-адрес B.

VPS работает под управлением Ubuntu 16.04

, как мне это сделать? Спасибо!

0
задан 20 April 2021 в 23:50
1 ответ

Когда 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-адресов. Если я хочу, чтобы она принимала соединения только с одним из них, я могу просто заблокировать нежелательные соединения в брандмауэре.

1
ответ дан 24 April 2021 в 01:40

Теги

Похожие вопросы