Пакет ответа на том же интерфейсе, что и входящий в LAN

В настоящее время я борюсь со следующим сценарием:

  • У меня есть сервер с 2 интерфейсами в 2 отдельных подсетях LAN. IF1, IF2
  • У меня есть портативный компьютер с IP-адресом из первой подсети
  • . Когда я пытаюсь подключиться с этого конкретного ноутбука ко второму IP-адресу сервера, я не получаю никакого ответа.

Например, когда я пытаюсь выполнить эхо-запрос 172.31.196.185 с портативного компьютера с IP-адресом 172.31.190.129, я вижу входящие запросы в tcpdump на интерфейсе ens224, но после этого запроса ответа на других интерфейсах нет.

Вот моя сетевая диаграмма:

       +-------------------------+
       |                         |
       |  Laptop 172.31.190.129  +---------+
       |                         |         |
       +-------------------------+         |
                                           |                 +-------------------------+
                                           |                 |                         |
                               +-----------+---------+       |       Linux Server      |
                          +----+                     |       |                         |
                          |    | LAN 172.31.190.0/23 +-------+ IF1  -  default gw      |
                   +------+--+ |                     |       | 172.31.190.63           |
    +----------+   |         | +---------------------+       |                         |
    | Internet +---+ Gateway |                               |                         |
    +----------+   |         | +---------------------+       |                         |
                   +------+--+ |                     |       |                         |
                          |    | LAN 172.31.196.0/23 +-------+ IF2                     |
                          +----+                     |       | 172.31.196.185          |
                               +---------------------+       |                         |
                                                             |                         |
                                                             |                         |
                                                             +-------------------------+

Также у меня есть этот скрипт:

IF1=ens160
IF2=ens224

P1_NET=172.31.190.0/23
P2_NET=172.31.196.0/23

IP1=172.31.190.63
IP2=172.31.196.185

P1=172.31.190.1
P2=172.31.196.1

ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2

ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2

ip rule add from $P1_NET dev $IF1 table T1
ip rule add from $P2_NET dev $IF2 table T2

Который написан в соответствии с этой ссылкой: https://lartc.org/howto/lartc.rpdb.multiple- links.html

В моем случае я пробовал много разных способов сделать маршрутизацию на основе политик, но ни у кого не получилось ...

1
задан 22 January 2020 в 14:24
1 ответ

TL; DR

Нет необходимости в iptables , метках или в ослаблении пересылки / фильтра обратного пути . Вместо правил ip , которые вы использовали, которые не будут соответствовать исходящим пакетам, используйте команды, описанные в предоставленной вами ссылке документации LARTC:

 ip rule add from $ Таблица IP1 T1
добавление правила IP из таблицы $ IP2 T2

тогда все будет нормально работать.


Длинная версия

Даже если всегда можно разрешить работу, ослабив Переадресация / фильтр обратного пути , например, sysctl -w net.ipv4.conf.all.rp_filter = 2 и т. Д., Что позволяет всегда избегать асимметричной маршрутизации. Особенно с учетом того, что шлюз (если он действует как брандмауэр со строгим отслеживанием состояния) или ноутбук также могут не допускать этого по аналогичным причинам.Использование iptables и меток для исправления неправильного поведения, безусловно, не поможет понять, как будет вести себя и без того сложная настройка маршрутизации.

Хотя связанная документация использует IP-адрес сервера в качестве источника (для $ IF2 / ens224 : 172.31.196.185) без интерфейса для правила IP, вы указываете входящий интерфейс в правило ( dev означает iif здесь). Вот в чем проблема: это не тот эффект, на который можно рассчитывать. См. Описание iif в ip rule :

iif NAME

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

Хотя это явно не написано, верно и обратное: пакеты , исходящие от этого хоста, будут соответствовать только интерфейсу обратной связи: они не будут соответствовать ни iif ens160 , ни iif ens224 , но только iif lo (да iif означает входящий интерфейс, а iif lo соответствует локально сгенерированному исходящему ] пакетов, считайте, что это переводится как «входящие из локальной системы [туда, где правила маршрутизации укажут]»). Это имеет значение.

Что происходит тогда:

  1. Портативный компьютер пытается достичь $ IP2 (он не должен знать, что $ IP2 может быть достигнут через серверные $ IF1 и $ IP1 в той же локальной сети), отправляет пакет через Шлюз ,
  2. Шлюз направляет пакет на сервер $ IP2, принадлежащий $ P2_NET, к его интерфейсу $ IF2,
  3. Сервер получает пакет, принадлежащий $ P1_NET (с 172.31.190.129 ) на интерфейсе $ IF2,
  4. Server Strict Reverse Path rp_filter = 1 проверяет обратный маршрут,
  5. Как видно выше, обратный маршрут не соответствует any iif отличается от iif lo : два новых правила не совпадают, поэтому единственное оставшееся правило сопоставления - это правило для основной таблицы маршрутизации: через $ IF1, как проверено с помощью :

     # ip route получить 172.31.190.129 из 172.31.196.185
    172.31.190.129 от 172.31.196.185 dev ens160 uid 0
    тайник
    
  6. Обратный путь не использует интерфейс, с которого пришел пакет: пакет отброшен.

По тем же причинам текущая настройка не позволит корректный доступ к Интернету с сервера при использовании $ IP2: опять же, он не будет соответствовать новым правилам и попытается использовать $ IF1 для этого:

# ip route get 8.8.8.8 from 172.31.196.185
8.8.8.8 from 172.31.196.185 via 172.31.190.1 dev ens160 uid 0 
    cache 

Итак, как только два правила удалены и изменены, как описано в LARTC, на:

 ip rule add из таблицы $ IP1 T1
добавление правила IP из таблицы $ IP2 T2

То есть:

# ip rule add from 172.31.190.63 table T1
# ip rule add from 172.31.196.185 table T2

Все будет работать правильно, как покажет поиск маршрута (теперь используется таблица T2 ):

# ip route get 172.31.190.129 from 172.31.196.185
172.31.190.129 from 172.31.196.185 via 172.31.196.1 dev ens224 table T2 uid 0 
    cache 

# ip route get 8.8.8.8 from 172.31.196.185
8.8.8.8 from 172.31.196.185 via 172.31.196.1 dev ens224 table T2 uid 0 
    cache 

Эти 3 варианта также могли сработать (просто поместив правило в таблицу T2 для краткости):

ip rule add from 172.31.196.0/23 table T2
ip rule add from 172.31.196.185 iif lo table T2
ip rule add from 172.31.196.0/23 iif lo table T2

Обратите внимание, что, как описано на странице руководства, iif lo изменит поведение, если Сервер также маршрутизирует другие системы, находящиеся за ним (опять же, правила не соответствует этим системам): лучше не использовать его без необходимости.

Для этого не нужны iptables и метки. Использование меток для изменения интерфейса может вызвать дополнительные проблемы с маршрутизацией, запросами ARP и фильтрацией обратного пути (использование меток обычно требует ослабления rp_filter ), поэтому лучше не использовать их, если этого можно избежать.

0
ответ дан 22 January 2020 в 23:22

Теги

Похожие вопросы