Цель: маршрутизировать весь интернет-трафик из eth0 -> tun0 -> tun1 для VPN с двойным переходом. Правильна ли следующая таблица маршрутизации для этой цели?
$ ip route показать:
0.0.0.0/1 via 10.8.1.1 dev tun1
default via 10.8.3.1 dev tun0 proto static metric 50
10.8.1.0/24 dev tun1 proto kernel scope link src 10.8.1.6
10.8.3.0/24 dev tun0 proto kernel scope link src 10.8.3.4 metric 50
101.133.213.73 via 10.8.3.1 dev tun0
127.0.0.0/8 dev lo scope link
128.0.0.0/1 via 10.8.1.1 dev tun1
191.72.65.45 via 182.160.0.1 dev eth0 proto static metric 100
182.160.0.0/24 dev eth0 proto kernel scope link src 182.160.0.19 metric 100
182.160.0.0/24 dev eth0 proto dhcp scope link src 182.160.0.19 metric 208
182.160.0.1 dev eth0 proto static scope link metric 100
решение1
eth0 : 182.160.0.19/24 (GW: 182.160.0.1)
tun0 : 10.8.3.4/24 (GW: 10.8.3.1 / VPN endpoint : 191.72.65.45 via eth0)
tun1 : 10.8.1.6/24 (GW: 10.8.1.1 / VPN endpoint : 101.133.213.73 via tun0)
Таким образом, весь трафик (включая входящий с tun0) будет маршрутизироваться через tun1, за исключением локального трафика на Ethernet (182.160.0.0/24) и локального трафика на tun0 / «VPN1» (10.8.3.0/24).
С этой таблицей маршрутизациитакже весь трафик, идущий от eth0, будет маршрутизироваться через tun1что не упомянуто/не запрошено в вопросе... Устраивает ли вас такая ситуация? Если ответ да, то вы можете сохранить эту настройку.
В случае, если такая ситуация нежелательна (вы не хотите направлять трафик с eth0 на tun1 / tun0), у вас есть (как минимум) два варианта, как с этим справиться.
- «пользовательская» таблица маршрутизации
Может быть больше одной таблицы маршрутизации, и на основе правила/политики вы можете управлять тем, какой трафик будет обрабатываться не той, которая установлена по умолчанию. Таким образом, вы можете задать пользовательскую таблицу маршрутизации, где GW по умолчанию будет tun1, и только трафик, приходящий из tun0, будет направлен на эту пользовательскую таблицу маршрутизации.
- Сетевое пространство имен
Таким образом, вы можете изолировать все интерфейсы tun от eth0 (с внутренней маршрутизацией между пространствами имен), чтобы иметь простую (по умолчанию) таблицу маршрутизации, настроенную в пространстве имен, так что только трафик из tun0 сможет достичь tun1.
решение2
Если предположить, что желаемая последовательность — трафик из вашей локальной сети должен идти от локальной машины -> tun0 -> tun1, то, скорее всего, именно это и происходит, однако это происходит таким образом, который не виден в трассировке маршрута.
Возьмем пакет, отправленный на произвольный интернет-адрес — в этом примере я буду использовать 8.8.8.8.
Компьютер подбирает пакет и ищет, как его отправить. Он видит, что его следует отправить через tun1 (потому что 2 маршрута ниже эквивалентны маршруту по умолчанию, но более ограничены, поэтому предпочтительнее маршрута по умолчанию - в этом случае попадает первый маршрут) -
0.0.0.0/1 via 10.8.1.1 dev tun1
128.0.0.0/1 via 10.8.1.1 dev tun1
Но вот часть, которая может быть неочевидной. Если вы посмотрите на конфигурацию для tun1, вы обнаружите, что у него есть конечная точка, которая является 101.133.213.73. Для этого IP-адреса есть определенный маршрут, который проходит через tun0
101.133.213.73 via 10.8.3.1 dev tun0
Аналогично, есть и другой маршрут
191.72.65.45 via 182.160.0.1 dev eth0 proto static metric 100
Этот маршрут делает трафик, отправляемый через tun0, напрямую доступным через интерфейс Ethernet.
Поскольку это очень специфический маршрут, трафик на 101.133.213.73 будет проходить через tun0. Таким образом, весь трафик, текущий в интернет (через tun1), должен проходить через 101.133.213.73, который сам по себе является туннелем,так что да, данные будут передаваться через оба туннеля.
Traceroute не покажет этого, потому что пакет не знает, что он туннелируется через туннель. Тем не менее, вы все равно можете проверить, что это происходит, посмотрев на более низкие уровни - Генерация трафика, в то время как в другом окне выполнив "sudo tcpdump -n -i any". Вы увидите, что всякий раз, когда пакет отправляется в более широкий Интернет, пакет будет отправлен через каждый из eth0, tun0, tun1, и то же самое будет верно для возвращенных пакетов. Все пакеты, связанные с tun0, будут иметь цель 101.133.213.73.