У меня есть брандмауэр / маршрутизатор на базе 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).
Любая помощь или предложения будут с благодарностью приняты!