Как изменить IP-адрес источника по умолчанию, чтобы он отличался от адреса, обращенного к маршруту по умолчанию?

Как изменить IP-адрес источника по умолчанию, чтобы он отличался от адреса, обращенного к маршруту по умолчанию?

Исходная информация

  • Я использую систему 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или любое другое имя. Это ваша задача — разобраться с этим в ваших скриптах настройки.


Альтернативные методы установки того же параметра маршрута:

  1. добавить более низкую метрику, когда метрика изначально установлена

    Если была установлена ​​исходная метрика (т. е. она была не 0, а, скажем, 100), вы можете вместо этого добавить альтернативный маршрут по умолчанию с более низкой метрикой, а не заменять предыдущий:

    # ip route add default via 10.0.0.9 dev ppp0 src 192.0.2.1 metric 50
    
  2. выделенное правило маршрутизации

    Если вы опасаетесь взаимодействия с различными инструментами, задействованными в 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 
    
  3. правила маршрутизации с упрощенным маршрутом

    Можно сохранить маршруты в основной таблице и переопределить только маршрут по умолчанию с помощью подавителя на основе префикса в правиле: Это позволит избежать необходимости копированиявсемаршруты: можно просто скопировать и изменить маршрут по умолчанию.

    Заменить 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 и правильно ее маршрутизируйте. Тогда ваш маршрутизатор также сможет выходить наружу.

Связанный контент