在我的笔记本电脑中,我设置了一个 systemd 服务,建立到我家的 OpenVPN 连接,并让它在启动时自动启动,这样我就可以在任何地方访问我的家庭服务器。
问题是,当我回到家时,它仍然连接到 VPN,并混淆笔记本电脑的路由表,因此我在家时无法访问服务器。
有什么办法吗,我可以让 systemd 服务有条件地启动?
谢谢!
答案1
我不是网络专家,但我认为如果您在家中使用以太网并在其他地方使用 WiFi,则可以做到这一点。在这种情况下,您应该能够通过 VPN 连接路由 WiFi 接口。
答案2
我在这里发布我的解决方案,也许它可以帮助某些人。
我写了一个脚本,会尝试查询我家路由器的 MAC 地址,如果成功(意味着我到家了),就停止连接 VPN。然后修改 systemd 服务文件(vpn-to-home.service),添加一行ExecStartPre=/usr/local/bin/stop-if-lan.sh
。
脚本stop-if-lan.sh:
#!/bin/bash
/usr/bin/ping -4n -c 1 -q -W 1 IP_OF_ROUTER > /dev/null
MAC_ADDRESS=`arp -n | awk '/IP_OF_ROUTER/{print $3;exit}'`
if [ "$MAC_ADDRESS" == "MAC_OF_ROUTER" ] ; then
# echo "We are already at home."
exit 1
fi
exit 0
systemd 的 vpn-to-home.service:
[Unit]
Requisite=network-online.target
After=syslog.target network-online.target
[Service]
Type=idle
RuntimeDirectory=openvpn-client
WorkingDirectory=/run/openvpn-client
PrivateTmp=true
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE
ExecStartPre=/usr/local/bin/check-if-lan.sh
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/client/client-to-home.ovpn
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
ProtectSystem=true
ProtectHome=true
KillMode=process
[Install]
WantedBy=multi-user.target