OpenVPN客户端访问同VPS托管Web服务显示原IP 如何配置VPN专属路由
答案
可以实现,你遇到的问题核心原因是VPN客户端访问VPS公网IP的Web服务时,流量默认走公网路由回路,没有经过OpenVPN的虚拟网卡链路回包,导致Web服务识别到的是客户端原始公网IP。
配置步骤
- 首先确认你的OpenVPN配置参数:虚拟网卡名(默认通常为
tun0)、VPN内网网段(默认通常为10.8.0.0/24)、虚拟网卡网关IP(默认通常为10.8.0.1),后续步骤中替换为你自己的实际值即可。 - 配置流量标记与策略路由,让VPN客户端访问VPS本地的流量走虚拟网卡链路:
- 给从虚拟网卡入站、目标为VPS公网IP的流量打标记
iptables -t mangle -A PREROUTING -i tun0 -d <你的VPS公网IP> -j MARK --set-mark 0x1 - 新增专用路由表
echo "200 vpnlocal" >> /etc/iproute2/rt_tables - 配置专用路由表的默认路由走OpenVPN虚拟网卡
ip route add default via 10.8.0.1 dev tun0 table vpnlocal - 添加规则让打了标记的流量走专用路由表
ip rule add fwmark 0x1 table vpnlocal priority 100
- 给从虚拟网卡入站、目标为VPS公网IP的流量打标记
- 配置Web服务的访问控制规则,仅允许VPN内网网段访问专属路由。以Nginx为例,配置参考:
location /vpn-only-path/ { allow 10.8.0.0/24; deny all; } - 测试验证:连接VPN后访问Web服务的专属路由,查看Web服务访问日志,此时记录的访问IP应为客户端的VPN内网IP,而非原始公网IP。
注意事项
- 上述iptables和路由规则需要配置开机自启,避免VPS重启后配置失效
- 不要在iptables的nat表中配置针对tun0入站访问本地流量的MASQUERADE(地址伪装)规则,否则会导致Web服务识别到的是虚拟网卡网关IP而非客户端的VPN内网IP
- 如果你的OpenVPN使用tap模式,将配置中的
tun0替换为对应的tap网卡名即可
内容的提问来源于stack exchange,提问作者user16713982
相关产品推荐
相关产品推荐

