主机名和国家旗帜看起来像是关于服务器的确凿事实,但两者都不是。一个名字映射到可能变化的地址,其中的词由注册者自行选择。协议、出口位置和日志行为各自都需要独立的证据。先从这个名字实际解析到什么开始,再判断哪些仍然未知。

名字能解析,别的什么都没定

主机名是 DNS 中的一个指针,其背后的记录会因解析器、时段以及客户端偏好的地址族而不同。两个人看同一个目录条目,完全可能合理地连到不同的机器。名字告诉你该请求什么,而不是谁会应答。

查询结果也会在毫无通知的情况下变化,当配置文件固定的是地址而非名字时,这一点尤其重要。写死旧地址的配置文件在运营方迁移服务后会持续失败,而这种失败看起来像端口被封。把解析出的地址留在配置文件旁边,日后再比较时就有基准。这些都不说明另一端由谁运营。

dig +short vpn.example.net A
dig +short vpn.example.net AAAA
dig +short vpn.example.net A @1.1.1.1

传输和身份是两个独立的问题

在主机名上打开网页,只测试一个端口上的一个监听器。OpenVPN、IPsec 和 SSTP 在别处、用各自的端口和协议监听,因此一个能访问的 Web 服务器并不能说明它们。

目录条目和配置文件必须在传输方式、端口和凭据上保持一致。身份由客户端配置时所用的证书链或对端密钥指纹来验证,而不是靠主机名的拼写。名字里带有熟悉项目词汇,只能证明有人注册了它。读取服务出示的证书,把签发者和主体与配置文件所期望的作对比。

openssl s_client -connect vpn.example.net:443 -servername vpn.example.net </dev/null 2>/dev/null |
  openssl x509 -noout -subject -issuer -dates

国别词汇不是位置审计

目录里的 jp 或 de 标签只是一次注册,而 IP 地理位置数据库经常互相矛盾,两者都不该被当作绝对事实。共享主机、任播和单纯的配置错误,都会让观测到的位置偏离标签。

实用的检验是应用自身的路径:它到达哪个地址,以及从会话内部做出口地址检查会显示什么。观测到的出口地址是当时路由的属性,不是附着在名字上的保证。志愿目录又多了一层,因为登记条目的人未必是运营这台机器的人。记下你测了什么、何时测的,而不是条目承诺了什么。

先检查所提供的服务,再检查运营方

传输和身份确定之后,剩下的问题是运营方的行为,而这需要书面证据,而不是推断。隐私政策、公开的联系方式和透明度声明是意图的证据;它们都不能证明实际做法,而三者全无同样也是信息。

对于公开或志愿者运营的节点,应假定出口是共享的,运营者能看到经过它的一切。决定你在隧道里发送什么的,应该是这个假设,而不是主机名。

curl -sSI https://vpn.example.net/ | head -n 5
whois 203.0.113.25 | grep -i -E 'orgname|netname'

让名字做它擅长的事:找到端点并连接上去。除此之外的一切,都得在真正重要的那天单独验证。

相关文章