我有一个装有 OpenVPN 的 Ubuntu 12.04 盒子。VPN 工作正常 - 客户端可以连接、浏览网页等。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
是否可以通过 sshuttle 隧道将流量从 OpenVPN 客户端转发到远程 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
[编辑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
[编辑 3:还有更多的调试输出] IP 转发似乎在 OpenVPN 服务器上正确启用:
# 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
客户端路由表:
$ 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>
来自客户端的跟踪路由:
$ 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
答案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"
确保让 10.10.0.0 框知道返回客户端的路由。另外,不要忘记允许 IP 转发