
У меня система Ubuntu 20, и я пытаюсь создать туннель между своей системой и удаленным сервером, поскольку моя клиентская система не может иметь входящий/исходящий TCP-трафик.
Я создал виртуальный интерфейс tun0 и хочу, чтобы TCP-пакеты направлялись только на этот интерфейс, чтобы моя программа могла их прочитать, обернуть пакет в другой протокол (например, DNS) и отправить его в конечную точку моего туннеля.
Я уже добился маршрутизации всего трафика со своего компьютера на интерфейс, но это лишит мою систему возможности передавать другой трафик, не связанный с TCP (например, пинговать мой маршрутизатор или google.com).
Правила, которые я использовал:
sudo ip route del default
sudo ip route add default via 10.1.0.1 dev tun0
sudo ip route add 192.168.1.127 via 192.168.1.1 dev ens33
Где 192.168.1.1 — мой gw по умолчанию, 10.1.0.1 — мой tun0 ip, 192.168.1.127 — мой сервер ip.
Как можно маршрутизировать только TCP-трафик?
решение1
Мне удалось добиться этого, используя другую таблицу маршрутизации и отметив определенные пакеты для маршрутизации с использованием этой таблицы.
Чтобы создать маршрут по умолчанию к IP-адресу моего интерфейса tun:
ip route add default via 10.0.0.1 table 3
Чтобы пометить исходящие TCP-пакеты:
iptables -t mangle -A OUTPUT -p tcp -j MARK --set-mark 2
И наконец, чтобы убедиться, что эти пакеты маршрутизируются с помощью таблицы 3, правило IP для пересылки помеченных пакетов:
ip rule add fwmark 2 table 3