所以我的最终目标是利用 OpenVPN 连接到远程 IP 摄像机。我选择 OpenVPN 的原因是尝试克服运营商级 NAT,它阻止我进行端口转发和拥有静态 IP,而无需每月支付 $$$ 的费用。
下面是拓扑结构的样子,现在我可以从站点 B 和 C ping 站点 A LAN(192.168.1.0)上的设备,这很好,证明 VPN 正在运行。
但是我无法从站点 A 或站点 B(我的最终目标)ping 位于站点 B(192.168.2.0)的 IP 摄像头。
我仍然不能 100% 确定我的配置是否正确或者我是否遗漏了某些东西。
OpenVPN 服务器(Debian 8)和 Raspberry Pi 上都启用了 net.ipv4.ip_forward=1。
我正在考虑的另一件事是我是否需要将 IP 摄像机的默认网关设置为 Raspberry Pi 的 IP?
拓扑:
服务器配置
port 1194
proto udp
dev tun
topology subnet
mode server
tls-server
server 10.8.0.0 255.255.255.0
push "dhcp-option DNS 8.8.8.8"
client-config-dir ccd
client-to-client
route 192.168.2.0 255.255.255.0 10.8.0.3
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
keepalive 10 120
comp-lzo
user nobody
group nogroup
daemon
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
cipher AES-128-CBC
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log 20
log /var/log/openvpn.log
verb 3
在/etc/openvpn/ccd/flexo_client中
push "route 192.168.1.0 255.255.255.0 10.8.0.1"
iroute 192.168.2.0 255.255.255.0[/oconf]
客户端配置
client
dev tun
proto udp
remote x.x.x.x 1194
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ns-cert-type server
key-direction 1
cipher AES-128-CBC
comp-lzo
verb 1
mute 20
topology subnet
ca - XML
cert - XML
key -XML
tls-auth - XML
OpenVPN 服务器上的路由表 - 站点 A
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth0
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.2.0 10.8.0.3 255.255.255.0 UG 0 0 0 tun0
Raspberry Pi 路由表 - 站点 B
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.1 0.0.0.0 UG 303 0 0 wlan0
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
192.168.2.0 0.0.0.0 255.255.255.0 U 303 0 0 wlan0
编辑:
路由器上的静态路由(192.168.1.254)- 站点 A
Destination Gateway Genmask
192.168.2.0 192.168.1.143 255.255.255.0
10.8.0.0 192.168.1.143 255.255.255.0
答案1
我正在考虑的另一件事是,我是否需要将 IP 摄像机的默认网关设置为 Raspberry Pi 的 IP?
是的。只有 Raspberry Pi 知道将针对 VPN 的流量发送到哪里。
另一个选项是在 Raspberry Pi 上使用 SNAT/MASQUERADE 设置 iptables,这样来自 VPN 网络的每个连接的源 IP 都会设置为 Raspberry Pi IP。
答案2
将 IP 摄像头的默认网关设置为 Raspberry Pi 的 IP 至少应该可以从 vpn 子网访问它(如果您无法在路由器上定义路由,则作为最后的解决办法)。作为替代方案,如果可能的话,您也可以将下面(站点 B)的路由添加到 IP 摄像头。
从网络角度来看,将路由添加到路由器的路由表更为简洁,这将使整个网络不仅可以访问 IP 摄像机,还可以相互访问。
只是为了确保(这发生在我身上),请检查 Debian 服务器或 Raspberry Pi 上没有任何冲突的防火墙规则。
我已经测试了你的配置,如果你添加这些路线,它应该可以工作:
向站点 B 的路由器添加路由
Destination Gateway Genmask
192.168.1.0 192.168.2.254 255.255.255.0
10.8.0.0 192.168.2.254 255.255.255.0 (optional)
仅当 openvpn 服务器计算机上的任何其他服务需要访问站点 B 上的客户端或站点 B 上的客户端需要10.8.0.1
直接通过 IP 访问这些服务时,才需要第二条路由。
在站点 A 的路由器上添加路由
Destination Gateway Genmask
192.168.2.0 192.168.1.143 255.255.255.0
10.8.0.0 192.168.1.143 255.255.255.0 (optional)
仅当 Raspberry Pi 上的任何其他服务需要访问站点 A 上的客户端或站点 A 上的客户端需要10.8.0.3
直接通过 IP 访问这些服务时,才需要第二条路由。
由于我的 openvpn 服务器在路由器机器上运行,因此我无法完全测试站点 A 上的路由。
解释:当 IP 摄像机(或站点 B 上的任何其他客户端)从 openvpn 子网或站点 A 子网获取数据包时,它没有到这些子网的路由,并将响应路由到其默认网关(路由器站点 B)。此网关(如果它知道这些路由)将数据包路由到下一个“网关”(Raspberry Pi)。
将固定 IP 推送到你的 Raspberry Pi,通过将以下行添加到您的/etc/openvpn/ccd/flexo_client
文件(假设flexo_client
是您的 Pi 的证书 CN 名称):
ifconfig-push 10.8.0.3 255.255.255.0
否则,如果您的 Pi 获得不同的 IP 地址,您可能会失去连接,因为您的路由不再正确。
以下是对您的 openvpn 配置的一些额外提示,但它们不会对您的问题产生任何影响。
在服务器配置中指令
mode server
tls-server
不是必需的,因为它们由server 10.8.0.0 255.255.255.0
指令暗示并扩展如下(参见手册页):
mode server
tls-server
push "topology subnet"
ifconfig 10.8.0.1 255.255.255.0
ifconfig-pool 10.8.0.2 10.8.0.254 255.255.255.0
push "route-gateway 10.8.0.1"
此外,push "dhcp-option DNS 8.8.8.8"
除非您确实需要,否则不应强制执行该指令,因为连接到您的 openvpn 服务器的客户端应从其 DHCP 服务器获取 DNS 选项。它只对 Windows 客户端有效,在非 Windows 客户端上,它将保存在环境变量中,以供在 up 脚本中可选使用。
该daemon
指令也不应该被要求(如果我错了请纠正我),因为它会导致所有消息和错误输出被发送到 syslog 工具,这不会产生任何影响,因为该log
指令正在取代它。有关详细信息,请参阅手册页。
在客户端配置中替换指令
ns-cert-type server
经过
remote-cert-tls server
如果可能的话,因为这是弃用的行为,并且默认情况下 Easy-RSA 3 不启用它,除非您在使用 CA 签署证书之前启用“Netscape”扩展。请参阅openvpn 维基页