我能够设置网络名称空间,使用openvpn建立隧道,并启动在名称空间内使用此隧道的应用程序。到目前为止,一切都很好,但是可以通过Web界面访问此应用程序,但我不知道如何将请求路由到LAN内部的Web界面。
我遵循了@schnouki的指南,解释了如何设置网络名称空间并在其中运行OpenVPN。
ip netns add myvpn
ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
ip netns exec myvpn ip link set lo up
ip link add vpn0 type veth peer name vpn1
ip link set vpn0 up
ip link set vpn1 netns myvpn up
ip addr add 10.200.200.1/24 dev vpn0
ip netns exec myvpn ip addr add 10.200.200.2/24 dev vpn1
ip netns exec myvpn ip route add default via 10.200.200.1 dev vpn1
iptables -A INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o en+ -j MASQUERADE
sysctl -q net.ipv4.ip_forward=1
mkdir -p /etc/netns/myvpn
echo 'nameserver 8.8.8.8' > /etc/netns/myvpn/resolv.conf
之后,可以按预期检查我的外部ip并在名称空间内部和外部获得不同的结果:
curl -s ipv4.icanhazip.com
<my-isp-ip>
ip netns exec myvpn curl -s ipv4.icanhazip.com
<my-vpn-ip>
该应用程序已启动,在此示例中,我使用的是洪水。我尝试了一些具有Web界面的应用程序,以确保它不是特定于洪水的问题。
ip netns exec myvpn sudo -u <my-user> /usr/bin/deluged
ip netns exec myvpn sudo -u <my-user> /usr/bin/deluge-web -f
ps $(ip netns pids myvpn)
PID TTY STAT TIME COMMAND
1468 ? Ss 0:13 openvpn --config /etc/openvpn/myvpn/myvpn.conf
9302 ? Sl 10:10 /usr/bin/python /usr/bin/deluged
9707 ? S 0:37 /usr/bin/python /usr/bin/deluge-web -f
如果指定了veth vpn1的ip,我可以从名称空间内部和外部访问端口8112上的Web界面。
ip netns exec myvpn curl -Is localhost:8112 | head -1
HTTP/1.1 200 OK
ip netns exec myvpn curl -Is 10.200.200.2:8112 | head -1
HTTP/1.1 200 OK
curl -Is 10.200.200.2:8112 | head -1
HTTP/1.1 200 OK
但是我确实想将端口8112从我的服务器重定向到名称空间中的应用程序。目的是在局域网内的计算机上打开浏览器,并使用http:// my-server-ip:8112获取Web界面(my-server-ip是实例化网络接口的服务器的静态ip)
编辑:我删除了尝试创建iptables规则。上面说明了我要尝试执行的操作,以下命令应输出HTTP 200:
curl -I localhost:8112
curl: (7) Failed to connect to localhost port 8112: Connection refused
curl -I <my-server-ip>:8112
curl: (7) Failed to connect to <my-server-ip> port 8112: Connection refused
我尝试了DNAT和SNAT规则,并以良好的方式投入了MASQUERADE,但由于我不知道自己在做什么,所以我的尝试是徒劳的。也许有人可以帮助我整合这个构架。
编辑:的tcpdump输出tcpdump -nn -q tcp port 8112
。毫不奇怪,第一个命令返回一个HTTP 200,第二个命令以拒绝的连接终止。
curl -Is 10.200.200.2:8112 | head -1
listening on vpn0, link-type EN10MB (Ethernet), capture size 262144 bytes
IP 10.200.200.1.36208 > 10.200.200.2.8112: tcp 82
IP 10.200.200.2.8112 > 10.200.200.1.36208: tcp 145
curl -Is <my-server-ip>:8112 | head -1
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
IP <my-server-ip>.58228 > <my-server-ip>.8112: tcp 0
IP <my-server-ip>.8112 > <my-server-ip>.58228: tcp 0
编辑:@schnouki本人向我指出了一篇Debian Administration文章,其中解释了通用iptables TCP代理。应用于当前的问题,他们的脚本如下所示:
YourIP=<my-server-ip>
YourPort=8112
TargetIP=10.200.200.2
TargetPort=8112
iptables -t nat -A PREROUTING --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort
iptables -t nat -A POSTROUTING -p tcp --dst $TargetIP --dport $TargetPort -j SNAT \
--to-source $YourIP
iptables -t nat -A OUTPUT --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort
不幸的是,第ve个接口之间的流量被捕获,没有其他任何反应。但是,@ schnouki还建议将其socat
用作TCP代理,并且运行良好。
curl -Is <my-server-ip>:8112 | head -1
IP 10.200.200.1.43384 > 10.200.200.2.8112: tcp 913
IP 10.200.200.2.8112 > 10.200.200.1.43384: tcp 1495
我尚不了解在通过veth接口穿越流量时奇怪的端口改组,但是现在我的问题已解决。
veth
设备的经验(尽管发现非常有趣,但是... ;-))。您是否曾经使用tcpdump
过检查传入数据包的距离?如果tcpdump -i veth0
未显示任何内容,则tcpdumo -i lo
可能有必要。