DD-WRT 上的 PPTP 客户端互相不通:五项检查
在 PPP 链路上,255.255.255.255 掩码是正确的。按顺序做五项检查:地址池、CHAP 条目、对端路由、FORWARD 策略以及上网意图。
两台笔记本拨入 DD-WRT 上的 PPTP 服务器,各自都拿到了地址,却谁也 ping 不通谁。共享文件夹始终不出现,第一个念头往往是路由器下发的 255.255.255.255 掩码一定有问题。它不是病根,改掉它也不会凭空多出一个邻居。请按顺序做完下面五项检查,哪一项失败就停在哪一项,因为每一项的治法都不一样。
检查一:/32 不是缺陷
PPTP 承载的是 PPP,而一条 PPP 链路只连接两个端点:你的客户端和服务器。子网掩码描述的是哪些地址共享同一个本地网段,而这里根本没有网段,只有一根线另一头的对端。全一掩码恰恰说明的就是这件事,所以 DD-WRT 给出的值对这种链路类型是正确的。这个地址是对端地址,不是局域网里的接口地址。
255.255.255.0 掩码属于几百台设备共享的介质,把它放到 PPP 接口上同样不会让隧道另一头变成邻居。
检查二:读一读 PPTP 服务器页面上的值
真正要紧的设置在服务、VPN、PPTP 服务器里。启用服务器,把服务器地址设为路由器的 LAN 地址,并让客户端地址段留在 DHCP 池之外,免得拨入的客户端和有线机器拿到同一个地址。在 CHAP-Secrets 下按 username * password * 的形式为每个账户加一行,名字里不能有空格。应用之后再连接,所用配置要写明路由器以及其中一个账户。
客户端停在哪一步,就说明该查哪一层。通过认证却拿不到地址,是地址池或密钥的问题;拿到了地址却什么都到不了,是路由或防火墙的问题。
检查三:在两个对端之间找一条路由
每一条终结在路由器上的隧道都是独立接口,通常是 ppp0、ppp1 之类。从一个客户端到另一个客户端的流量必须在这些接口之间被路由,而且路由器得愿意转发它。在路由器上执行 ip route,看看每个已连接的对端是否都有一条指向对应 PPP 接口的主机路由。只要有一个对端缺路由,不管客户端状态页面怎么说,隧道都不算完全建立。
两条主机路由分别指向两个独立的 ppp 接口,这才是继续往下走之前该有的样子。
检查四:看 FORWARD 链,而不是 INPUT
客户端之间的流量是被转发的,不是本地被接受的,所以 INPUT 链是错的地方。执行 iptables -L FORWARD -v -n,找一找抓住 PPP 接口的丢弃规则,再看看包计数器有没有任何东西到达这条链。默认丢弃策略加上没有为隧道流量放行的规则,产生的正是你一开始遇到的现象:单个客户端都正常,凑在一起就彼此看不见。
如果小包 ping 能通、大传输卡住,那是隧道在被分片,而不是被阻断。PPP 上的 PPTP 通常要 MTU 和 MRU 落在 1450 附近,留在 1500 就会得到一条握手能过、真实负载却失败的链路。
检查五:决定上网该怎么做
要让客户端经办公室上网,需要朝 WAN 接口做源地址转换。只让客户端访问局域网,则只需一条路由,别的一概不要。这是两种不同的意图,对应两套不同的规则,而掩码这个问题把第二个决定整个遮住了。在加第一条规则之前,先写下你想要的行为,因为客户端意外从办公室线路出去,是在会上而不是在日志里爆出来的意外。
最后一点与修法无关:PPTP 已经过时,它的认证坏了很多年。上面的清单依然解释了 PPP 链路在做什么,如果你以后把客户端迁到现代隧道,同样的推理照样成立。