Як Псевдонім IP, як ОС визначає, яка IP-адреса буде використовуватися в якості джерела для вихідних TCP / IP-з'єднань?


15

У мене є сервер під управлінням Ubuntu Server з чотирма IP-адресами, псевдонімами в одному NIC.

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 для прикладу, припустимо, що вони NAT-ed для широкого кола публічних 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

Я можу поспілкуватися з таблицею маршрутизації або змусити нашого клієнта змінити свої правила брандмауера, щоб отримати потрібну мені поведінку, але я намагаюся трохи зрозуміти, як це працює, щоб знати, чи є помилка в ОС або просто моє наївне розуміння про те, як всі шматки поєднуються разом.

Спасибі

Відповіді:


12

За замовчуванням в 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

Отже, якщо ваш "первинний" eth0 IP становить 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, http://lartc.org


У зразку, можливо, замініть "-d 1.2.3.4/0" на "-d 1.2.3.4/332" або "-d 1.2.3.4"
Крістіан

5

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

ти впевнений, що ти насправді мультихомінг і не просто маєш 4 псевдоніми IP?

якщо остання справа, то ви можете встановити вихідний ip на маршруті чимось подібним до цього

/ sbin / ip route show 192.168.222.0/24 dev eth0 proto ядро ​​області зв’язку src 192.168.222.178 169.254.0.0/16 dev eth0 область посилання за замовчуванням через 192.168.222.1 dev eth0

маршрут sudo / sbin / ip замінити за замовчуванням через 192.168.222.1 src 192.168.222.178

/ sbin / ip route show
192.168.222.0/24 dev eth0 proto ядро ​​області посилання src 192.168.222.178 169.254.0.0/16 dev eth0 область посилання за замовчуванням через 192.168.222.1 dev eth0 src 192.168.222.178

дивіться інтерфейси людини про те, як зробити його стійким між перезавантаженнями


Ви праві. Можливо, я зловживаю терміном «багатонадійне». Наш центр обробки даних дає нам чотири IP-адреси в одній підмережі.
Джо Холлоуей

ви знаєте, що можете редагувати своє запитання, правда?
hayalci

5

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

EDIT: Я занадто швидко прочитав ваше запитання, здається ...

Оскільки ви використовуєте пасивний режим і клієнт завжди буде ініціювати з'єднання, я думаю, що поле src ip у заголовку IP завжди буде відображатися як будь-який IP, до якого підключений клієнт. Якби в активному режимі сервер ініціював підключення, я думаю, це завжди був би "Первинний" IP. Якщо ваші адреси знаходяться в одній підмережі, Linux зробить першу адресу, яку ви додали "Первинну", а іншу - другорядною.

Я не зовсім впевнений, я би запустив tcpdump -n і побачив, що він бачить як src IP.

EDIT2: Гаразд, я написав вище з точки зору того, що ви працюєте на сервері, тому, оскільки ви є клієнтом і ініціюєте підключення, я думаю, що він завжди з’явиться з первинної IP-адреси, але знову ж таки, спробуйте це і подивіться з tcpdump.


Таблиця маршрутизації - це лише за замовчуванням, і є лише одна підмережа. Інший плакат вказав, що я неправильно використовував термін мультихомінг. Однак я все-таки сподіваюся, що він буде використовувати псевдонім eth0. Я використовував wget для завантаження Whatsmyip.net, і він показує, що я якось замість цього використовую eth0: 0.
Джо Холлоуей

Це насправді не має сенсу для мене. Whatsmyip.net повинен показати ваш публічний ip ...
Kyle Brandt

Для того, щоб бути більш зрозумілим, він показує загальнодоступну IP-адресу, яка є NAT-ed для приватного IP, пов'язаного з eth0: 0, тоді як я б очікував, що він відображатиме публічну IP-адресу, яка NAT-ed, для приватного IP, пов'язаного з eth0
Джо Холлоуей

1
Ця відповідь тут занадто велика, і вона містить багато редагувань і багато хто плутає і не допомагає. Відповіді tbman та jknapka відмінні та дуже мені допомогли.
Крістіан

4

Якщо у вашій роботі FTP немає способу вказати інтерфейс, який використовуватиметься для з'єднань, я вважаю, що він за замовчуванням застосовується до першого фізичного інтерфейсу у відповідній підмережі (у цьому випадку eth0). Якщо у вас був сервер з двома NIC в різних підмережах, то було б зрозуміти, який інтерфейс використовувати на основі таблиці маршрутизації.

Оскільки в системі є лише один фізичний інтерфейс (eth0) і чотири віртуальні / псевдоніми (eth0: 0 до eth0: 2) в одній підмережі, вихідний трафік використовуватиме IP-адресу eth0 як джерело, якщо додаток не є достатньо розумним. оголосити вихідний інтерфейс.


2
Це було моїм припущенням, але всі мої тести вказують, що в якості джерела використовується eth0: 0.
Джо Холлоуей

Тоді, можливо, маршрут за замовчуванням налаштований для використання інтерфейсу eth0: 0. У мене є установка, яка використовує міст Ethernet, і вона була налаштована на використання інтерфейсу віртуального мосту для маршруту за замовчуванням.
sysadmin1138

Я встановив тривіальну програму на іншій машині для друку IP, з якого він отримав з'єднання. Підключення до нього за допомогою nc -s <ip of eth0:2>або все, що завжди показує адресу джерела, насправді є ip eth0: 0, навіть незважаючи на те, що netcat робив bind(2)раніше connect(2). Таким чином, схоже, псевдоніми не працюють, щоб надати машині можливість встановлювати з'єднання з декількох адрес джерела.
Пітер Кордес

4

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

$ /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

Я не пробував цього в чужих умовах, але сподіваюся, що це допомагає.


1

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

netstat -rn

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.