iptables透過ssh代理程式轉送非本地流量

iptables透過ssh代理程式轉送非本地流量

我嘗試透過 SSH 將流量從本地端口轉發到遠端計算機代理人(不是隧道)。我了解到,僅使用 iptables 規則無法完成此操作(如果不是這樣,請糾正我),因此我設定了 REDSOCKS 將 TCP 連線重新導向至 SSH SOCKS 代理程式。
我設法使用 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 重定向請執行下列操作:

它透過將目標 IP 更改為主 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代理

相關內容