为什么 DHCP 保留地址不是 VPN 服务器的静态 IP
保留项匹配的是客户端标识,而不是某台机器,它也永远不会让你的公网 IP 变成静态。真正决定家庭 VPN 服务器地址的是什么。
我把一台家用 VPN 盒子从 Wi-Fi 换到网线,它那个“永久”地址当晚就变了。路由器本身没坏。保留项匹配的是无线网卡,而那块网卡已经不在路径上了。
同一个误解还有另一半。修好 LAN 地址对朋友连接的那个地址毫无作用,也和 VPN 分给客户端的私有地址池没有关系。三个地址、三种彼此独立的失效方式,其中只有一种是保留项的职责。
保留项匹配的是客户端,而不是设备
在 DHCPv4 中,保留项以客户端的硬件地址为准;在 DHCPv6 中,则以客户端应当保留的 DUID 为准。hostname 字段只是给人看的标签。路由器真正比较的,是请求里带来的那个标识。
把这条记录当成条件来读:当这个标识来请求,就给它这个地址。只要匹配还在,续租就保持同一份租约,重启也不过是再请求一次。标识一换,请求就错过保留项,客户端拿到动态池给什么算什么。没有报错,没有警告,只是换了个地址。
OpenWrt 把这个形态摆得很清楚。/etc/config/dhcp 里的一个 config host 块把名字、MAC 和地址绑在一起,而静态租约的文档说明了这条记录与地址池的互动方式。别的路由器把同样三个字段藏在不同的标签后面。
匹配悄悄落空的地方
换硬件是最常见的情况。换掉网卡,或者把机器在网线与 Wi-Fi 之间挪一下,路由器看到的地址就跟着变。旧保留项还留在列表里,看上去依然正确。
重装是第二种情况,而且在 IPv6 上最要命。新装系统可能生成新的 DUID,而旧的 IPv4 租约仍然有效,于是 v4 地址还能撑一阵,v6 那条记录却在没有任何可见修改的情况下失效了。
第三种是被钉死的客户端标识。不少 DHCP 客户端允许你设定一个标识字符串,而不用 MAC。一次升级或一次配置重写把这个设置丢了,匹配就消失,哪怕机器根本没挪窝。
第四种是重复:同一台主机同时留着旧块和新块。服务器按能匹配上的那条规则回应,往往正是你想避开的池地址。删掉旧记录,而不是再加一条。
主机侧配置,以及它的代价
在主机上直接写死地址,等于把匹配这回事整个拿掉。不管 DHCP 答不答,接口都会带着这个地址起来,而这正是路由器重启后仍必须可达的机器所需要的。
代价是所有权。前缀、网关和解析器现在都由你提供,你还得自己把地址放在动态池之外。在 Ubuntu 上用 netplan,由 /etc/netplan/01-vpn.yaml 承担这件事:
network:
version: 2
ethernets:
eth0:
dhcp4: false
addresses: [192.168.50.10/24]
routes:
- to: default
via: 192.168.50.1
nameservers:
addresses: [192.168.50.1]NetworkManager 用户用 nmcli con mod "Wired connection 1" ipv4.method manual ipv4.addresses 192.168.50.10/24 ipv4.gateway 192.168.50.1,接着用 nmcli con up "Wired connection 1",也能到同样的状态。第一次尝试请用 netplan try 而不是 netplan apply;网关打错一个数字就会把盒子踢下线,让你去找控制台。
仍然保留一条匹配的保留项。它并不多余。这条记录在路由器一侧固定了地址,也防止日后有人扩大地址池时,DHCP 服务器把那个地址发给访客设备。
稳定的 LAN 地址不是公网入口
把端口转发指向 192.168.50.10,规则就能扛住 LAN 侧的每一次变动。它并不会给你一个稳定的公网地址。你的公网 IP 属于运营商,重新拨号或换光猫都可能让它挪位,动态 DNS 就是为这个存在的。
在运营商级 NAT 后面根本没有可转发的公网 IPv4,任何保留项也变不出一个。先看路由器的 WAN 页面:地址若落在共享段里,入站转发无论保留项多干净都跑不通。
第三个地址是隧道池,通常类似 10.8.0.0/24。这些地址只存在于隧道内部,从不出现在 LAN 上。把它们和服务器 LAN 地址混为一谈,正是端口最后被转发到一个只有连上时才在线的客户端的原因。
按它出问题的顺序检查路径
先从路由器开始。把租约表里的记录和保留项的目标对一遍;如果服务器拿到的是池地址,说明标识不对,主机上的 ip link show 会给出可比对的值。
再看主机。ip -4 addr show eth0 应报出预期的地址和前缀。同一接口上出现第二个地址,通常意味着 DHCP 还在你的静态配置旁边跑着。
然后是转发。确认目标仍然等于你刚核对的地址,并确认有东西在 ss -lntp 上监听。指向关闭端口的转发,从外面看和坏掉的转发一模一样。
最后从外面收尾,用一台关掉 Wi-Fi 的手机。正是这一项测试,把“本地地址不对”和“公网可达性坏了”分开,而这套配置总把这两件事混在一起。
把三个地址写下来:LAN、公网和隧道池,并注明各自归哪个系统管。下个月连接出问题时,你就知道该查哪一个,而不是三个一起改。