我已经在 Mythbuntu 14.04 机器上设置了私人互联网访问 VPN,并且我在尝试使用 rTorrent(和 ruTorrent)进行端口转发时束手无策。我的设置是 rTorrent 在专用用户帐户下运行,该用户的所有互联网流量仅通过 OpenVPN 和一些 iptables 规则通过 VPN 进行引导。我从 PIA 收到转发端口,但在 rTorrent 中使用该端口号不会在 ruTorrent Web GUI 中显示该端口被转发。我已经尝试了过多的 iptables 转发规则,但无济于事 - 无论我尝试什么,ruTorrent Web GUI 都会显示 rtorrent 端口被阻止。我使用了端口扫描仪,可以看到外部 VPN IP 地址上分配的端口已打开,而且我还可以看到 rTorrent 正在侦听分配的端口。我已经尝试了在系统范围内运行 OpenVPN 的端口转发,并且 ruTorrent WebUI 显示端口已转发 - 所以我猜测我的问题源于这样一个事实:VPN 仅对一个用户有效,并且我正在使用 iptables 来实现这个——但我不知道如何让它发挥作用。
我用来启动 OpenVPN 的命令(注意 --route-nopull 参数):
sudo openvpn --config /home/prime/.pia/Russia.ovpn --auth-user-pass /home/prime/.pia/passwd --script-security 2 --up /home/prime/.pia/up.sh --down /home/prime/.pia/down.sh --route-nopull --ca /home/prime/.pia/ca.crt --crl-verify /home/prime/.pia/crl.pem
我的 up.sh 文件为“torrent”用户设置 iptable 规则:
#!/bin/bash
iptables -t mangle -I OUTPUT -m owner --uid-owner torrent -j MARK --set-mark 42
iptables -t mangle -I OUTPUT -d 192.168.1.0/24 -m owner --uid-owner torrent -j RETURN
iptables -t nat -I POSTROUTING -o tun0 -j MASQUERADE
ip rule add fwmark 42 table 42
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do
echo 0 > $f
done
ip route add default via $(ifconfig -a tun0 | grep -o 'P-t-P:[^ ]*' | cut -d : -f 2) table 42
sleep 1
ip route flush cache
....applications load from here on
我正在使用的 iptables 规则(我也尝试了很多)无济于事:
#!/bin/bash
PORT=45829
IPADDRESS=$(ifconfig tun0|grep -oE "inet addr: *10\.[0-9]+\.[0-9]+\.[0-9]+"|tr -d "a-z :")
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -I PREROUTING -i tun0 -p tcp -j DNAT --to $IPADDRESS:$PORT
iptables -t nat -I PREROUTING -i tun0 -p udp -j DNAT --to $IPADDRESS:$PORT
#iptables -t nat -I PREROUTING -i tun0 -p tcp --dport $PORT -j DNAT --to-destination $IPADDRESS:$PORT
#iptables -t nat -I PREROUTING -i tun0 -p udp --dport $PORT -j DNAT --to-destination $IPADDRESS:$PORT
iptables -I FORWARD -i tun0 -p udp -d $IPADDRESS --dport $PORT -j ACCEPT
iptables -I FORWARD -i tun0 -p tcp -d $IPADDRESS --dport $PORT -j ACCEPT
iptables -A INPUT -p udp -m state --state NEW --dport $PORT -i tun0 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW --dport $PORT -i tun0 -j ACCEPT