
Я пытаюсь перенаправить трафик с локального порта на удаленную машину через 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
порт...
решение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 на том же сервере