背景
为了工作,我必须使用 VPN 客户端 Appgate SDP。它创建了一个 tun0 设备,添加了一堆(300 多个)路由,并应该使用 tun0 的域搜索来设置 DNS 服务器。上周的某个时候,DNS 配置停止工作,我无法再将服务器名称解析为 IP 地址。我怀疑某些更新(无论是 NetworkManager 还是已解决的)可能导致了这种情况,但我真的不知道。
从技术上讲,这是 Appgate 应该解决的问题,但与此同时,我是否可以编写一个对我来说最好的解决方案。
部分解决方案
使用 nmcli 的小脚本,我能够在 tun0 上配置 DNS 和搜索域,并且我的 DNS 解析再次正常工作。
nmcli con mod tun0 ipv4.dns "10.x.x.x"
ncmli con mod tun0 ip4.dns-search "~example.com"
这种方法的唯一问题是,运行我的脚本后,Appgate 添加的所有路由都消失了。我检查了 Appgate 日志,此应用程序使用这种ip route add
方式添加的路由在运行后不会保留nmcli
。
问题
有什么方法可以解析并重新添加这些路线吗nmcli
?
# Setup DNS for tun0
nmcli con mod tun0 ipv4.dns "10.x.x.x"
ncmli con mod tun0 ip4.dns-search "~example.com"
# Code to parse the current tun0 routes into memory
. . .
# Add routes for tun0
for route in "${routes[@]}"
do
nmcli con mod tun0 +ipv4.routes "route"
done
奖金
此时,每次使用 Appgate 时,我实际上只需要 tun0。我是否可以在连接到 Appgate 时将所有流量路由到 tun0,然后在退出 Appgate 时将所有路由重置为 eth0?
答案1
谷歌搜索并尝试了几次,我终于得到了一个可用的脚本
正如 Esa 在他们的评论中指出的那样,我的脚本应该在添加 DNS 之前获取路由,因为如果我添加 DNS,它将删除所有路由。
经过一些测试后,我得出了以下结论:
# Code to parse the current tun0 routes into memory
rts=($(route | grep tun0 | awk '{print $1}'))
# Setup DNS for tun0
nmcli con mod tun0 ipv4.dns "10.x.x.x"
ncmli con mod tun0 ip4.dns-search "~example.com"
# Add routes for tun0
for i in "${rts[@]}"
do
nmcli con mod tun0 +ipv4.routes "$i/32"
done
# Reapply rules
nmcli device reapply tun0