Как маршрутизировать трафик через разные интерфейсы в зависимости от номера порта?
iptables -A PREROUTING -i usb0 -t mangle -p tcp --dport 8080 -j MARK --set-mark 1
iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
// направляем трафик с отметкой 1 в таблицу myusb0
ip rule add fwmark 1 table myusb0
ip route ls
192.168.0.0/24 dev usb1 proto kernel scope link src 192.168.0.136 metric 1
192.168.3.0/24 dev usb0 proto kernel scope link src 192.168.3.182 metric 1
IP-правило ls
0: from all lookup local
32762: from all fwmark 0x1 lookup myusb0
32763: from 192.168.3.0/24 lookup myusb0
32764: from 192.168.0.1/24 lookup myusb1
32766: from all lookup main
32767: from all lookup default
ip route ls table myusb0
default via 192.168.3.2 dev usb0
ip route ls table myusb1
default via 192.168.0.1 dev usb1
// открываем носки на порте 8080
ssh -f -N -D 0.0.0.0:8080 root@192.168.3.182
// проверяем работает ли
curl --socks5 192.168.3.182:8080 ip.appspot.com
channel 1: open failed: administratively prohibited: open failed
curl: (7) Failed to receive SOCKS5 connect request ack.
У меня есть два интернет-соединения от двух разных интернет-провайдеров, и я хотел бы открыть прокси /socks5 на каждом. Я подумал, что имеет смысл связать каждый интерфейс с номером порта, чтобы мы могли управлять соединениями.
Я создал две таблицы маршрутизации (myusb0
а также myusb1
) для каждого устройства (usb1
а также usb0
), затем пометил трафик на основе номера порта (например, на порту 8080
Я отмечаю это 1) и маршрутизирую трафик на этой отметке к определенной таблице (myusb0
). Затем я попытался открыть socks5 на этом IP и попробовал его локально, но по некоторым причинам он не работает.
После того, как я установил его работу локально, я думаю, что должен открыть носки в обратном порядке, чтобы я мог сделать его доступным для удаленных серверов, которым необходимо его использовать.
Любая идея, почему это не работает в настоящее время и как я должен это исправить? По некоторым причинам, я думаю, что соединение socks пытается использовать шлюз по умолчанию из главной таблицы, который не настроен на использование порта. 8080
Отметьте правило и попробуйте таблицу myusb0. Я использую Ubuntu (последняя версия).
Следует отметить, что оба провайдера предоставляют динамические IP-адреса
редактировать
Как я и подозревал, похоже, что трафик на порт 8080 не маршрутизируется (не говоря уже о проблеме с носками), но я не знаю почему
curl portquiz.net:8080
curl: (7) Couldn't connect to server
1 ответ
На самом деле, когда вы делаете:
$ ssh -f -N -D 0.0.0.0:8080 root@192.168.3.182
$ curl --socks5 192.168.3.182:8080 ip.appspot.com
Происходят следующие события:
- CURL открывает TCP-соединение от [YOUR-HOST]:[RANDOM-PORT] к серверу SOCKS, на котором работает SSHD 192.168.3.182:8080
- SSHD принимает соединение
- CURL просит SSHD открыть новое соединение с 192.168.3.182:[RANDOM-PORT] на ip.appspot.com:80
- SSHD пытается открыть TCP-соединение и терпит неудачу
- SSHD возвращает сообщение об ошибке: "канал 1: открытие не удалось: административно запрещено: открытие не удалось"
SSHD не может открыть новое соединение, потому что IP-пакеты, предназначенные для ip.appspot.com:80, генерируются в маршрутизаторе, а не маршрутизируются через него. Из-за этого пакеты не получают метку, ядро пропускает таблицы myusb0 и myusb1, а отсутствие соответствующей записи маршрута в основной таблице приводит к ошибке недоступности сети. Если вы хотите управлять локально сгенерированными пакетами, правая цепочка в таблице mangle будет иметь значение ВЫХОД, а не ПРЕДОХРАНЕНИЕ.
О проблеме теста порта:
$ curl portquiz.net:8080
curl: (7) Couldn't connect to server
Пожалуйста, проверьте конфигурацию маршрутизатора:
В основной таблице есть шлюз по умолчанию?
$ ip route show
Включена ли пересылка пакетов?
$ cat /proc/sys/net/ipv4/ip_forward
Пакеты являются NATed?
$ iptables -t nat -nvL # iptables -t nat -A POSTROUTING -o myusb0 -j MASQUERADE # iptables -t nat -A POSTROUTING -o myusb1 -j MASQUERADE