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

因此在此之后,来自本地机器的流量被重定向,我看到的互联网就像我在远程网络中一样!
但内部机器不能访问互联网。

里面机器已设置好, 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 地址)。

默认情况下,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 代理

相关内容