iptablesはSSHプロキシを介して非ローカルトラフィックを転送します

iptablesはSSHプロキシを介して非ローカルトラフィックを転送します

SSH経由でローカルポートからリモートマシンにトラフィックを転送しようとしていますプロキシ(トンネルではありません)。iptables ルールだけでは実行できないことを知りました (正しくない場合は訂正してください)。そこで、TCP 接続を SSH SOCKS プロキシにリダイレクトするように REDSOCKS を設定しました。OUTPUT
チェーンの iptables ルールを使用して、ローカル トラフィックをリモート マシンに転送できましたが、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アドレスは内部マシンはすでに設定されており、ping が成功してテストされています。

私は試した:

  • 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をプライマリIPに変更することで、パケットをマシン自体にリダイレクトします。着信インターフェースのアドレス(ローカルで生成されたパケットは 127.0.0.1 アドレスにマッピングされます)。

そして、レッドソックスは、デフォルトでは、パケットが来ただけを聞きます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 でリッスンし続けました。

参照:同じサーバー上のSOCKSプロキシへのVPN接続のルーティング

関連情報