Ubuntu 16.04 OpenVPN DNS泄露:如何仅使用VPN提供的DNS?
搞定这个DNS泄露问题不难,在Ubuntu 16.04里这是个挺常见的场景,我给你几个按优先级排序的解决方案,你一步步试:
1. 修改OpenVPN配置文件(最推荐,一劳永逸)
直接让OpenVPN接管DNS的控制权,连接时自动替换系统DNS,断开后恢复。
- 找到你的OpenVPN配置文件(通常是
/etc/openvpn/client.conf或者你自己导入的.ovpn文件),用编辑器打开:sudo nano /etc/openvpn/client.conf - 在文件末尾添加这两行:
这两行是调用Ubuntu自带的script-security 2 up /etc/openvpn/update-resolv-conf down /etc/openvpn/update-resolv-confupdate-resolv-conf脚本,它会自动处理resolv.conf的替换和恢复,完美适配OpenVPN的生命周期。 - 保存退出后,重启OpenVPN服务生效:
如果你的OpenVPN是用传统service管理的,就用:sudo systemctl restart openvpn@clientsudo service openvpn restart
2. 锁定resolv.conf防止被篡改
如果第一种方法没生效,可能是有其他进程(比如networking服务)在偷偷修改resolv.conf,那我们直接把它锁起来:
- 先备份原配置,以防万一:
sudo cp /etc/resolv.conf /etc/resolv.conf.backup - 连接VPN,确认
resolv.conf里已经是VPN提供的DNS后,给文件加只读锁:sudo chattr +i /etc/resolv.conf - 注意:断开VPN前一定要解锁并恢复原配置,不然系统会没有可用DNS:
sudo chattr -i /etc/resolv.conf && sudo cp /etc/resolv.conf.backup /etc/resolv.conf
3. 从源头移除network/interfaces的DNS配置
如果不想依赖脚本或锁文件,可以直接把系统自带的DNS配置删掉:
- 编辑
/etc/network/interfaces:sudo nano /etc/network/interfaces - 找到类似
dns-nameservers x.x.x.x的行,把它注释掉(前面加#)或者直接删除。 - 重启网络服务让修改生效:
这个方法的缺点是:VPN断开后系统会没有默认DNS,你需要手动临时添加或者配置fallback的DNS服务器。sudo systemctl restart networking
额外检查:排除NetworkManager的干扰
如果你用的是Ubuntu默认的NetworkManager管理网络,它可能会自动添加DNS,导致泄露:
- 打开NetworkManager的图形界面,找到你的网络连接(有线或无线),进入IPv4设置页签。
- 把“DNS服务器”字段留空,或者选择“自动(仅地址)”选项,这样NetworkManager只会获取IP地址,不会自动添加DNS。
- 重启NetworkManager服务:
sudo systemctl restart network-manager
内容的提问来源于stack exchange,提问作者BrettM
相关产品推荐
相关产品推荐

