У меня есть сервер под управлением 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.xx, предположим, что они настроены на диапазон общедоступных IP-адресов)
Один из наших клиентов публикует свой инвентарь по FTP, поэтому мы регистрируемся ночью, чтобы загрузить большой файл с их сервера. Их брандмауэр ожидает, что наше (пассивное) FTP-соединение будет установлено с 192.168.1.100.
Учитывая, что мой сервер логически имеет четыре IP-адреса на одном адаптере, как операционная система определяет, какой IP-адрес используется в качестве источника для исходящих соединений TCP / IP?
Допустим, я подключился к моему серверу 192.168.1.101 и запустил 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
Я могу поиграть с таблицей маршрутизации или заставить нашего клиента изменить свои правила брандмауэра, чтобы получить нужное мне поведение, но я пытаюсь немного понять, как это работает, чтобы узнать, есть ли ошибка в ОС или просто мое наивное понимание о том, как все части сочетаются друг с другом.
Благодарность
Я вижу в вашем примере, что все ips слишком близко, чтобы не быть в одной сети
Вы уверены, что на самом деле вы используете несколько адресов, а не просто имеете 4 IP-псевдонима?
если последнее имеет место, то вы можете установить исходный IP на маршруте с чем-то похожим на это
смотрите man интерфейсы о том, как сделать его постоянным между перезагрузками
источник
Он использует любой шлюз по умолчанию, указанный в таблице маршрутизации, если только нет определенного маршрута, говорящего ему использовать другой:
route -n
РЕДАКТИРОВАТЬ: я прочитал ваш вопрос слишком быстро, кажется ...
Поскольку вы используете пассивный режим, и клиент всегда будет инициировать соединение, я думаю, что поле src ip в заголовке IP всегда будет отображаться как любой IP-адрес, к которому подключен клиент. Если бы это был активный режим, когда сервер инициировал соединение, я думаю, что это всегда был бы «Первичный» IP. Если ваши адреса находятся в одной подсети, Linux сделает первый добавленный вами адрес «Первичным», а остальные - вторичным.
Хотя я не совсем уверен, я бы запустил tcpdump -n и увидел бы то, что он видит как src IP.
РЕДАКТИРОВАТЬ 2: Хорошо, я написал выше с точки зрения того, что вы запустили сервер, так что, поскольку вы являетесь клиентом и инициируете соединение, я думаю, что оно всегда будет исходить от основного IP-адреса, но снова попробуйте и посмотрите с tcpdump.
источник
Если в вашем задании FTP нет способа указать интерфейс для использования для соединений, я считаю, что по умолчанию используется первый физический интерфейс в соответствующей подсети (в данном случае eth0). Если у вас есть сервер с двумя сетевыми картами в разных подсетях, он определит, какой интерфейс использовать, на основе таблицы маршрутизации.
Поскольку в системе имеется только один физический интерфейс (eth0) и четыре виртуальных / псевдонима (от eth0: 0 до eth0: 2), исходящий трафик будет использовать IP-адрес eth0 в качестве источника, если приложение не достаточно умен. объявить исходящий интерфейс.
источник
nc -s <ip of eth0:2>
или с тем, что всегда показывает адрес источника, на самом деле является ip из eth0: 0, хотя netcat делал этоbind(2)
раньшеconnect(2)
. Таким образом, похоже, что псевдонимы не работают, чтобы дать машине возможность устанавливать соединения с нескольких исходных адресов.Вы могли видеть, какое устройство и IP-адрес src будут использоваться командой ip route get, как показано ниже:
Я не пробовал это в псевдониме, но надеюсь, что это поможет.
источник
При установлении исходящего соединения ваш сервер будет смотреть в своей таблице маршрутизации, чтобы определить, какой из четырех ваших интерфейсов использовать; ваши TCP-соединения будут иметь исходный IP-адрес вашего интерфейса выхода.
Даст вам вывод вашей таблицы маршрутизации; ищите какие-либо конкретные записи, соответствующие IP-адресу клиента, к которому вы пытаетесь подключиться. Если их нет, то вы будете использовать маршрут по умолчанию (0.0.0.0, маска 0.0.0.0). Если у вас есть несколько маршрутов по умолчанию, будет использоваться маршрут с наименьшей стоимостью.
источник