我正在尝试在 centos 7 上使用 openvpn 作为客户端。它运行良好,但我无法从服务器获取 DNS。如你所知,新版 Centos 中没有 resolvconf,因此标准的 update-resolv-conf 脚本不起作用。
我稍微改写一下:
/bin/bash #!/bin/bash # # 从 openvpn 解析 DHCP 选项以更新 resolv.conf # 在 openvpn *.conf 中使用设置为“up”和“down”的脚本: # 启动 /etc/openvpn/update-resolv-conf # 降低 /etc/openvpn/update-resolv-conf # # 使用了 Thomas Hood 编写的 resolvconf 脚本片段 # 和克里斯·汉森 # 根据 GNU GPL 授权。请参阅 /usr/share/common-licenses/GPL。 # 07/2013[电子邮件保护]固定互联网名称 # 05/2006[电子邮件保护] # # 从 openvpn 设置的示例环境: #foreign_option_1 ='dhcp 选项 DNS 193.43.27.132' # foreign_option_2 ='dhcp 选项 DNS 193.43.27.133' # foreign_option_3 ='dhcp-option DOMAIN be.bnc.ch' # foreign_option_4 ='dhcp-option 域搜索 bnc.local' 设置-e ## 您可能需要在此处手动设置路径,即 #RESOLVCONF=/usr/bin/resolvconf# #RESOLVCONF=$(哪个解析配置) #[ -x $RESOLVCONF ] || 退出 0 #仅限IPv4! NMCLI=/usr/bin/nmcli #$(哪个 nmcli) SYSTEMCTL=/usr/bin/systemctl #$(哪个 systemctl) [ -x $NMCLI ] || 退出 0 [ -x $SYSTEMCTL ] || 退出 0 #从控制台运行的测试版本 active_con_dev=$($NMCLI -t -f NAME,DEVICE con show --active | grep "tun" | head -1) #它必须是类似 #active_con_dev=$($NMCLI -t -f NAME,DEVICE con show --active | grep "$dev" | head -1) active_con=$(echo $active_con_dev | awk'{print $1}'FS=":") active_dev=$(echo $active_con_dev | awk'{print $2}'FS=":") dns_list_file=/etc/openvpn/dns_list 案例 $script_type 在 向上) #我们采用第一个活动连接和设备(但不调整设备。我不知道 NM 是否可以显示它) 对于 ${!foreign_option_*} 中的 optionname ; 执行 选项="${!optionname}" 回显 $选项 part1=$(echo "$option" | cut -d " " -f 1) 如果 [ “$part1” == “dhcp-option” ] ; 然后 part2=$(echo "$option" | cut -d " " -f 2) part3=$(echo "$option" | cut -d " " -f 3) 如果 [ "$part2" == "DNS" ] ; 然后 IF_DNS_NAMESERVERS="$IF_DNS_NAMESERVERS $part3" 菲 如果 [[ "$part2" == "DOMAIN" || "$part2" == "DOMAIN-SEARCH" ]] ; 然后 IF_DNS_SEARCH="$IF_DNS_SEARCH $part3" 菲 菲 完毕 收起 对于 $IF_DNS_SEARCH 中的 DS ;执行 # R="${R} 搜索 $DS" R="${R}$DS" 完毕 对于 $IF_DNS_NAMESERVERS 中的 NS ;执行 # R="${R} 名称服务器 $NS" R="${R}$NS" 完毕 回显“$R”>“$dns_list_file” #仅限 ipv4 #我们必须检查 DNS 是否存在,但是我现在太懒了 $NMCLI con mod $active_con +ipv4.dns "$R" $SYSTEMCTL 重新启动 NetworkManager #echo -n "$R" | $RESOLVCONF -p -a "${dev}" #echo -n "$R" | $RESOLVCONF -a "${dev}.inet" ;; 向下) dns_list=$(echo "$dns_list_file") 如果 [ !-z "$dns_list" -a "$dns_list" != " " ]; 然后 #我们必须检查这个 DNS 是否存在,但是我现在太懒了 $NMCLI con mod $active_con -ipv4.dns "$dns_list" $SYSTEMCTL 重新启动 NetworkManager 菲 #$RESOLVCONF -d "${dev}.inet" ;; 埃萨克
我不确定搜索服务器是否可行,但只有名称服务器才有效。同样,必须使用多个服务器进行测试(我没有这样做)。
因此,它可以将 DNS 添加到您的连接中。但是当您从 systemctl ( ) 运行它时,它不适用于 SElinux 。 中有这样的字符串:systemctl start [email protected]
/var/log/audit.log
类型 = AVC 消息 = 审核 (1414759817.198:2963): avc: 拒绝对 pid = 1827 comm =“update-resolv-c”name =“systemctl”dev =“dm-1”ino = 787169 \ 执行 { 执行 } scontext=system_u:system_r:openvpn_t:s0 tcontext=system_u:object_r:systemd_systemctl_exec_t:s0 tclass=文件
我必须为 SElinux 编写策略。好的,但是有没有更方便用户设置 DNS 的方法?也许软件包维护者和 RedHat/Centos 的开发人员考虑过 openvpn DNS,但我不知道?
答案1
尝试以下命令:
$ mkdir /etc/openvpn/scripts
$ mv /etc/openvpn/update-resolv-conf /etc/openvpn/scripts/
$ restorecon -v /etc/openvpn/scripts/
$ restorecon -v /etc/openvpn/scripts/update-resolv-conf
$ setsebool openvpn_run_unconfined on
$ nano -w /etc/openvpn/config.conf
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
script-security 2
$ systemctl start [email protected]
$ systemctl status [email protected]