Итак, у меня есть 3 интерфейса на хосте:
Моя цель - направить весь трафик с интерфейса 3 (локальная сеть) через интерфейс vpn, а весь трафик с хоста - через интерфейс по умолчанию1.
# ip route
default via 192.168.1.1 dev eth0
10.8.8.0/24 dev tun0 proto kernel scope link src 10.8.8.27
128.0.0.0/1 via 10.8.8.1 dev tun0
192.168.0.0/24 dev eth2 proto kernel scope link src 192.168.0.1
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.56
(Я читал здесь другие сообщения, но ни один из них не был действительно полезным)
Во-первых: маршрут 128.0.0.0/1 «наполовину по умолчанию» (без его второй половины 0.0.0.0/1 ??) не должен существовать, если маршрутизатор не будет использовать туннель:
# ip route del 128.0.0.0/1 via 10.8.8.1 dev tun0
Поскольку он, скорее всего, устанавливается из программного обеспечения туннеля, разберитесь с его настройкой.
Теперь создайте новую таблицу (случайный выбор: 100) с маршрутом по умолчанию через туннель и используйте ее только для трафика от eth2:
# ip route add default via 10.8.8.1 dev tun0 table 100
# ip rule add iif eth2 lookup 100
Тесты:
Хост использует обычный маршрут по умолчанию независимо от его исходного IP-адреса (согласно вопросу, селектор туннеля от интерфейса, а не IP-адреса):
# ip -o route get 8.8.8.8
8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.56 \ cache
# ip -o route get 8.8.8.8 from 192.168.0.1
8.8.8.8 from 192.168.0.1 via 192.168.1.1 dev eth0 \ cache
Трафик от eth2 будет обрабатываться по-другому:
# ip -o route get 8.8.8.8 from 192.168.0.2 iif eth2
8.8.8.8 from 192.168.0.2 via 10.8.8.1 dev tun0 table 100 \ cache iif eth2
Если вы также хотите, чтобы локальный IP-адрес 192.168.0.1 проходил через туннель. Это немного сложнее, потому что 192.168.0.1 при необходимости должен отправлять IP-пакеты в свою локальную сеть (а не в tun0 в этом случае). Требуется также скопировать маршрут LAN в таблицу 100, добавив правило на основе IP-адреса источника (а затем удалив бесполезное предыдущее правило на основе интерфейса):
# ip route add 192.168.0.0/24 dev eth2 table 100
# ip rule add from 192.168.0.0/24 lookup 100
( # ip rule del iif eth2 lookup 100 )
Что теперь дает также:
# ip -o route get 8.8.8.8 from 192.168.0.1
8.8.8.8 from 192.168.0.1 via 10.8.8.1 dev tun0 table 100 \ cache
Вот и все, что касается маршрутизации. Обратите внимание, что без NAT другому концу туннеля нужен маршрут к 192.168.0.0/24 через 10.8.8.27, иначе он не будет работать. Это должен быть предпочтительный выбор.
Если этот маршрут на удаленном компьютере не установлен, а вместо этого подходит NAT, настройте его с помощью:
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o tun0 -j MASQUERADE
Вы явно не указали, какой интерфейс какой, поэтому я предполагаю:
eth0
(Выход на WAN)tun0
(VPN-туннель)eth2
(LAN)Вы захотите начать с того, что придумаете имя и идентификатор таблицы маршрутизации и добавите их в файл псевдонимов таблицы маршрутизации (обычно /etc/iproute2/rt_tables
) в виде
TABLE_ID TABLE_NAME
где TABLE_ID
является незарезервированным положительным целым числом, например 10.
Поскольку вам нужны все пакеты из eth2
для маршрутизации через VPN вам необходимо добавить маршрут по умолчанию в эту таблицу через туннельный интерфейс
ip route add default dev tun0 table TABLE_NAME
Затем вам нужно будет добавить правило для использования этой таблицы для пакетов из eth2
ip rule add iif eth2 table TABLE_NAME