带有 SElinux 的 Centos 7:openvpn 和 DNS

带有 SElinux 的 Centos 7:openvpn 和 DNS

我正在尝试在 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]

相关内容