В течение многих лет (> 7 лет) мои сценарии автоматизации добавляли новые внешние IP-адреса к серверам таким образом
ifconfig lo:0 11.22.99.44 netmask 255.255.255.255
ifconfig lo:1 11.22.33.44 netmask 255.255.255.255
...
Это отлично работало со всеми (> 10) поставщиками, с которыми я работал, и у меня никогда не было проблем.
Теперь я понял, что добавлял IPS в loopback, и это могло быть неправильно.
и вот только что остался после игры в песочнице 127.0.0.0/8 знак равно
Короткое расследование показало, что необходимый маршрут добавляется автоматически, и пакет, прибывший на эти IP-адреса, маршрутизируется правильно.
Ло маршрут виден в Routel так как
11.22.33.44 local 11.22.33.44 kernel host lo local
11.22.99.44 local 11.22.33.44 kernel host lo local
но не в ip route show
default via 99.88.22.1 dev eth0
99.88.22.0/24 dev eth0 proto kernel scope link src 99.88.22.123
Тестирование маршрута: отправляет по маршруту по умолчанию на базовый (добавленный в eth0) IP-шлюз сервера
#ip route get 5.5.5.5 from 11.22.33.44 iif lo
5.5.5.5 from 11.22.33.44 via 99.88.22.1 dev eth0
Итак, я отправляю пакеты с 11.22.33.44 на 192.168.1.1 вместо 11.22.33.1, и он работает на МНОГИХ конфигурациях, не задавая вопросов МНОГИМ провайдерам.
Q1: Почему это работает?
Q2: Какой способ добавления нескольких шлюзов лучше? (11.22.99.1 для источника 11.22.99.44, 11.22.33.1 для источника 11.22.33.44)
добавление нескольких, как показано ниже, хорошая идея или маршрутизация на основе src лучше?
auto eth0:0
iface eth0:0 inet static
address 11.22.33.44
netmask 255.255.255.0
broadcast 11.22.33.255
gateway 11.22.33.1
auto eth0:1
iface eth0:1 inet static
address 11.22.99.44
netmask 255.255.255.0
broadcast 11.22.99.255
gateway 11.22.99.1
Спасибо за помощь!
Это работает благодаря протоколу ARP и таблицам маршрутизации. Когда сервер не знает, куда отправить пакет для IP-адреса в сетевом блоке, интерфейс настроен на маршрутизацию, он отправит запрос ARP и обновит свою таблицу ARP ответом. Ваш сервер также будет отвечать на запросы APR для всех поддерживаемых им IP-адресов. Для других адресов трафик будет направлен на настроенный маршрутизатор для наименьшего настроенного сетевого блока, который поддерживает IP-адрес назначения.
Если у вас только один интерфейс, весь внешний трафик будет маршрутизироваться через этот интерфейс. Остальные будут отправлены на маршрутизатор, у которого должны быть маршруты ко всем устройствам. Вам действительно не нужно добавлять маршруты помимо маршрутов по умолчанию для маршрутизатора и маршрута по умолчанию.
Когда у вас несколько интерфейсов, все становится сложнее. В этом случае вам может потребоваться добавить маршруты для нелокальных сетевых блоков, которые маршрутизируются через маршрутизаторы на интерфейсе, отличном от того, который имеет маршрут по умолчанию.
Если у вас есть IP-адреса в нескольких сетевых блоках на одном интерфейсе, лучше добавить их в интерфейс, а не в интерфейс обратной связи. Обычно, когда я работаю с серверами, которые имеют адреса в нескольких сетевых блоках, каждый сетевой блок находится на отдельном интерфейсе.
Наличие вторичных IP-адресов на интерфейсе обратной связи может разрешить конфликты портов, когда приложение должно быть настроено для ответа на трафик на интерфейсе. Это может вызвать проблемы для другого приложения, использующего тот же порт на дополнительных IP-адресах.
Linux использует сильная оконечная система модель, которая означает, что IP-адреса принадлежат машине, а не ее интерфейсам. Маршрут не может причинить никакого вреда, потому что системе не нужно направлять пакет на собственный IP-адрес, поэтому с сетевой маской 255.255.255.255 маршрут ничего не делает. Таким образом, эффект состоит в том, чтобы просто сообщить системе, что у нее есть дополнительный IP-адрес, и это все, что нужно.