Ubuntu 22.04下配置StrongSwan VPN时的DNS服务器自动设置问题
我最近正从Windows转用Linux,还是个纯新手,要是问题有点宽泛还请多包涵——Linux系统的庞大体量真的让我有点手足无措。
我有一台防火墙,想通过VPN连接到它,这样就能访问防火墙背后局域网里的资源了。这台防火墙同时也充当DNS服务器,我的其他设备(Windows和Android)连接VPN后都能正常使用防火墙的内部IP作为DNS,完全没问题。
我理解这应该属于Linux里的*Road Warrior(漫游用户)*场景对吧?
我已经通过/etc/ipsec.conf和相关配置文件搭建好了StrongSwan,现在能成功连接VPN,也能访问局域网和外部网络的资源。但有个问题:连接VPN后,系统的DNS服务器并没有自动切换到VPN配置的那个(也就是防火墙的本地IP)。我觉得StrongSwan肯定有办法自动搞定这个,毕竟我的其他设备都能做到,所以想请教下该怎么配置才能让Linux也自动切换DNS呢?
问题原因分析
Ubuntu 22.04默认用systemd-resolved管理DNS配置,而StrongSwan本身不会直接修改系统的DNS设置,得靠额外配置或者工具来实现自动推送和切换,这就是为啥你其他设备能自动切换,Linux却不行的核心原因。
具体解决方案
给你两种常用的方法,选顺手的来就行:
方法一:用StrongSwan自带的DNS插件配置
这是最简单的方式,直接用StrongSwan的内置插件来推送DNS:
- 打开StrongSwan的主配置文件
/etc/strongswan.conf,找到charon区块,添加或修改成以下内容:
charon { plugins { dns { enable = yes server = 192.168.1.1 # 替换成你的防火墙内部IP地址 priority = 200 # 设置高优先级,确保VPN的DNS优先被使用 } } }
- 保存配置后,重启StrongSwan服务让设置生效:
sudo systemctl restart strongswan-starter
方法二:用resolvconf工具配合脚本实现
如果第一种方法没达到预期效果,试试这个更灵活的脚本方式:
- 先安装
resolvconf工具,它能帮我们管理DNS配置的切换:
sudo apt install resolvconf
- 打开你的VPN连接配置文件(要么在
/etc/ipsec.conf的conn段,要么在/etc/ipsec.d/目录下的单独配置文件),在对应的连接配置中添加一行:
conn my-vpn # 这里保留你原来的其他配置项,比如left、right、ike等 leftupdown=/etc/ipsec.d/updown.sh
- 创建
/etc/ipsec.d/updown.sh脚本文件,复制以下内容(记得替换防火墙IP):
#!/bin/bash case "$PLUTO_ACTION" in up) # 连接VPN时添加防火墙DNS到系统配置 echo "nameserver 192.168.1.1" | sudo resolvconf -a tun.$PLUTO_CONNECTION ;; down) # 断开VPN时移除VPN的DNS配置 sudo resolvconf -d tun.$PLUTO_CONNECTION ;; esac exit 0
- 给脚本添加执行权限,否则无法运行:
sudo chmod +x /etc/ipsec.d/updown.sh
- 最后重启StrongSwan服务:
sudo systemctl restart strongswan-starter
验证配置是否生效
连接VPN后,你可以用以下命令查看当前的DNS配置,确认是否已经切换到防火墙的IP:
resolvectl status
也可以查看/etc/resolv.conf文件,但Ubuntu 22.04中这个文件是软链接到systemd-resolved的配置,所以用resolvectl查看的结果更准确。
备注:内容来源于stack exchange,提问作者HCL

