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

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

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 таблица myusb0

default via 192.168.3.2 dev usb0 

ip route ls таблица myusb1

default via 192.168.0.1 dev usb1

// открываем socks на порту 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

Собственно, когда вы это делаете:

$ 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: [СЛУЧАЙНЫЙ ПОРТ] к ip.appspot.com:80
  4. SSHD пытается открыть TCP-соединение и терпит неудачу
  5. SSHD возвращает сообщение об ошибке: «канал 1: открыть не удалось: административно запрещено: открыть не удалось»

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

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

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

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

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

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

    $ cat /proc/sys/net/ipv4/ip_forward
    
  3. Пакеты проходят через NAT?

    $ iptables -t nat -nvL
    # iptables -t nat -A POSTROUTING -o myusb0 -j MASQUERADE
    # iptables -t nat -A POSTROUTING -o myusb1 -j MASQUERADE