Я хотел бы иметь несколько сетевых адаптеров (eth0 и wlan0) в одной подсети и служить резервной копией для приложений на хосте в случае сбоя одного из сетевых адаптеров. По этой причине я создал дополнительную таблицу маршрутизации. Вот как /etc/network/interfaces
выглядит:
iface eth0 inet static
address 192.168.178.2
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.2
post-up ip route add default via 192.168.178.1 dev eth0
post-up ip rule add from 192.168.178.2/32
post-up ip rule add to 192.168.178.2/32
iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.3
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.3 table rt2
post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
post-up ip rule add from 192.168.178.3/32 table rt2
post-up ip rule add to 192.168.178.3/32 table rt2
Это работает для подключения к хосту: я все еще могу подключиться к нему по SSH, если один из интерфейсов выходит из строя. Однако приложения на хосте не могут инициализировать соединение с внешним миром, если eth0
не работает. Это моя проблема.
Я исследовал эту тему и нашел следующую интересную информацию:
Когда программа инициирует исходящее соединение, она обычно использует подстановочный адрес источника (0.0.0.0), который не указывает, какой интерфейс используется, при условии, что соответствующий адрес назначения доступен. Он не заменяется конкретным адресом источника до тех пор, пока не будет принято решение о маршрутизации. Поэтому трафик, связанный с такими соединениями, не будет соответствовать ни одному из приведенных выше правил политики и не будет перенаправлен ни в одну из вновь добавленных таблиц маршрутизации. Предполагая, что в остальном нормальная конфигурация, он вместо этого провалится к основной таблице маршрутизации. http://www.microhowto.info/howto/ensure_symmetric_routing_on_a_server_with_multiple_default_gateways.html
Я хочу, чтобы в основной таблице маршрутов было более одного шлюза по умолчанию (один включен eth0
и один включен wlan0
) и чтобы он шел к стандартному шлюзу через eth0
по умолчанию и через wlan0
if, если eth0
он выключен.
Это возможно? Что мне нужно сделать, чтобы достичь такой функциональности?
Ответы:
Решил это сам. Кажется, что очень мало информации о сетевых вещах, которые вы можете делать с Linux, поэтому я решил документировать и подробно объяснить свое решение. Это моя последняя настройка:
Первый шаг : создайте новую таблицу маршрутов для каждого интерфейса в
/etc/iproute2/rt_tables
. Давайте назовем их rt1, rt2 и rt3Второй шаг : настройка сети в
/etc/network/interfaces
. Это основная часть, и я постараюсь объяснить как можно больше:Если вы печатаете,
ip rule show
вы должны увидеть следующее:Это говорит нам о том, что трафик, входящий или исходящий с IP-адреса «192.168.178.99», будет использовать таблицу маршрутизации rt1. Все идет нормально. Но трафик, генерируемый локально (например, вы хотите пропинговать или ssh с компьютера куда-либо еще), требует особого подхода (см. Большую цитату в вопросе).
Первые четыре пост-строки
/etc/network/interfaces
просты и объяснения можно найти в Интернете, пятая и последняя пост-строка - это та магия, которая происходит:Обратите внимание, что мы не указали таблицу маршрутов для этой пост-строки. Если вы не укажете таблицу маршрутов, информация будет сохранена в
main
таблице маршрутов, которую мы виделиip rule show
. Эта дополнительная строка помещает маршрут по умолчанию в «основную» таблицу маршрутов, которая используется для локально генерируемого трафика, который не является ответом на входящий трафик. (Например, MTA на вашем сервере пытается отправить электронное письмо.)Все три интерфейса помещают маршрут по умолчанию в основную таблицу маршрутов, хотя и с разными метриками. Давайте посмотрим на
main
таблицу маршрутов сip route show
:Мы видим, что в основной таблице маршрутов есть три маршрута по умолчанию, хотя и с разными метриками. Наивысшим приоритетом является eth0, затем wlan1, а затем wlan0, поскольку более низкие числа метрик указывают на более высокий приоритет. Так как
eth0
имеет самый низкий показатель, это маршрут по умолчанию, который будет использоваться до тех пор, покаeth0
он работает. В случаеeth0
отказа исходящий трафик переключится наwlan1
.С помощью этой настройки мы можем ввести
ping 8.8.8.8
один терминал иifdown eth0
другой.ping
должно работать, потому что, посколькуifdown eth0
удалит маршрут по умолчанию, связанный сeth0
, исходящий трафик переключится наwlan1
.Строки пост-вниз гарантируют, что связанные таблицы маршрутов будут удалены из базы данных политики маршрутизации (
ip rule show
), когда интерфейс выйдет из строя, чтобы сохранить все в порядке.Проблема, которая остается, заключается в том, что когда вы извлекаете заглушку из
eth0
маршрута по умолчанию,eth0
он все еще существует, и исходящий трафик не выполняется. Нам нужно что-то контролировать наши интерфейсы и выполнять,ifdown eth0
если есть проблемы с интерфейсом (например, сбой сетевой платы или кто-то тянет за вилку).Последний шаг : введите
ifplugd
. Это демон, который наблюдает за интерфейсами и запускается,ifup/ifdown
если вы потянете за вилку или если есть проблема с подключением Wi-Fi/etc/default/ifplugd
:Теперь вы можете
eth0
отключить плагин , исходящий трафик переключится на,wlan1
и, если вы вставите плагин обратно, исходящий трафик снова переключится наeth0
. Ваш сервер будет оставаться в сети до тех пор, пока работает любой из трех интерфейсов. Для подключения к вашему серверу вы можете использовать IP-адрес eth0, а в случае сбоя - ip-адрес wlan1 или wlan0.источник
scp
Сессия будет перерыв , так как IP - адрес меняется. Вы можете попробовать использовать,withsctp
чтобы сохранить соединение в таком случае, или использоватьrsync
вместо того,scp
чтобы ограничить передачу от точки, где оно остановилось.withsctp
также будет работать только для одного маршрута по умолчанию.Linux предлагает лучшее решение, чем обходной сценарий: соединение активных резервных копий.
Таким образом, ваша машина будет иметь только один IP-адрес (и один MAC-адрес) и автоматически и прозрачно переключать интерфейсы, если один интерфейс станет недоступным. Нет прерывания любого соединения TCP (ни к вашей внутренней сети, ни к Интернету).
Я сам использую эту настройку для автоматического перехода с eth0 на wlan0 на своем ноутбуке Debian, когда я отключаю свой ноутбук от док-станции.
Мой / etc / network / interfaces:
Вы можете легко расширить эту настройку, чтобы включить несколько устройств WLAN. Установка
primary_reselect
опцииbetter
(автоматически выбирать самую быструю ссылку) должна помочь здесь.Для получения дополнительной информации см. Https://wiki.linuxfoundation.org/networking/bonding и https://wiki.debian.org/Bonding.
И (конечно) документация по ядру Linux на https://www.kernel.org/doc/Documentation/networking/bonding.txt
источник