iptables перенаправляет нелокальный трафик через ssh-прокси

iptables перенаправляет нелокальный трафик через ssh-прокси

Я пытаюсь перенаправить трафик с локального порта на удаленную машину через SSHпрокси(не туннель). Я узнал, что это невозможно сделать только с помощью правил iptables (поправьте меня, если это не так), поэтому я настроил REDSOCKS для перенаправления TCP-подключений на прокси-сервер SSH SOCKS.
Мне удалось перенаправить локальный трафик на удаленную машину с помощью правил iptables в цепочке OUTPUT, но та же концепция в PREROUTING не работает. Цель состоит в том, чтобы заставить локальную машину видеть внешний интернет так, как это было бы в сети удаленной машины (как VPN).

----------                      --------------
| inside |  <-- 10.0.0.0/24 --> |-> iptables |
----------                      |      |     |
                                |      ˇ     |
                                |   redsocks |
                                |      |     |
                                |      ˇ     |                  ----------
                                |     ssh -> | <-- internet --> | remote |
                                --------------                  ----------

Примечание: Я не хочу ничего делать (изменять конфигурацию, добавлять маршруты) на удаленной машине!

SSH-соединение установлено с помощью ssh -D 1337 user@remote.
Redsocks уже настроен и запущен, прослушивает порт 12345.

на средней машине:

OUTSIDE_INTERFACE=wlan0
INSIDE_INTERFACE=eth0
SSH_SOCKS_PORT=1337
REDSOCKS_PORT=12345

# set the ip address
ifconfig $INSIDE_INTERFACE 10.0.0.1 netmask 255.255.255.0

# enable ip forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# reset iptables
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -F
iptables -X

# redirect local traffic, except traffic from redsocks to ssh
iptables -t nat -A OUTPUT -p tcp --dport $SSH_SOCKS_PORT -j RETURN
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports $REDSOCKS_PORT

# redirect traffic from inside
iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-ports $REDSOCKS_PORT

Итак, после этого трафик с локальной машины перенаправляется, и я вижу интернет, как будто нахожусь в удаленной сети!
Но внутренняя машинане могуДоступ к сети Интернет.

(IP-адрес навнутри(Машина уже настроена, протестирована с успешным пингом.)

Я пытался:

  • iptables -t nat -A PREROUTING -s 10.0.0.0/24 -p tcp -j REDIRECT --to-ports 12345
  • добавлениеiptables -t nat -A POSTROUTING -o $OUTSIDE_INTERFACE -j MASQUERADE

Если ятолькоустановить iptables -t nat -A POSTROUTING -o $OUTSIDE_INTERFACE -j MASQUERADEправилоодин, внутренняя машина может получить доступ к Интернету (но не через прокси-сервер).

После попытки подключения я вижу следующую статистику:

# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 10 packets, 641 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   42  2184 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            redir ports 12345

Chain INPUT (policy ACCEPT 43 packets, 2244 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 19 packets, 1164 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   18  1080 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:1337
   18  1080 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            redir ports 12345

Chain POSTROUTING (policy ACCEPT 46 packets, 2825 bytes)
 pkts bytes target     prot opt in     out     source               destination

Насколько я понимаю, это означает, что пакеты с внутренней машины тоже перенаправляются, но потом где-то теряются...


У меня тоже есть вопрос

  • почему ssh трафик не перенаправляется правилом iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports $REDSOCKS_PORT? Я только отфильтровал $SSH_SOCKS_PORTпорт...

блок-схема iptables

решение1

Ладно, проблема была не в правилах iptables, или не в основном.
Iptables REDIRECTсделайте следующее:

Он перенаправляет пакет на саму машину, изменяя IP-адрес назначения на основной.адрес входящего интерфейса(локально сгенерированные пакеты сопоставляются с адресом 127.0.0.1).

И redsocks, по умолчанию, слушают только пакет, пришедший на127.0.0.1, поэтому пакеты с назначением на адрес интерфейса не будут поступать на redsocks.

После изменения конфигурации redsocks наlocal_ip = 0.0.0.0;это сработало.

(Примечание: это только для TCP, для UDP (например, DNS) необходимы дополнительные настройки.)

решение2

В зависимости от вашей ситуации, вам нужно только мониторить redsocks до 10.0.0.1, а затем REDIRECT или DNAT, например.

iptables -t nat -A PREROUTING -p tcp -m tcp --syn -j DNAT --to 10.0.0.1:12345

Я столкнулся с той же проблемой, что и вы. Я был сбит с толку OUTPUT и продолжал слушать на 127.0.0.1.

Ссылка:Маршрутизация VPN-подключения к прокси-серверу Socks на том же сервере

Связанный контент