我在家里设置了一台 Raspberry Pi(运行 Raspbian)作为媒体服务器,我可以通过 SSH 和其他端口从网络外部访问它(即通过端口 32400 从移动设备使用 Plex 客户端)。最近,我决定订阅一项商业 VPN 服务。我在 Raspbian 上安装并配置了 OpenVPN。
经过长时间的搜索、阅读和测试,我发现了如何在服务器将所有流量从 eth0 重定向到 tun0 时远程 ssh 进入我的服务器。只需运行:
ip rule add from <internal IP of SSH server/VPN client> table 10
ip route add default via <internal IP of gateway/router> table 10
我在 /etc/init.d/ 中添加了几个脚本,用于在启动时打开 VPN 连接,并在 VPN 连接建立后运行上述两个命令(似乎这些规则在重新启动时会重置)。因此,使用上述设置,我可以从工作地点通过 ssh 访问我的服务器,没有任何问题。
我的问题是,在上述环境中,我无法本地 ssh 进入 Raspberry Pi。因此,PlayStation 4 上的 Plex 客户端无法再找到服务器...但是,如果我删除 rc.d 脚本(1/打开 VPN 连接和 2/执行上述两个命令行),我可以从家里和外面连接到服务器 - 但没有运行 VPN :)
我认为我在 ip 路由方面做错了什么,但似乎无法弄清楚是什么。或者可能是因为脚本运行的顺序不正确(尽管 ip 路由命令“Required-Start”vpnconnection 需要建立)
希望这一切都有意义,并且您可以为我指明正确的方向,让我能够从本地和远程网络 ssh 到 pi。我相信答案在于使用路由或推送,但我不确定。
以下是一些可能有用的输出。
在此先感谢您的帮助!
tun0 创建时 route -n 的输出
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.109.1.5 128.0.0.0 UG 0 0 0 tun0
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
10.109.1.1 10.109.1.5 255.255.255.255 UGH 0 0 0 tun0
10.109.1.5 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
128.0.0.0 10.109.1.5 128.0.0.0 UG 0 0 0 tun0
168.1.6.49 192.168.0.1 255.255.255.255 UGH 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
iptables -L -v 的输出
Chain INPUT (policy DROP 44 packets, 5890 bytes)
pkts bytes target prot opt in out source destination
0 0 fail2ban-ssh tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 22
220 143K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
7062 1750K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:32400
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5850
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:4285
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:58846
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8112
1 64 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:72
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
92 15173 ACCEPT all -- * * 192.168.0.0/24 0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 8071 packets, 1231K bytes)
pkts bytes target prot opt in out source destination
Chain fail2ban-ssh (1 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
OpenVPN 客户端配置文件
client
dev tun
proto udp
remote [xxx.yyy.com] [PORT]
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
tls-client
remote-cert-tls server
auth-user-pass
comp-lzo
verb 1
reneg-sec 0
crl-verify crl.pem
auth-user-pass
sysctl -a | grep \.rp_filter 的输出
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.tun0.rp_filter = 0
ip route show 的输出
0: from all lookup local
32765: from 192.168.0.170 lookup 10
32766: from all lookup main
32767: from all lookup default
ip route show table 10 的输出
default via 192.168.0.1 dev eth0
答案1
通过将一台机器连接到 VPN 网络,您可以有效地将其与本地 LAN“隔离”,它将看不到 VPN 网络中的任何其他机器。
所以我认为你的 VPN 设置错了——你想运行 VPN客户在你的偏僻的机器和 VPN服务器在你的当地的LAN - 使本地 LAN 不受影响,并使远程机器感觉与本地 LAN 已连接。