
Исходная информация
Я использую систему Linux для маршрутизации трафика для небольшого блока публичных адресов IPv4 (путем включения переадресации IP в
sysctrl.conf
).Маршрутизатор подключается к интернет-провайдеру
eth1
через PPPoE.Локальный адрес пира, используемый для ppp, — это вручную настроенный IP-адрес, указанный провайдером. Локальный адрес пира —
10.0.0.10
.Удаленный адрес пира, используемый для ppp, также является вручную настроенным IP-адресом, который был указан провайдером. Удаленный адрес пира —
10.0.0.9
.Маршрут маршрутизатора по умолчанию —
10.0.0.9
через10.0.0.10
.Маршрутизатор подключен к коммутатору Ethernet через
eth0
.eth0
настроен на использование одного из публичных адресов.Коммутатор соединяет все остальные публичные хосты. Каждый подключенный хост использует публичный IP-адрес.
10.0.0.9
ISP ----------+
| 10.0.0.10 X.X.X.X
+------------- (eth1) ROUTER (eth0) --------------- SWTICH
|
+-- X.X.X.Y
+-- X.X.X.Z
...
Моя проблема
Все работает как и ожидалось, за исключением программ, запущенных на маршрутизаторе. Любое приложение, которое я запускаю на маршрутизаторе, использует 10.0.0.10
в качестве исходного IP-адреса при инициировании подключений к Интернету. Это понятно, поскольку eth1
именно там доступен Интернет. Однако, поскольку адрес не является публично маршрутизируемым, apt
, ping
, и другие программы не работают. Если я явно указываю исходный адрес в приложениях, которые его поддерживают (т. е. ping
), приложения работают.
Мой вопрос
Как настроить маршрутизатор для маршрутизации неизвестных пакетов через eth1
/, 10.0.0.9
одновременно используя публичный IP-адрес eth0
в качестве источника по умолчанию при инициировании новых подключений?
решение1
Примечание: я буду считать, что локальная сеть вашего маршрутизатора имеет адрес 192.0.2.0/24, а его IP-адрес —eth0192.0.2.1/24, чтобы иметь возможность дать конкретные объяснения и решение.
Ваш провайдер, чтобы сэкономить некоторые публичные IP-адреса, назначил вам частные IP-адреса для внутренней маршрутизации. Это нормально, потому что этот IP никогда не должен быть виден снаружи (и будет быстро удаленСтрогая переадресация по обратному путипо пути, если он когда-либо будет проложен по проводу за пределами маршрутизатора вашего интернет-провайдера, или если нет, то, поскольку он немаршрутизируемый, никогда не получит ответа). Но это усложняет вашу конфигурацию, чтобы избежать необходимости использовать этот IP-адрес во всех случаях, кроме подключения к интернет-провайдеру с вашего маршрутизатора.
У вас, вероятно, есть что-то похожее на это (может немного отличаться, неважно):
# ip route
default via 10.0.0.9 dev ppp0
10.0.0.9 dev ppp0 proto kernel scope link src 10.0.0.10
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.1
Например, возможно, что вместо этого у вас есть default via 10.0.0.9 dev ppp0 src 10.0.0.10
, или что via 10.0.0.9
даже не отображается, так как это ссылка уровня 3, а не уровня 2, что делает ее via
ненужной (но все равно принятой). Просто соответствующим образом измените настройки ниже.
В настоящее время ядро выбирает, по-видимому, наиболее подходящий IP-адрес, установленный на той же стороне, что и для доступа в Интернет, поскольку ничто не указывает ему на иное (или оно явно указывает использовать нежелательный IP-адрес):
# ip route get 8.8.8.8
8.8.8.8 via 10.0.0.9 dev ppp0 src 10.0.0.10 uid 0
cache
Вам просто нужно заменить поведение маршрутизации, когда ядро проверяет, как добраться до интернета, и указать определенный предпочтительный исходный IP-адрес. Помните, что вы можете потерять соединение в случае ошибок и непредвиденных проблем. По возможности используйте альтернативный (консольный) доступ:
# ip route replace default via 10.0.0.9 dev ppp0 src 192.0.2.1
# ip route get 8.8.8.8
8.8.8.8 via 10.0.0.9 dev ppp0 src 192.0.2.1 uid 0
cache
Вот и все, ваш маршрутизатор будет выполнять маршрутизацию как обычно, но при необходимости выбора локального исходящего IP-адреса будет выбран 192.0.2.1, если явно не указано иное (например, процесс явно привязывает исходный IP-адрес к своему сокету).
Этот маршрут должен быть установлен снова каждый раз, когда связь опускается и поднимается. Вам решать, интегрировать ли это в какой-нибудь скрипт pppoe, после того, как связь полностью установлена.
Обратите внимание также, что имя интерфейсаппп0может измениться наппп1или любое другое имя. Это ваша задача — разобраться с этим в ваших скриптах настройки.
Альтернативные методы установки того же параметра маршрута:
добавить более низкую метрику, когда метрика изначально установлена
Если была установлена исходная метрика (т. е. она была не 0, а, скажем, 100), вы можете вместо этого добавить альтернативный маршрут по умолчанию с более низкой метрикой, а не заменять предыдущий:
# ip route add default via 10.0.0.9 dev ppp0 src 192.0.2.1 metric 50
выделенное правило маршрутизации
Если вы опасаетесь взаимодействия с различными инструментами, задействованными в pppoe, которые могут удалить указанный выше маршрут, вы можете установить эту настройку в альтернативной таблице маршрутизации и дать ей приоритет в правилах маршрутизации с частичной копией основной таблицы для предотвращения сбоев. Это все равно придется переделывать после каждого отключения/повторного подключения, потому что маршрут все равно исчезнет. Здесь
iif lo
есть специальный и на самом деле означает "локально созданный исходящий пакет", а не входящий, а 109 — это произвольно выбранное значение таблицы:# ip rule add iif lo lookup 109 # needed only once # ip route add table 109 10.0.0.9 dev ppp0 proto kernel scope link src 10.0.0.10 # to keep using 10.0.0.10 for local link, just in case # ip route add table 109 192.0.2.0/24 dev eth0 src 192.0.2.1 # will disappear if eth0 is brought down # ip route add table 109 default via 10.0.0.9 dev ppp0 src 192.0.2.1 # will disappear if ppp0 is brought down
Если вы добавили другие записи маршрутизации в основную таблицу, скорее всего, вам также придется скопировать их выше.
# ip route get 8.8.8.8 8.8.8.8 via 10.0.0.9 dev ppp0 table 109 src 192.0.2.1 uid 0 cache
правила маршрутизации с упрощенным маршрутом
Можно сохранить маршруты в основной таблице и переопределить только маршрут по умолчанию с помощью подавителя на основе префикса в правиле: Это позволит избежать необходимости копированиявсемаршруты: можно просто скопировать и изменить маршрут по умолчанию.
Заменить 2. на (указав значения предпочтений, по-прежнему располагая их в порядке убывания, как это было бы без их указания):
# ip rule add pref 32765 iif lo lookup 109 # needed only once # ip rule add pref 32764 iif lo lookup main suppress_prefixlength 0 # needed only once # ip rule 0: from all lookup local 32764: from all iif lo lookup main suppress_prefixlength 0 32765: from all iif lo lookup 109 32766: from all lookup main 32767: from all lookup default # ip route add table 109 default via 10.0.0.9 dev ppp0 src 192.0.2.1 # will disappear if ppp0 is brought down
Основная таблица маршрутизации будет использоваться в первую очередь для всего, что не будет маршрутом по умолчанию, затем для локально исходящего трафика маршрут по умолчанию предоставляется в таблице маршрутизации 109. Все остальное будет продолжаться и снова будет выполняться поиск в основной таблице для маршрута по умолчанию, как обычно.
Преимущество перед 2. заключается в том, что нет необходимости дублировать (нестандартные) маршруты из таблицы.основнойв таблицу 109 больше. Ниже таблицаосновнойпредоставляет результат для маршрута, отличного от маршрута по умолчанию, в отличие от метода 2:
# ip route get 8.8.8.8 8.8.8.8 via 10.0.0.9 dev ppp0 table 109 src 192.0.2.1 uid 0 cache # ip route get 192.0.2.2 192.0.2.2 dev eth0 src 192.0.2.1 uid 0 cache
решение2
Как вы и сказали. У других клиентов на коммутаторе с вашим маршрутизатором в качестве шлюза есть публичные IP-адреса. У вашего маршрутизатора их нет. У него есть адрес локальной сети, который не будет маршрутизироваться. Поскольку ваш интернет-провайдер НЕ предоставил вам публичный адрес, маршрутизатор НЕ сможет выйти наружу.
Если у вас есть другой публичный ip, создайте виртуальную конфигурацию eth на eth1 и правильно ее маршрутизируйте. Тогда ваш маршрутизатор также сможет выходить наружу.