В настоящее время я борюсь со следующей ситуацией:
- У меня есть сервер с 2 интерфейсами в 2 отдельных подсетях LAN. IF1, IF2
- У меня есть ноутбук, IP-адрес которого находится в первой подсети.
- Когда я пытаюсь подключиться с этого конкретного ноутбука ко второму IP-адресу сервера, я вообще не получаю ответа.
Например, когда я пытаюсь выполнить ping 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
TL;DR
Нет необходимостиiptables, знаки, ни расслаблятьсяПересылка по обратному пути/фильтр. Вместо ip rule
s, которые вы использовали и которые не подходят для исходящих пакетов, используйте команды, описанные вДокументация LARTCСсылка, которую вы предоставили:
ip rule add from $IP1 table T1 ip rule add from $IP2 table 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 ens160
ни iif ens224
, а только iif lo
(да iif
означаетвходящийинтерфейс и iif lo
совпадения, сгенерированные локальноисходящийпакеты, считайте, что это можно перевести как «входящие из локальной системы [куда угодно, согласно правилам маршрутизации]»). Это имеет значение.
Что происходит потом:
Ноутбукпытается достичь $IP2 (он не знает и не должен знать, что $IP2 может быть достигнут через $IF1 сервера и $IP1 в той же локальной сети), отправляет пакет черезШлюз,
Шлюзнаправляет пакет на $IP2 сервера, принадлежащего $P2_NET, на его интерфейс $IF2,
Серверполучает пакет, принадлежащий $P1_NET (от 172.31.190.129) на интерфейсе $IF2,
СерверСтрогий обратный путь
rp_filter=1
проверяет обратный маршрут,Как показано выше, обратный маршрутне совпадаетлюбое
iif
отличие отiif lo
: два новых правила не совпадают, поэтому единственным оставшимся правилом соответствия является правило для основной таблицы маршрутизации: через $IF1, как проверено с помощью:# ip route get 172.31.190.129 from 172.31.196.185 172.31.190.129 from 172.31.196.185 dev ens160 uid 0 cache
Обратный путь не использует интерфейс, с которого пришел пакет: пакет отбрасывается.
По тем же причинам текущая настройка не позволит обеспечить корректный доступ к Интернету изСерверпри использовании $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 from $IP1 table T1 ip rule add from $IP2 table T2
То есть:
# ip rule add from 172.31.190.63 table T1
# ip rule add from 172.31.196.185 table T2
Все будет работать правильно, как покажет поиск маршрута (теперь с использованием table 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), поэтому лучше не использовать их, если этого можно избежать.