Ubuntu 20.04下OpenVPN未为tun设备分配IP地址及路由的问题
嘿,我看到你在Ubuntu 20.04上用OpenVPN 2.4.12时遇到了头疼的问题——日志明明显示已经执行了设置tun0 IP和路由的命令,但实际用ifconfig查看时,tun0只有IPv6地址,IPv4配置完全没生效对吧?我来帮你梳理几个可能的排查方向:
先把你提供的环境和信息整理清楚,方便定位问题:
环境信息
- 操作系统:Ubuntu 20.04
- OpenVPN版本:2.4.12
你的OpenVPN配置文件
dev tun proto tcp remote ... client resolv-retry infinite persist-key persist-tun cipher AES-256-CBC verb 3 key-direction 1 remote-cert-tls server
OpenVPN启动日志(关键片段)
Sun Jun 9 15:09:52 2024 /sbin/ip link set dev tun0 up mtu 1500 Sun Jun 9 15:09:52 2024 /sbin/ip addr add dev tun0 192.168.--.--/25 broadcast 192.168.90.127 Sun Jun 9 15:09:52 2024 /sbin/ip route add 89.108.--.--/32 via 192.168.--.-- Sun Jun 9 15:09:52 2024 /sbin/ip route add 172.10.--.--/24 via 192.168.--.--
实际ifconfig输出(tun0部分)
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500 inet6 fe80::fd92:92cd:bd13:d553 prefixlen 64 scopeid 0x20<link> unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4 bytes 2...
接下来是具体的排查和解决建议:
确认是否以root权限运行OpenVPN:修改网络配置(比如设置IP、添加路由)需要root权限,如果你是用普通用户启动的OpenVPN,就算日志显示执行了命令,实际也会因为权限不足而失败。试试用
sudo openvpn --config your-config-file.ovpn重新启动,再检查tun0的状态。检查AppArmor的限制:Ubuntu 20.04默认启用了AppArmor,它可能会阻止OpenVPN执行
ip命令修改网络配置。可以临时关闭AppArmor试试:sudo systemctl stop apparmor sudo systemctl disable apparmor然后重启OpenVPN,看看IP和路由是否生效。如果生效了,再考虑为OpenVPN调整AppArmor策略,而不是一直关闭它。
增加日志 verbosity 查看详细错误:当前日志是
verb 3,信息量不够,改成verb 5后重启OpenVPN,这样能看到更详细的执行过程,比如执行ip命令时有没有抛出权限被拒或者其他错误提示。修改配置文件里的verb 3为verb 5,重新启动后查看完整日志。排查NetworkManager的干扰:Ubuntu 20.04默认用NetworkManager管理网络,它可能会接管tun设备并覆盖OpenVPN的配置。可以试试禁用NetworkManager对OpenVPN的管理,或者直接用systemd服务来启动OpenVPN:
- 先停止NetworkManager(注意:会断开当前网络,确保你能通过其他方式操作机器):
sudo systemctl stop NetworkManager - 然后重新启动OpenVPN,再检查tun0状态。如果生效了,再考虑配置NetworkManager和OpenVPN兼容的方式。
- 先停止NetworkManager(注意:会断开当前网络,确保你能通过其他方式操作机器):
检查
ip命令路径是否正确:日志里用的是/sbin/ip,Ubuntu 20.04里这个路径是存在的,但如果你的系统里ip命令在/usr/sbin/ip,可以试试在OpenVPN配置里添加script-security 2和up "/usr/sbin/ip link set dev tun0 up mtu 1500"这类指定路径的命令,不过这个可能性比较低,先优先排查前面的点。
备注:内容来源于stack exchange,提问作者V. Kuznetsov

