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

Политика маршрутизации трафика локального пользователя по туннелю

У меня есть брандмауэр / маршрутизатор на базе Linux, на котором запущены iptables и SNAT для трафика, проходящего через него в Интернет через один восходящий канал - это работает нормально. На этом сервере также работает небольшое количество приложений, которые также работают нормально.

У меня также есть клиент OpenVPN, работающий на этом маршрутизаторе, и я хочу направить трафик конкретного локального пользователя по этому туннелю.

У меня есть туннель, который создал интерфейс tun_v.

Я создал новую таблицу маршрутизации (/ etc / iproute2 / rt_tables) v.tunnel и добавляю единственный маршрут по умолчанию в эту таблицу по туннелю.

Я создал IP-правило, чтобы использовать эту таблицу для трафика, помеченного 1

Я отмечаю трафик своего пользователя цифрой 1.

ip route добавить значение по умолчанию через 172.25.26.61 dev tun_v table v.tunnel

IP правило добавить fwmark 1 таблица v.tunnel

iptables -t mangle -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-xmark 0x1 / 0xffffffff

Еще я маскирую трафик на роутере:

iptables -t nat -A POSTROUTING -o wan -j MASQUERADE # это обычный NAT для Интернета

iptables -t nat -A POSTROUTING -o tun_v -j MASQUERADE # Для туннеля

Брандмауэр также по умолчанию отбрасывает цепочки ввода (и пересылки), поэтому я разрешаю связанные:

iptables -A INPUT -i wan -m state --state RELATED, ESTABLISHED -j ACCEPT

iptables -A INPUT -i tun_v -m state --state RELATED, ESTABLISHED -j ACCEPT (есть некоторые другие правила брандмауэра, но не связанные с этим)

Если я генерирую трафик от этого пользователя (с uid 1002) и tcpdump интерфейс tun_v, я вижу, что мой пакет уходит, а ответ возвращается. Однако я никогда не видел, чтобы пакет доходил до моего приложения. ping не показывает никакого ответа, пытаясь установить TCP-соединение, я вижу, что SYN гаснет, SYNACK возвращается, а затем повторная передача TCP SYN прекращается.

Если я добавлю «нормальный» маршрут, который использует этот туннель, например

ip route добавить a.b.c.d через 172.25.26.61

тогда я могу (от любого пользователя) пропинговать указанный сервер.

Я уверен, что мне не хватает чего-то еще, но я не могу понять, что именно. Насколько я понимаю, маршрут, работающий для всех пользователей до a.b.c.d (таблица main), означает, что туннель и все правила iptables верны. Маркировка трафика работает, и применение правильного правила также работает, потому что я вижу, что пакет покидает правильный интерфейс, и возвращается ответ.

Кажется, что где-то есть правило брандмауэра, вызывающее проблему, но, как упоминалось выше, правило проверки туннеля для a.b.c.d работает.

Если я удалю МЕТКУ из iptables, то весь трафик с UID 1002 будет работать (через обычный интерфейс wan).

Любая помощь или предложения будут с благодарностью приняты!