通过 sshuttle 隧道从客户端发送 openvpn 流量的 iptables 规则?

Sam*_*tin 5 ubuntu iptables openvpn

我有一个带有 OpenVPN 的 Ubuntu 12.04 盒子。VPN 按预期工作——客户端可以连接、浏览 Web 等。OpenVPN 服务器 IP 是 tun0 上的 10.8.0.1。

在同一个机器上,我可以使用 sshuttle 隧道进入另一个网络以访问 10.10.0.9 上的 Web 服务器。sshuttle 使用以下 iptables 命令来发挥它的魔力:

iptables -t nat -N sshuttle-12300
iptables -t nat -F sshuttle-12300
iptables -t nat -I OUTPUT 1 -j sshuttle-12300
iptables -t nat -I PREROUTING 1 -j sshuttle-12300
iptables -t nat -A sshuttle-12300 -j REDIRECT --dest 10.10.0.0/24 -p tcp --to-ports 12300 -m ttl ! --ttl 42
iptables -t nat -A sshuttle-12300 -j RETURN --dest 127.0.0.0/8 -p tcp
Run Code Online (Sandbox Code Playgroud)

是否可以将来自 OpenVPN 客户端的流量通过 sshuttle 隧道转发到远程 Web 服务器?我最终希望能够在服务器上设置任何复杂的隧道,并让相对“愚蠢”的客户端(iPad 等)能够通过 OpenVPN 访问远程服务器。

下面是场景的基本图:

网络图

[编辑:从 OpenVPN 框中添加输出]

$ sudo iptables -nL -v -t nat
Chain PREROUTING (policy ACCEPT 1498 packets, 252K bytes)
 pkts bytes target     prot opt in     out     source               destination
 1512  253K sshuttle-12300  all  --  *      *       0.0.0.0/0            0.0.0.0/0

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

Chain OUTPUT (policy ACCEPT 584 packets, 43241 bytes)
 pkts bytes target     prot opt in     out     source               destination
  587 43421 sshuttle-12300  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain POSTROUTING (policy ACCEPT 589 packets, 43595 bytes)
 pkts bytes target     prot opt in     out     source               destination
 1175 76298 MASQUERADE  all  --  *      eth0    10.8.0.0/24          0.0.0.0/0

Chain sshuttle-12300 (2 references)
 pkts bytes target     prot opt in     out     source               destination
   17  1076 REDIRECT   tcp  --  *      *       0.0.0.0/0            10.10.0.0/24       TTL match TTL != 42 redir ports 12300
    0     0 RETURN     tcp  --  *      *       0.0.0.0/0            127.0.0.0/8


$ sudo iptables -nL -v -t filter
Chain INPUT (policy ACCEPT 97493 packets, 30M bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 131K  109M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
 1370 89160 ACCEPT     all  --  *      *       10.8.0.0/24          0.0.0.0/0
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
Run Code Online (Sandbox Code Playgroud)

[编辑 2:更多 OpenVPN 服务器输出]

$ netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         192.168.1.1     0.0.0.0         UG        0 0          0 eth0
10.8.0.0        10.8.0.2        255.255.255.0   UG        0 0          0 tun0
10.8.0.2        *               255.255.255.255 UH        0 0          0 tun0
192.168.1.0     *               255.255.255.0   U         0 0          0 eth0
Run Code Online (Sandbox Code Playgroud)

[编辑 3:还有更多调试输出] 在 OpenVPN 服务器上似乎正确启用了 IP 转发:

# find /proc/sys/net/ipv4/conf/ -name forwarding -ls -execdir cat {} \; 
18926 0 -rw-r--r-- 1 root root 0 Mar 5 13:31 /proc/sys/net/ipv4/conf/all/forwarding 
1 
18954 0 -rw-r--r-- 1 root root 0 Mar 5 13:31 /proc/sys/net/ipv4/conf/default/forwarding 
1 
18978 0 -rw-r--r-- 1 root root 0 Mar 5 13:31 /proc/sys/net/ipv4/conf/eth0/forwarding 
1 
19003 0 -rw-r--r-- 1 root root 0 Mar 5 13:31 /proc/sys/net/ipv4/conf/lo/forwarding 
1 
19028 0 -rw-r--r-- 1 root root 0 Mar 5 13:31 /proc/sys/net/ipv4/conf/tun0/forwarding 
1
Run Code Online (Sandbox Code Playgroud)

客户端路由表:

$ netstat -r 
Routing tables 

Internet: 
Destination Gateway Flags Refs Use Netif Expire 
0/1 10.8.0.5 UGSc 8 48 tun0 
default 192.168.1.1 UGSc 2 1652 en1 
10.8.0.1/32 10.8.0.5 UGSc 1 0 tun0 
10.8.0.5 10.8.0.6 UHr 13 0 tun0 
10.10.0/24 10.8.0.5 UGSc 0 0 tun0 
<snip>
Run Code Online (Sandbox Code Playgroud)

来自客户端的跟踪路由:

$ traceroute 10.10.0.9 
traceroute to 10.10.0.9 (10.10.0.9), 64 hops max, 52 byte packets 
1 10.8.0.1 (10.8.0.1) 5.403 ms 1.173 ms 1.086 ms 
2 192.168.1.1 (192.168.1.1) 4.693 ms 2.110 ms 1.990 ms 
3 l100.my-verizon-garbage (client-ext-ip) 7.453 ms 7.089 ms 6.248 ms 
4 * * * 
5 10.10.0.9 (10.10.0.9) 14.915 ms !N * 6.620 ms !N
Run Code Online (Sandbox Code Playgroud)

rfe*_*urg 1

有几个问题需要澄清,基本上,您希望 openvpn 客户端能够访问 openvpn 服务器的功能,主要是目标 ssh 服务器子网 (10.10.0.1)。正确的?

openvpn 服务器是否可以访问它应该访问的所有内容?如果是这样,我相信这只是一个路由问题,告诉 openvpn 客户端,任何前往 10.10.0.1/24 的路由都会通过 10.8.0.1。

如果我遗漏了什么,请告诉我。

如果没有,您可以告诉 openvpn 也为其后面的网关进行路由,并将这些路由推送到客户端。

push "route 10.10.0.0 255.255.255.0"
Run Code Online (Sandbox Code Playgroud)

确保让 10.10.0.0 盒子知道返回客户端的路由。另外,不要忘记允许 ip 转发