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

Как я могу заставить Linux соблюдать новую сетевую маску без жесткого перезапуска сетевой подсистемы?

Я не уверен, что «честь» - подходящее слово для этого, но это лучшее, что я мог придумать. У меня есть сценарий, в котором у меня есть два сервера в одной сети. У них есть первичный и вторичный IP-адреса, все в одной подсети. Для обсуждения они выглядят так:

server1    eth0    172.16.45.3/24
server1-A  eth0:11 172.16.45.21/27
server1-B  eth0:12 172.16.45.22/27

server2    eth0    172.16.45.4/27

Да, server1 установлен на / 24, и да, это ошибка.

Я заметил эту проблему, потому что соединения с server1-> server2 имели исходный IP-адрес 172.16.45.21 вместо 172.16.45.3. Поскольку приложение, создающее соединение, не указывает исходный IP-адрес, я был шокирован тем, что оно не использует 172.16.45.3.

Тогда я заметил неправильную маску сети. Поскольку целевой IP-адрес находится в известной меньшей сети, он использует IP-адрес из того же / 27 вместо IP-адреса, который, по его мнению, исходит из / 24. Ой.

Итак, я исправил маску сети на server1: eth0, выполнив следующую команду:

ifconfig eth0 netmask 255.255.255.224

ifconfig теперь тоже казался счастливым:

eth0      Link encap:Ethernet  HWaddr 00:22:19:54:EF:11  
          inet addr:172.16.45.3  Bcast:172.16.45.31  Mask:255.255.255.224
          inet6 addr: fe80::222:19ff:fe54:ef11/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1085587580 errors:0 dropped:1355 overruns:0 frame:0
          TX packets:1208356392 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:365708046601 (340.5 GiB)  TX bytes:667099868812 (621.2 GiB)
          Interrupt:169 Memory:f8000000-f8012100 

Кроме того, таблица маршрутизации очистилась.

Перед:

server1 0 /home/jj33 ># route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.45.0     0.0.0.0         255.255.255.224 U     0      0        0 eth0
172.16.45.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
0.0.0.0         172.16.45.1     0.0.0.0         UG    0      0        0 eth0

После:

server1 0 /home/jj33 ># route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.45.0     0.0.0.0         255.255.255.224 U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
0.0.0.0         172.16.45.1     0.0.0.0         UG    0      0        0 eth0

Единственная проблема заключается в том, что после всего этого ОС по-прежнему выбирает 172.16.45.21 в качестве исходного адреса для исходящих подключений к той же сети (SMTP напрямую не участвует в этой проблеме, это просто удобный способ показать исходный IP-адрес). соединения):

server1 0 /home/jj33 ># telnet server2 25
Trying 172.16.45.4...
Connected to 172.16.45.4.
Escape character is '^]'.
220 server2.example.com ESMTP mailer ready at Wed, 23 Dec 2009 12:18:28 -0600
ehlo foo
250-server2.qcommcorp.com Hello server1-A.example.com [172.16.45.21]
250 HELP

(в случае, если это не очевидно, я ожидаю, что почтовая программа скажет «Hello server1.example.com [172.16.45.3]» в ответ на мое ehlo, если все работает правильно).

Итак, теперь мой вопрос. Как я могу заставить мою ОС заметить тот факт, что сетевая маска на eth0 изменилась, так что это лучший выбор для исходящих подключений к моему локальному / 27? Я предполагаю, что перезапуск сервера или сетевых служб сделает это, но мне придется подождать неделю до следующего окна обслуживания, и кажется, что я мог бы сделать что-то, не прерывая обслуживание (это производственная система, и этот неправильный исходный IP-адрес является небольшая, касательная проблема - основное приложение работает хорошо).

Любая помощь очень ценится. Спасибо!

ОБНОВЛЕНИЕ 1/8/2010:

Итак, эта проблема привлекла больше внимания, чем я ожидал, и в итоге я получил разрешение на отказ приложения в резервном хранилище и перезапуск сетевых служб на затронутом сервере за пределами нашего стандартного окна, что означает, что я не могу проверить ни одну из теорий. ниже.

В общем, хотя я верю Ответ Джулиано освещены наиболее подробно. Я не копировал и не вставлял его, но, играя с ip, он, как правило, подтверждал то, что он утверждал.

Кроме того, достаточное количество людей навалило на использование ip вместо ifconfig, что я потратил некоторое время, играя с ним и снимаю шляпу перед всеми вами, я определенно должен использовать ip. Спасибо за указатели.

Перво-наперво, не используйте ifconfig и route. Эти команды сегодня обычно считаются устаревшими; они были написаны слишком давно, когда у Linux был совсем другой сетевой стек, и с тех пор исправлены. Сама идея псевдонимов интерфейсов (например, ethX: YY), чтобы иметь несколько адресов, сегодня устарели, они все еще существуют, в основном, чтобы угодить самому ifconfig. Сегодня ip команда должна удовлетворить все ваши потребности.

Теперь разберитесь с исходной ситуацией: у вашего интерфейса eth0 изначально было две активных области: / 24 и / 27. 172.16.45.3 был первичным адресом для области / 24, а 172.16.45.21 был первичным адресом для области / 27 (потому что он указан первым). Когда вы вводили команду ifconfig для изменения префикса первого адреса, она удаляла его и повторно вставляла в качестве вторичного адреса в области / 27. Итак, теперь у вас должно получиться что-то вроде этого:

inet 172.16.45.21/27 brd 172.16.45.31 primary   eth0:11
inet 172.16.45.22/27 brd 172.16.45.31 secondary eth0:12
inet 172.16.45.3/27  brd 172.16.45.31 secondary eth0

Не имеет значения, что eth0 должен быть первичным или, похоже, он должен быть первичным (еще одна причина не использовать ifconfig). Последний был вставлен в область / 27, так что это вторичный адрес. Это также означает, что исходящие пакеты будут адресованы 172.16.45.21, и что если вы отключите eth0: 11 с помощью ifconfig, все ваши адреса будут записаны вместе. Вот как это работает.

Единственный способ исправить это - удалить все адреса из интерфейса и снова вставить их в правильном порядке. Затем первый добавленный адрес (в области / 27) будет основным адресом в этой области, а все остальные адреса будут вторичными.

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

Один из возможных обходных путей - изменить исходный адрес маршрутизации. Это будет иметь почти такой же эффект при изменении основного адреса. В твоем случае:

ip route change 172.16.45.0/27 dev eth0 src 172.16.45.3

В этом случае для пакетов, идущих на 172.16.45.0/27, будет установлен адрес источника 172.16.45.3. Вам понадобится другая команда, если вы также хотите изменить источник пакетов, проходящих через шлюз.

У меня была аналогичная проблема (два сервера с eth0 и eth1 в одном сегменте ethernet), и я не мог понять, как заставить источник в моем случае. Однако вы можете попробовать такой подход, чтобы принудительно использовать исходный ip в вашем случае:

ip route add dev eth0 src 172.16.45.3 172.16.45.4 metric 2

Это снова метрика, но с включением источника в уравнение. В моей домашней конфигурации это позволило мне выбрать другой IP-адрес для подключения к моему серверу по сравнению с тем, что ядро ​​выберет по умолчанию.

Вы не сказали, какой дистрибутив вы используете. Вам следует изменить файлы конфигурации и использовать какой-то сценарий инициализации для перезагрузки сетевых настроек. (Если вы пропустите этот шаг, ваши настройки будут потеряны после перезагрузки.)

Во-вторых, в настоящее время ip Инструмент предпочтительнее ifconfig в Linux. С участием ip вы можете добавлять и удалять IP-адреса на лету.

Вы пробовали устанавливать метрики с помощью ifconfig?

metric n Установите метрику маршрутизации интерфейса равной n, по умолчанию 0. Метрика маршрутизации используется протоколом маршрутизации. Более высокие показатели делают маршрут менее благоприятным; метрики подсчитываются как дополнительные переходы к целевой сети или узлу.

Ссылка на сайт

По сути, вы хотите предпочесть одну сетевую карту другой. Попробуйте установить для ссылок A и B показатель 1.

Не уверен, что понимаю, но, может быть, ты сможешь сделать что-нибудь вроде

маршрут добавить -net 172.16.45.0/27 dev eth0

Это заставляет все подключения к этой подсети проходить через eth0 с указанным вами IP-адресом.