Описание проблемы:

У меня довольно сложная проблема, когда я не могу понять, как эффективно решить ее; Предположим, есть следующая настройка:

Есть 1 Linux-машина, подключенная к 3 сетям, назовем их A, B и C.

Машина linux может получать доступ в Интернет через сеть A. В этой сети есть частный IP-адрес, но в ней НЕТ NAT; например, любые другие машины, которые маршрутизируются через эту сеть и имеют публичный IP, выданный им, могут подключаться к Интернету через него, но данный компьютер не может этого сделать.

Сеть B является общедоступной сетью IP; набор из нескольких общедоступных сетей. По умолчанию пакеты из B направляются обратно в B, а для всех других пунктов назначения, не входящих в B, маршрутизируются через A.

Сеть C, как и A, также является сетью, в которой у машины есть частный адрес. Однако, здесь NAT включен. Сеть C может использоваться для связи с Интернетом, но устройствам в сети B не разрешается маршрутизировать через C, они должны маршрутизировать через A.

В настоящее время машина Linux не может общаться с Интернетом. Я хочу, чтобы он мог это сделать (например, пинг www.stackoverflow.com не возвращать тайм-аут).

Как указать linux использовать другой шлюз для своего собственного трафика и только для своего собственного трафика (источник или назначение == localhost)?

Важный

Я не хочу направлять весь трафик в интернет только через одну сеть. Трафик, приходящий / уходящий в Интернет, должен использовать две сети, в зависимости от источника: все, от машины linux через одну сеть (C), все, что он маршрутизирует (что не входит в один из его локальных диапазонов), он маршрутизируется через другой (А).

Предварительное решение

Во-первых, я подумал просто добавить 'from/to localhost' в таблицу ip rule , но это не разрешено. Какой самый простой способ разрешить этому маршрутизатору использовать другой маршрутизатор в сети C в качестве шлюза, но только из трафика, исходящего от самой машины?

По сути, я хотел бы получить что-то, что будет эквивалентно приведенному ниже примеру, если это действительно будет работать наивным, интуитивным способом:

0: from all lookup local
32000: from localhost lookup myroute
32100: from all lookup main 
32767: from all lookup default

1 ответ1

0

Я протестировал следующую конфигурацию с двумя сетевыми пространствами имен и двумя парами веток:

+-- Main --+
|          | 192.168.2.21/24
|    wlan0 | ------------------- ...
|          |
|          | 10.0.0.254/24   10.0.0.1/24 +-- NS0 --+
|   veth0a | --------------------------- | veth0b  |
|          |                             +---------+
|          |
|          | 10.0.1.254/24   10.0.1.1/24 +-- NS1 --+
|   veth1a | --------------------------- | veth1b  |
|          |                             +---------+
+----------+

Цель состоит в том, чтобы направить весь трафик от Main к wlan0 (сеть C), в то же время маршрутизируя все от veth0 (сеть A) до veth1 (сеть B).

На wlan0 есть обычный маршрут по умолчанию , полученный через DHCP:

$ ip route
default via 192.168.2.1 dev wlan0 
...

Переадресация включена:

echo "1" | sudo tee /proc/sys/net/ipv4/ip_forward

Мы добавляем маршрут по умолчанию для veth1a в новую таблицу, предполагая, что шлюзом является 10.0.1.1 :

sudo ip route add 10.0.1.0/24 table 250 dev veth1a src 10.0.1.254
sudo ip route add default table 250 dev veth1a via 10.0.1.1

Весь трафик от и до veth0a (10.0.0.0/24) использует эту таблицу:

sudo ip rule add from 10.0.0.0/24 table 250
sudo ip rule add to 10.0.0.0/24 table 250

Если кто-то, стоящий за veth1b (10.0.1.0/24), имеет глупую идею попытаться использовать нас в качестве шлюза, запретите пересылку на wlan0 и пересылку назад, используя ту же таблицу. Обычно это генерирует пакеты ошибок ICMP:

sudo ip rule add from 10.0.1.0/24 table 250
sudo ip rule add to 10.0.1.0/24 table 250

При необходимости адаптируйтесь к вашим настройкам.

Ни один localhost даже не упоминался нигде.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .