Назад | Перейти на главную страницу

Маршрутизировать только пакеты с определенного интерфейса через VPN

Итак, у меня есть 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

Вы явно не указали, какой интерфейс какой, поэтому я предполагаю:

  • Интерфейс 1 есть eth0 (Выход на WAN)
  • Интерфейс 2 есть tun0 (VPN-туннель)
  • Интерфейс 3 есть 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