VPN IP地址会变吗?网站看到的到底是哪个IP
会变。挂上代理之后,绝大多数网站看到的是节点的地址,你家宽带那个地址它拿不到。但"绝大多数"这四个字里藏着两个例外,而且恰恰是最容易出问题的地方。
搜 VPN IP地址的人,多半真正想问的是下一个问题:网站到底能拿到哪些地址,哪个才算数。
比"会不会变"更值得搞清楚的是另一件事:一个网站想拿你的 IP,手上有好几个来源,可信程度差得很远。选错来源的代价不只是统计不准。我们自己的后台就因为读错了一个字段,让一批用户白白拿不到注册赠金,这个坑下面细说。
网站怎么知道你的 IP
最底层那个来源没法伪造。TCP 连接建立的时候,服务器内核记下了对端地址,你的数据包得从那儿回去。这就是你的出口 IP。挂了代理,数据包从节点出去,服务器记下的自然是节点的地址。
所以"能不能改 IP"这个问题,答案是能,改的还是最硬的那一层。
麻烦在于现在的网站很少直连。中间通常隔着 CDN、负载均衡、反向代理。每多一层,真正的对端就往后退一步,最里面那台服务器看到的就成了上一跳的地址。为了把访客地址传下去,才有了那一堆 HTTP 头。
一条请求会带好几个地址
下面是一个经过 Cloudflare 的真实请求,落到最里层服务器时的样子:
| 来源 | 这次的值 | 实际是什么 |
|---|---|---|
| TCP 对端地址 | 172.70.123.159 | Cloudflare 边缘节点 |
X-Forwarded-For | 152.32.146.30, 172.70.123.159 | 一条链,越靠前越接近访客 |
X-Real-IP | 172.70.123.159 | 上一跳填的,这里是 CDN 自己 |
CF-Connecting-IP | 152.32.146.30 | Cloudflare 认定的访客地址 |
访客的真实地址是 152.32.146.30。四行里只有两行给对了。
名字最像"真实 IP"的那个 X-Real-IP,在这种结构下反而是错的。它的值由上一跳的代理写入,而上一跳是 CDN,它填的是自己看到的对端,也就是 CDN 自己的节点。读它的程序会把全世界的访客都认成十几个机房地址。
我们自己栽在这上面
写这篇的直接起因是前两天的一次排查。
注册赠金有一条风控规则:同一个 IP 在 24 小时内最多发两次。有用户反馈注册完拿不到钱,查下去发现库里记的 IP 全是 127.0.0.1。
后端读的是"连接对端地址",而后端跑在 nginx 反向代理后面,对端永远是 nginx 自己。全站用户于是共用一个地址,那条风控规则从"防刷"退化成了全局闸门:任意 24 小时内发出两笔赠金,之后所有新用户一律拿不到。
这个问题存在了三个月,期间还没人发现,因为它不报错,只是安静地少发钱。
修复分两层。nginx 侧只信任来自 Cloudflare 网段的连接,并采信 CF-Connecting-IP;应用侧再取转发链的最后一段。两层缺一不可:只做应用侧的话,绕开 CDN 直连源站的人可以随便伪造头。
提这件事是想说明,IP 看着简单,读错一个字段,影响的可能是钱。
三个常见误解
"X-Forwarded-For 的第一段就是真实 IP"
它是普通 HTTP 头,任何人都能在自己的请求里预先塞一个。你读到的第一段,很可能是访客自己写的。只有在你完全掌控整条代理链、每一跳都做过校验的前提下,这条链才有意义。正确读法是从后往前数,数到你信任的那一跳为止。
"挂了代理就一定查不出真实 IP"
TCP 那层确实查不出。但浏览器里还有别的路子能绕开隧道,下一节讲。
"IP 变了就等于匿名"
IP 只是众多标识中的一个。浏览器指纹、Cookie、登录状态,哪个的作用都不比它小。换了 IP 却还挂着同一个登录账号,识别你根本用不着 IP。关于这类判断可以参考VPN 安全软件安全吗那篇里的自查清单。
真正会漏的两条路
WebRTC
浏览器为了做音视频通话,会通过 STUN 服务器去问"我的公网地址是多少"。STUN 本来是为了穿透 NAT 而设计的(NAT 的工作方式可以看NAT 原理是什么),而这个询问过程可能不走系统代理。
浏览器在 2019 到 2020 年打过一轮补丁,把内网地址替换成 .local 形式的随机主机名。但那只遮住了内网地址,公网地址走的是另一条候选路径,补丁管不着。检测页面上如果看到 .local,说明内网地址被遮了,这不代表公网地址也安全。
Chrome 至今没有原生开关。Brave 有,设置里把 WebRTC IP handling policy 改成 Disable non-proxied UDP,代理照常可用,只是不再绕过去。
DNS
域名解析如果走了系统默认的 DNS,解析请求会暴露给你的网络运营商。网站本身看不到你的 IP,但"你访问过哪些域名"这件事漏了出去。全局模式的客户端一般会把 DNS 一并接管;分流模式下要留意规则有没有把 DNS 请求放行。
自己动手验证
三步,都不用装东西:
- 不开代理,打开任意一个显示 IP 的网页,记下地址
- 开代理,刷新,看是否变成了节点地址
- 再打开一个 WebRTC 检测页,看它报出的地址和第 2 步是否一致
第 3 步对不上,说明 WebRTC 绕过去了。第 2 步压根没变,那是代理没生效,或者浏览器命中了直连规则。
至于节点地址本身干不干净,那是另一个问题,可以看节点纯净度查询怎么做。
我们这边怎么分配 IP
每条线路独占一个 IP,不和别人共用。共享 IP 做不到这一点:一个地址后面挂着几十上百人,只要有一个人触发风控,所有人一起承担后果,而且你无从知道是谁干的。
IP 可以单独更换,不必先释放线路再重新申请,剩余时长和流量都不受影响。订阅地址不变,在客户端里刷新一次订阅就能拿到新配置。
节点目前分布在日本东京、香港、美国加利福尼亚三个地区,各自是独立地址。
常见问题
VPN 能改变 IP 地址吗
能。网站通过 TCP 连接的对端地址识别来源,流量从节点出去,对方记录的就是节点地址。例外是 WebRTC 和 DNS 这两条可能绕开隧道的路径。
怎么查自己当前的 IP 地址
打开任意一个 IP 查询页面即可。要判断代理是否真的生效,对比开启前后的结果,再配合一次 WebRTC 检测。
代理 IP 和 VPN 的 IP 有区别吗
对网站而言没有区别,看到的都是出口节点的地址。区别在覆盖范围:系统级隧道接管整机流量,浏览器代理只接管浏览器,其它程序仍然直连。
节点 IP 查询怎么做
客户端里能看到当前线路的节点地址,面板上也有。想进一步查它的风控状态,是"纯净度"的范畴,前面那篇讲得更细。
换了 IP 之后要重新配置客户端吗
不用。订阅地址不变,刷新一次订阅就会拿到新配置,剩余时长和流量都不受影响。