Назад | Перейти на главную страницу

При использовании псевдонима IP как ОС определяет, какой IP-адрес будет использоваться в качестве источника для исходящих соединений TCP / IP?

У меня есть сервер под управлением Ubuntu Server с четырьмя IP-адресами, привязанными к одной сетевой карте.

eth0       192.168.1.100
eth0:0     192.168.1.101
eth0:1     192.168.1.102
eth0:2     192.168.1.103

(Используя 192.168.x.x в качестве примера, предположим, что они преобразованы в NAT для диапазона общедоступных IP-адресов)

Один из наших клиентов публикует свой инвентарь через FTP, поэтому мы регистрируемся каждую ночь, чтобы загрузить большой файл со своего сервера. Их брандмауэр ожидает, что наше (пассивное) FTP-соединение будет установлено с адреса 192.168.1.100.

Учитывая, что у моего сервера логически четыре IP-адреса на одном адаптере, как операционная система определяет, какой IP-адрес используется в качестве источника для исходящих TCP / IP-соединений?

Скажем, я подключился к моему серверу 192.168.1.101 по ssh и запустил FTP в интерактивном режиме. Будет ли исходящее соединение TCP / IP использовать 192.168.1.101, потому что ОС знает, что это интерфейс, через который подключена моя оболочка?

Что делать, если задача FTP запускается в неинтерактивном режиме через задание cron без оболочки?

Как вы, наверное, догадались, это меня сильно сбило с толку, так что я надеюсь, что мои вопросы, по крайней мере, имели смысл.

редактировать

Чтобы прояснить, почему я спрашиваю, я не вносил никаких изменений в таблицу маршрутизации, и на самом деле в ней указано «eth0» как IFace для маршрутов 0.0.0.0. Однако все указывает на то, что на самом деле он использует в качестве источника eth0: 0.

Destination    Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0        192.168.1.1     0.0.0.0         UG    100    0        0 eth0

Я могу возиться с таблицей маршрутизации или попросить нашего клиента изменить свои правила брандмауэра, чтобы получить нужное мне поведение, но я пытаюсь немного понять, как это работает, чтобы узнать, есть ли ошибка в ОС или просто мое наивное понимание о том, как все части сочетаются друг с другом.

Спасибо

По умолчанию в Linux, если интерфейс имеет несколько адресов, которые находятся в разных подсетях, трафик, предназначенный для соответствующих подсетей, будет иметь правильный IP-адрес источника. То есть, если у eth0 два адреса 192.168.1.1/24 и 10.1.1.1/8, тогда трафик к чему-либо в подсети 10.0.0.0 будет иметь источник 10.1.1.1, а трафик к чему-либо в подсети 192.168.1.0 будет иметь источник 192.168.1.1. В этом случае вы также можете явно назначить адреса источника, используя параметр «src 1.2.3.4» для «ip route».

В вашем случае, однако, все ваши адреса находятся в одной подсети, поэтому «первичный» (как показывает «ip addr list dev eth0») используется в качестве IP-адреса источника для трафика, выходящего через этот интерфейс. Я думаю, что в этом случае можно контролировать исходные IP-адреса, просто используя «ip route», но я обнаружил, что проще использовать iptables для перезаписи исходных адресов для интересующего трафика.

Если вы хотите принудительно использовать определенный исходный адрес для определенных мест назначения, вы можете сделать это с помощью правила SNAT:

iptables -t nat -I POSTROUTING -o eth0 -d dest-IP-or-net/mask -s primary-IP-of-eth0 -j SNAT --to-source desired-source-IP

Итак, если ваш «основной» IP-адрес eth0 - 192.168.100.1, но вы хотите, чтобы трафик на 1.2.3.4 имел источник 192.168.100.2, сделайте следующее:

iptables -t nat -I POSTROUTING -o eth0 -d 1.2.3.4/0 -s 192.168.100.1 -j SNAT --to-source 192.168.100.2

Обратите внимание, что "-s 192.168.100.1" важен: он предотвращает отправлено адреса источника трафика, перезаписываемые этим правилом.

Если вы собираетесь реализовать сложные сетевые конфигурации в Linux, вам следует прочитать документацию Linux Advanced Routing and Traffic Control, http://lartc.org

Он использует тот шлюз по умолчанию, который указан в таблице маршрутизации, если только не указан конкретный маршрут, говорящий ему использовать другой: route -n

РЕДАКТИРОВАТЬ: Я слишком быстро прочитал ваш вопрос ...

Поскольку вы используете пассивный режим, и клиент всегда будет инициировать соединение, я думаю, что поле src ip в заголовке IP всегда будет отображаться как любой IP-адрес, к которому подключился клиент. Если бы это был активный режим, сервер инициировал соединение, я думаю, это всегда был бы «Основной» IP. Если ваши адреса находятся в одной подсети, Linux сделает первый добавленный вами адрес «основным», а остальные - вторичными.

Хотя я не совсем уверен, я бы запустил tcpdump -n и посмотрел, что он видит как IP-адрес src.

EDIT2: Хорошо, я написал вышеизложенное с точки зрения того, что вы запускали сервер, поэтому, поскольку вы являетесь клиентом и инициируете соединение, я думаю, что оно всегда будет исходить с основного IP-адреса, но снова попробуйте и посмотрите с tcpdump.

Я вижу в вашем примере, что все IP-адреса слишком близки, чтобы не находиться в одной сети

вы уверены, что у вас действительно множественная адресация, а не просто 4 псевдонима IP?

в последнем случае вы можете установить исходный IP-адрес на маршруте с чем-то похожим на этот

/ sbin / ip route show 192.168.222.0/24 dev eth0 proto kernel scope link src 192.168.222.178 169.254.0.0/16 dev eth0 scope link default via 192.168.222.1 dev eth0

sudo / sbin / ip route заменить маршрут по умолчанию через 192.168.222.1 src 192.168.222.178

/ sbin / ip маршрут показать
192.168.222.0/24 dev eth0 proto kernel scope link src 192.168.222.178 169.254.0.0/16 dev eth0 scope link по умолчанию через 192.168.222.1 dev eth0 src 192.168.222.178

см. интерфейсы man о том, как сделать его постоянным между перезагрузками

Вы можете увидеть, какое устройство и IP-адрес src будут использоваться командой ip route get, как показано ниже:

$ /sbin/ip route get 1.1.1.1
1.1.1.1 via 2.2.2.2 dev eth0  src 2.2.2.2 
    cache  mtu 1500 advmss 1460 hoplimit 64

Я не пробовал это в среде с псевдонимом, но надеюсь, что это поможет.

Если в вашем FTP-задании нет способа указать интерфейс, который будет использоваться для соединений, я считаю, что по умолчанию используется первый физический интерфейс в соответствующей подсети (в данном случае eth0). Если бы у вас был сервер с двумя сетевыми адаптерами в разных подсетях, он определил бы, какой интерфейс использовать, на основе таблицы маршрутизации.

Поскольку в системе есть только один физический интерфейс (eth0) и четыре виртуальных сервера / псевдонима (от eth0: 0 до eth0: 2) в одной подсети, исходящий трафик будет использовать IP-адрес eth0 в качестве источника, если приложение не достаточно умное. объявить исходящий интерфейс.

При установлении исходящего соединения ваш сервер просматривает свою таблицу маршрутизации, чтобы определить, какой из ваших четырех интерфейсов использовать; ваши TCP-соединения будут иметь исходный IP-адрес вашего выходного интерфейса.

netstat -rn

Дает вам результат вашей таблицы маршрутизации; найдите какие-либо конкретные записи, соответствующие IP-адресу клиента, к которому вы пытаетесь подключиться. Если такового не существует, вы будете использовать маршрут по умолчанию (0.0.0.0, маска 0.0.0.0). Если у вас несколько маршрутов по умолчанию, будет использоваться тот, который имеет наименьшую стоимость.