为什么 VPN 之后 Plex 远程访问会失效,以及如何修复
VPN 之后的 Plex 远程访问需要三个环节:提供商处的端口转发、本地 pf 重定向,以及填入 Plex 的同一个外部端口。
VPN 接管默认路由的那一刻,远程访问就变成不可用,而同一台服务器仍然照常向局域网串流,毫无怨言。Plex 日志里没有任何内容解释这一变化,因为出问题的并不是 Plex:它公布的地址已经收不到流量。在客户之间共用同一个公网地址的提供商,会把一个端口转发到你的隧道地址,而你本机上仍有东西必须把这个端口搬到 Plex 监听器上。只有三个环节都对齐同一个外部端口,可达性测试才会变绿。
整条链路共有三个环节,而 Plex 只能看到最后一环
提供商拥有一个公网地址,并把其中一个端口映射到你的隧道地址。你的机器接收到达该端口的一切,再把它重定向到 Plex 监听器,后者通常坐在回环端口 32400 上。随后 Plex 被告知外部端口号,好让它自己的探测与外界的拨号一致。
只要断掉任何一个环节,Web 界面就会报告远程访问不可用,却不会提示是哪个环节出了问题。正是这种沉默,让人们反复重启服务器、重装应用、来回切换开关,指针却纹丝不动。三个环节各自独立失效:指向过期隧道地址的转发、只覆盖 Ethernet 接口的重定向,以及仍然保留 32400 的 Plex 字段,都会产生同样的红字。与其猜测,不如从监听器往外查,出问题的环节通常会在一分钟内自己暴露。
第一环:在 VPN 提供商处转发端口
打开提供商的端口转发页面并添加一条映射。多数实现会给你一个随机的外部端口,让你自己选择内部端口,所以接受分配,并把它指向客户端当前持有的隧道地址。把这个号码记下来,因为后面每一步都要原样重复它。
在重新连接时轮换映射的提供商,是这套配置只能撑一个晚上、随后就失效的常见原因。有的允许你申请固定端口,有的每次握手都重新分配,所以在动别的东西之前,先读一读当前的映射页面。
第二环:用 pf 锚点重定向端口
在 macOS 上,重定向属于 pf 锚点,每个能承载数据包的接口一条规则。先写隧道规则,再写 Ethernet 规则,两边使用同一个外部端口,否则故障切换期间从 Wi-Fi 进来的流量就无处落地。
# /etc/pf.anchors/plex.forward
rdr pass on tun0 inet proto tcp from any to any port 41893 -> 127.0.0.1 port 32400
rdr pass on en0 inet proto tcp from any to any port 41893 -> 127.0.0.1 port 32400
锚点文件本身什么也不做,主配置必须引用并加载它。把这两行放进 /etc/pf.conf 里,放在任何现有重定向规则之前,然后重新加载,读回内核真正接受了什么。
rdr-anchor "plex"
load anchor "plex" from "/etc/pf.anchors/plex.forward"
sudo pfctl -vnf /etc/pf.anchors/plex.forward
sudo pfctl -f /etc/pf.conf
sudo pfctl -s nat
关于未知端口的语法报错,说明你的修改里还残留着占位符。nat 表为空则说明锚点从未加载,而且当前 macOS 默认不启用 pf,所以 sudo pfctl -E 属于修复的一部分,而不是可选项。每次重启之后、每次改动映射之后都要重新加载锚点。把锚点文件纳入版本控制,这样提供商换端口时只需改一行,而不用重新摸索。
第三环:在 Plex 内部固定同一个端口
在 Plex 中打开设置,依次进入服务器、远程访问,勾选允许手动指定端口的那一栏。填入提供商的外部端口而不是 32400,然后让可达性测试跑起来。较新的版本把这一控件从旧的 Connect 页面移走了,所以如果字段不在攻略所说的位置,就到远程访问下面找。
从局域网测试根本说明不了任何问题。同一 Wi-Fi 下的笔记本电脑会直接连到服务器,所以即使公网路径已经死了,探测照样成功。用一部走蜂窝数据的手机,或者任何位于你网络之外的主机,从那里拨公网地址和外部端口。
在怪罪 Plex 之前,逐环确认
先从监听器开始,逐步向外。如果 Plex 只绑定了局域网地址,它就会忽略指向回环的重定向,所以第一条命令要证明它究竟在哪里监听。
sudo lsof -nP -iTCP:32400 -sTCP:LISTEN
接下来要证明重定向确实存在,并且与你交给提供商的那个端口一致。nat 表应当在两个接口上都显示同一个外部端口。
sudo pfctl -s nat | grep 41893
nc -vz 203.0.113.42 41893
最后那条命令要在网络之外执行,而不是在 Mac 上。如果蜂窝数据能完成 TCP 连接,而 Plex 仍显示不可用,说明端口已经到达监听器,剩下的可疑对象就是填进 Plex 字段的号码。如果完全没有回应,断裂就在上游:提供商的映射、隧道地址,或者没有启用的 pf。