我家里有一台服务器,有内部IP 192.168.1.100
。我使用动态 DNS 服务,这样http://foo.dynu.com
我外出时也可以访问它。当我家里有笔记本电脑时,我知道我可以通过将以下行添加到/etc/hosts
.
192.168.1.100 foo.dynu.com
但是,有没有办法自动应用此重定向仅有的当我使用家庭网络时? (我通常通过特定的 wifi 连接进行连接,尽管我偶尔通过以太网进行连接。如果这使问题变得复杂,那么我很乐意仅将其设置为 wifi 连接。)我使用网络管理器。
另外,我通过 VPN 连接到互联网,因此我的 (OpenWRT) 路由器上的任何配置都不太可能起作用。
答案1
根据@garethTheRed 在评论中的建议,我创建了一个网络管理器调度程序挂钩。
在 处创建以下文件/etc/NetworkManager/dispatcher.d/99_foo.dynu.com.sh
。当检测到新的网络连接(即以太网或 WiFi)时,此过程就会进行。然后,它以两种方式识别我的“家庭网络”:BSSID/SSID 和路由器分配给我的静态 IP。 (目前,当我通过以太网连接时,它不起作用,因为这种情况相对较少。)如果我们位于家庭网络中,它会将映射附加到主机文件中;如果没有,那么它会删除这一行。
#!/bin/sh
# Map domain name to internal IP when connected to home network (via wifi)
# Partially inspired by http://sysadminsjourney.com/content/2008/12/18/use-networkmanager-launch-scripts-based-network-location/
WIFI_ID_TEST='Connected to 11:11:11:11:11:11 (on wlp3s0)
SSID: WifiName'
LOCAL_IP_TEST='192.168.1.90'
MAPPING='192.168.1.100 foo.dynu.com'
HOSTS_PATH=/etc/hosts
IF=$1
STATUS=$2
# Either wifi or ethernet goes up
if [ "$STATUS" = 'up' ] && { [ "$IF" = 'wlp3s0' ] || [ "$IF" = 'enp10s0' ]; }; then
# BSSID and my static IP, i.e. home network
if [ "$(iw dev wlp3s0 link | head -n 2)" = "$WIFI_ID_TEST" ] && [ -n "$(ip addr show wlp3s0 to ${LOCAL_IP_TEST})" ]; then
grep -qx "$MAPPING" "$HOSTS_PATH" || echo "$MAPPING" >> "$HOSTS_PATH"
else
ESC_MAPPING="^$(<<<"$MAPPING" sed 's/\./\\./g')$"
sed -i "/${ESC_MAPPING}/d" "$HOSTS_PATH"
fi
fi