Как маршрутизировать трафик через разные интерфейсы в зависимости от номера порта?

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

Происходят следующие события:

  1. CURL открывает TCP-соединение от [YOUR-HOST]:[RANDOM-PORT] к серверу SOCKS, на котором работает SSHD 192.168.3.182:8080
  2. SSHD принимает соединение
  3. CURL просит SSHD открыть новое соединение с 192.168.3.182:[RANDOM-PORT] на ip.appspot.com:80
  4. SSHD пытается открыть TCP-соединение и терпит неудачу
  5. SSHD возвращает сообщение об ошибке: "канал 1: открытие не удалось: административно запрещено: открытие не удалось"

SSHD не может открыть новое соединение, потому что IP-пакеты, предназначенные для ip.appspot.com:80, генерируются в маршрутизаторе, а не маршрутизируются через него. Из-за этого пакеты не получают метку, ядро ​​пропускает таблицы myusb0 и myusb1, а отсутствие соответствующей записи маршрута в основной таблице приводит к ошибке недоступности сети. Если вы хотите управлять локально сгенерированными пакетами, правая цепочка в таблице mangle будет иметь значение ВЫХОД, а не ПРЕДОХРАНЕНИЕ.

О проблеме теста порта:

$ curl portquiz.net:8080 
curl: (7) Couldn't connect to server

Пожалуйста, проверьте конфигурацию маршрутизатора:

  1. В основной таблице есть шлюз по умолчанию?

    $ ip route show
    
  2. Включена ли пересылка пакетов?

    $ cat /proc/sys/net/ipv4/ip_forward
    
  3. Пакеты являются NATed?

    $ iptables -t nat -nvL
    # iptables -t nat -A POSTROUTING -o myusb0 -j MASQUERADE
    # iptables -t nat -A POSTROUTING -o myusb1 -j MASQUERADE
    
Другие вопросы по тегам