openvpn DNS 푸시 후 NetworkManager가 /etc/resolv.conf를 변경하지 않습니다


22

" /etc/resolv.confdns push가 구성된 openvpn 연결 후 NetworkManager가 업데이트되지 않습니다"라는 문제가 있습니다.

내 openvpn 서버 구성은 다음과 같습니다 ( 보안상의 이유로 도메인 이름을 ABC.COM으로 변경했습니다. )

########################################
# Sample OpenVPN config file for
# 2.0-style multi-client udp server
#
# Adapted from http://openvpn.sourceforge.net/20notes.html
#
# tun-style tunnel

port 1194
dev tun

# Use "local" to set the source address on multi-homed hosts
#local [IP address]

# TLS parms
tls-server 
ca keys/ca.crt
cert keys/static.crt
key keys/static.key
dh keys/dh1024.pem
proto tcp-server

# Tell OpenVPN to be a multi-client udp server
mode server

# The server's virtual endpoints
ifconfig 10.8.0.1 10.8.0.2

# Pool of /30 subnets to be allocated to clients.
# When a client connects, an --ifconfig command
# will be automatically generated and pushed back to
# the client.
ifconfig-pool 10.8.0.4 10.8.0.255

# Push route to client to bind it to our local
# virtual endpoint.
push "route 10.8.0.1 255.255.255.255"

push "dhcp-option DNS 10.8.0.1"

# Push any routes the client needs to get in
# to the local network.
#push "route 192.168.0.0 255.255.255.0"

# Push DHCP options to Windows clients.
push "dhcp-option DOMAIN ABC.COM"
#push "dhcp-option DNS 192.168.0.1"
#push "dhcp-option WINS 192.168.0.1"

# Client should attempt reconnection on link
# failure.
keepalive 10 60

# Delete client instances after some period
# of inactivity.
inactive 600

# Route the --ifconfig pool range into the
# OpenVPN server.
route 10.8.0.0 255.255.255.0

# The server doesn't need privileges
user openvpn
group openvpn

# Keep TUN devices and keys open across restarts.
persist-tun
persist-key

verb 4

보시다시피 튜닝이 거의없는 기본 샘플 구성입니다.

지금..

내 컴퓨터 (openvpn 클라이언트)에서 dns가 정상임을 알 수 있습니다.

{17:12}/etc/NetworkManager ➭ nslookup git.ABC.COM 10.8.0.1
Server:     10.8.0.1
Address:    10.8.0.1#53

Name:   git.ABC.COM
Address: 10.8.0.1

{17:18}/etc/NetworkManager ➭ nslookup ABC.COM 10.8.0.1   
Server:     10.8.0.1
Address:    10.8.0.1#53

Name:   ABC.COM
Address: 18X.XX.XX.71

서버 측의 openvpn 로그에 DNS가 푸시되었다는 메시지가 표시됩니다.

openvpn[13257]: TCPv4_SERVER link remote: [AF_INET]83.30.135.214:37658
openvpn[13257]: 83.30.135.214:37658 TLS: Initial packet from [AF_INET]83.30.135.214:37658, sid=3251df51 915772f3
openvpn[13257]: 83.30.135.214:37658 VERIFY OK: depth=1, C=XX, ST=XX, L=XXX, O=XXX, OU=XXX, CN=XXX, name=XXX, emailAddress=mail@ABC.COM
openvpn[13257]: 83.30.135.214:37658 VERIFY OK: depth=0, C=XX, ST=XX, L=XXX, O=XXX, OU=XXX, CN=XXX, name=XXX, emailAddress=mail@ABC.COM
openvpn[13257]: 83.30.135.214:37658 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
openvpn[13257]: 83.30.135.214:37658 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
openvpn[13257]: 83.30.135.214:37658 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
openvpn[13257]: 83.30.135.214:37658 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
openvpn[13257]: 83.30.135.214:37658 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
openvpn[13257]: 83.30.135.214:37658 [jacek] Peer Connection Initiated with [AF_INET]83.30.135.214:37658
openvpn[13257]: jacek/83.30.135.214:37658 MULTI_sva: pool returned IPv4=10.8.0.10, IPv6=(Not enabled)
openvpn[13257]: jacek/83.30.135.214:37658 MULTI: Learn: 10.8.0.10 -> jacek/83.30.135.214:37658
openvpn[13257]: jacek/83.30.135.214:37658 MULTI: primary virtual IP for jacek/83.30.135.214:37658: 10.8.0.10
openvpn[13257]: jacek/83.30.135.214:37658 PUSH: Received control message: 'PUSH_REQUEST'
openvpn[13257]: jacek/83.30.135.214:37658 send_push_reply(): safe_cap=940
openvpn[13257]: jacek/83.30.135.214:37658 SENT CONTROL [jacek]: 'PUSH_REPLY,route 10.8.0.1 255.255.255.255,dhcp-option DNS 10.8.0.1,dhcp-option DOMAIN ABC.COM,ping 10,ping-restart 60,ifconfig 10.8.0.10 10.8.0.9' (status=1)

내쪽에 openvp 로그 :

Aug 05 17:13:55 localhost.localdomain openvpn[1198]: TCPv4_CLIENT link remote: [AF_INET]XXX.XX.37.71:1194
Aug 05 17:13:55 localhost.localdomain openvpn[1198]: TLS: Initial packet from [AF_INET]XXX.XX.37.71:1194, sid=89cc981c d57dd826
Aug 05 17:13:56 localhost.localdomain openvpn[1198]: VERIFY OK: depth=1, C=XX, ST=XX, L=XXX, O=XXX, OU=XXX, CN=XXX, name=XXX, emailAddress=mail@ABC.COM
Aug 05 17:13:56 localhost.localdomain openvpn[1198]: VERIFY OK: depth=0, C=XX, ST=XX, L=XXX, O=XXX, OU=XXX, CN=XXX, name=XXX, emailAddress=mail@ABC.COM
Aug 05 17:13:58 localhost.localdomain openvpn[1198]: Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Aug 05 17:13:58 localhost.localdomain openvpn[1198]: Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Aug 05 17:13:58 localhost.localdomain openvpn[1198]: Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Aug 05 17:13:58 localhost.localdomain openvpn[1198]: Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Aug 05 17:13:58 localhost.localdomain openvpn[1198]: Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Aug 05 17:13:58 localhost.localdomain openvpn[1198]: [static] Peer Connection Initiated with [AF_INET]XXX.XX.37.71:1194
Aug 05 17:14:00 localhost.localdomain openvpn[1198]: SENT CONTROL [static]: 'PUSH_REQUEST' (status=1)
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: PUSH: Received control message: 'PUSH_REPLY,route 10.8.0.1 255.255.255.255,dhcp-option DNS 10.8.0.1,dhcp-option DOMAIN ABC.COM,ping 10,ping-restart 60,ifconfig 10.8.0.10 10.8.0.9'
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: OPTIONS IMPORT: timers and/or timeouts modified
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: OPTIONS IMPORT: --ifconfig/up options modified
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: OPTIONS IMPORT: route options modified
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: ROUTE_GATEWAY 10.123.123.1/255.255.255.0 IFACE=wlan0 HWADDR=44:6d:57:32:81:2e
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: TUN/TAP device tun0 opened
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: TUN/TAP TX queue length set to 100
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: /usr/sbin/ip link set dev tun0 up mtu 1500
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: /usr/sbin/ip addr add dev tun0 local 10.8.0.10 peer 10.8.0.9
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: /usr/sbin/ip route add 10.8.0.1/32 via 10.8.0.9
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: Initialization Sequence Completed

모든 것이 괜찮은 것 같습니다.

그러나. 나는 /var/log/messages또한 확인했다 . 그리고 나는 그 줄을 발견했다.

Aug  5 17:14:01 localhost NetworkManager[761]: <warn> /sys/devices/virtual/net/tun0: couldn't determine device driver; ignoring...

ip a 보고:

5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    link/none 
    inet 10.8.0.10 peer 10.8.0.9/32 scope global tun0
       valid_lft forever preferred_lft forever

route -n 보고:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.123.123.1    0.0.0.0         UG    0      0        0 wlan0
10.8.0.1        10.8.0.9        255.255.255.255 UGH   0      0        0 tun0
10.8.0.9        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.123.123.0    0.0.0.0         255.255.255.0   U     0      0        0 wlan0

따라서 기본적으로 DNS가 푸시되는 것을 제외하고는 모든 것이 작동합니다. 그리고 내 /etc/resolv.conf:

# Generated by NetworkManager
domain home
search home
nameserver 10.123.123.1

문제는 어디에 있습니까?

(openvpn 클라이언트를 사용하는 Windows 사용자의 응답으로 DNS가 제대로 작동하므로 내 문제입니다.

이제 서버 측에서 openvpn 서비스를 다시 시작한 후 다른 응답이 있습니다. 작동하지 않습니다.

어제 내 컴퓨터에서도 작동한다고 말해야합니다. 서버에 무언가를 망쳤습니까? 뭐가 될수 있었는지? )

편집 : 좋아, 다른 Windows 사용자 응답 (이전과 동일한 사용자)이 있습니다. 지금 작동 중입니다. 그래서 .. 그것은 openvpn 재시작으로 인한 것으로 생각되며 약간의 지연이 있습니다. 그 이후로는 아무 것도하지 않았습니다. 그래서 우리는 내 컴퓨터로 돌아 왔습니다.

또한 그 이상한 tun0메시지가 어제 나타나고 어제 효과가 있다는 것을 알았 습니다. 아니면 resolv.conf혼자서 항목을 추가 했습니까? 기억이 안나 ..


selinux가 활성화되어 있고 resolv.conf 파일에 잘못된 selinux 보안 컨텍스트가있는 시스템에서이 문제가 발생했습니다. 해당 파일에서 보안 컨텍스트를 복원하기 위해 restorecon을 실행하면 문제가 해결되었습니다. PS : 그것의 경우 resolv.conf하지 resolve.conf
natxo 아 세뇨

에 특별한 관심을 넣어 /etc/NetworkManager/NetworkManager.conf주석 : dns=dnsmasq하고 있습니다 managed=true. 또한 버그 # 1294899의 영향을받을 수 있습니다 .보고 된 "확립 된"VPN 연결에도 불구하고 저장된 VPN 연결 가져 오기가 최근 끊어졌습니다. VPN 설정 확인 : 필드 에 프로토콜 이름 ( :tcp또는 :udp)을 입력하십시오 Gateway. 고급 설정, 특히 Port number및을 확인하십시오 LZO compression. 또한 로그를 확인하십시오. DNS 누출 테스트로 완료하십시오 .
KrisWebDev

답변:


23

이것은 나를 위해 작동합니다 : http://www.softwarepassion.com/solving-dns-problems-with-openvpn-on-ubuntu-box/

중요한 단계는 클라이언트 openvpn 구성 파일에 다음 두 줄 구성을 추가하는 것입니다 .

up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

또한 스크립트가 의존 resolvconf하기 때문에 패키지가 클라이언트에 설치되어 있는지 확인하십시오 update-resolv-conf.

openvpn 클라이언트 서비스 또는 명령과 함께 작동하여 수동으로 시작합니다.

그러나 우분투 네트워크 관리자는 그렇지 않습니다. 지금까지 문제가 있습니다 : https://bugs.launchpad.net/ubuntu/+source/openvpn/+bug/1211110


4
--script 보안 2 OpenVPN을 실행하는 것을 잊지 마세요
KOL에게

2
또는 script-security 2클라이언트 openvpn 구성 파일에 넣으 십시오.
KrisWebDev 2016 년

Network-Manager를 거치지 않고 OpenVPN을 직접 사용하지 않는 것이 좋습니다. 그렇지 않으면 버그 가 발생할 수 있습니다. # 691723 OpenVPN 클라이언트 솔루션이없는 DNS무시합니다 . 필자의 경우, Network Manager는 up스크립트가 시작된 후 resolvconf를 덮어 씁니다 ... # echo "nameserver 208.67.220.220" | /sbin/resolvconf -a "tun0.openvpn"openvpn을 실행중인 더티 AFTER는 다시 덮어 쓸 때까지 작업을 수행 할 수 있습니다. 다시 OpenVPN을 직접 사용하지 마십시오.
KrisWebDev 2016 년

up명령어를 찾을수 없음 !!
Pardeep Jain

@KrisWebDev : 사실이지만 NetworkManager를 통해 OpenVPN을 사용하면 사용자가 Off원하지 않는 연결 을 비활성화 (설정 ) 할 수 있습니다.
palswim

12

NetworkManager 자체의 dnsmasq를 비활성화 한 후 저에게 효과적입니다.

편집하다 /etc/NetworkManager/NetworkManager.conf

 #dns=dnsmasq

NetworkManager를 다시 시작하십시오.

sudo restart network-manager

클라이언트 구성에서 Bruce Li와 이미 변경되었습니다. 이 변경으로 문제가 해결되었습니다 [Ubuntu 15.10].
TheDauthi

1
어떤 종류의 마법입니까? dnsmasq는 무엇을하고 있습니까?
GuySoft

이것은 다른 버전의 우분투에서 나를 위해 일했습니다. dnsmasq가하는 일을 실제로 이해하지 못하지만 NetworkManager.conf에서 해당 줄을 주석 처리하면 VPN 연결 및 Wi-Fi 연결 문제를 마술처럼 해결합니다.
Simón

sudo restart network-manager가 오류로 실패했기 때문에 시스템을 다시 시작해야했지만 Linux Mint 18을 실행하는 데 도움이되었습니다. 받아 들인 대답이 효과가 없었습니다.
trebormf

다시 시작 명령 던지기 오류restart: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: Connection refused
Pardeep Jain

2

마지막으로 작동합니다 (표준 NetworkManager 및 OVPN 플러그인 사용)

nmcli -p connection modify MY_VPN_CONNECTION ipv4.never-default no
nmcli -p connection modify MY_VPN_CONNECTION ipv4.ignore-auto-dns no
nmcli -p connection modify MY_VPN_CONNECTION ipv4.dns-priority -42

이 경우 VPN 연결이 설정되면 모든 DNS 요청은 dnsmasq, 업 / 다운 / 디스패치 도우미 스크립트를 조작하지 않고 VPN 제공 DNS 서버로 보내집니다.


이 작동, 10x
로마 M

1

OpenVPN에서 DNS 설정을 푸시 할 수 있습니다. 구성에서와 마찬가지로 서버 구성에서 다음 줄을 사용하여 수행됩니다.

push "dhcp-option DNS 10.20.30.40"

이것은 Windows GUI를 사용하여 문 밖에서 작동하지만 Linux 시스템에는 약간의 방해가 필요합니다. 내 홈 네트워크에 연결하기 위해 (현재 Fedora 18 사용 ) 업데이트 프로세스를 자동화하기 위해 GitHub ( https://github.com/gronke/OpenVPN-linux-push )에서 gronke의 스크립트를 사용했습니다 .

이 스크립트를 사용하기 위해 OpenVPN 클라이언트 파일에 다음을 추가했습니다.

up /home/gadgeteering/tools/vpn/up.sh
down /home/gadgeteering/tools/vpn/down.sh

up.sh :

#! /bin/bash
DEV=$1

if [ ! -d /tmp/openvpn ]; then
mkdir /tmp/openvpn
fi
CACHE_NAMESERVER="/tmp/openvpn/$DEV.nameserver"
echo -n "" > $CACHE_NAMESERVER

dns=dns
for opt in ${!foreign_option_*}
do
eval "dns=\${$opt#dhcp-option DNS }"
if [[ $dns =~ [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]; then
if [ ! -f /etc/resolv.conf.default ]; then
cp /etc/resolv.conf /etc/resolv.conf.default
fi

cat /etc/resolv.conf | grep -v ^# | grep -v ^nameserver > /tmp/resolv.conf
echo "nameserver $dns" >> /tmp/resolv.conf
echo $dns >> $CACHE_NAMESERVER
cat /etc/resolv.conf | grep -v ^# | grep -v "nameserver $dns" | grep nameserver >> /tmp/resolv.conf
mv /tmp/resolv.conf /etc/resolv.conf

fi
done

down.sh :

#! /bin/bash
DEV=$1
CACHE_NAMESERVER="/tmp/openvpn/$DEV.nameserver"
echo $CACHE_NAMESERVER

if [ -f $CACHE_NAMESERVER ]; then
for ns in `cat $CACHE_NAMESERVER`; do
echo "Removing $ns from /etc/resolv.conf"
cat /etc/resolv.conf | grep -v "nameserver $ns" > /tmp/resolv.conf
mv /tmp/resolv.conf /etc/resolv.conf

done
fi

왜 필요한 dns=dns가요?
Wang

그것은 Gronke에게 질문이 될 것입니다. 나는 그것이 조금 이상하다고 생각합니다. 내 의견을 작성한 후, 나는 'dns'변수를 전혀 사용하지 않는이 스크립트의 적응을 사용하여 진행했습니다. 누락으로 인해 행동 변화가 관찰되지 않았습니다.
Gadgeteering

1

수동으로 교체하여 NetworkManager를 작동시킬 수 있습니다 /etc/resolv.conf. 이것은 매우 해킹이므로 모든 상황에 유효한 솔루션으로 간주 될 수 없습니다.

#!/bin/bash
case "$2" in
    vpn-up)
    tmp=$(mktemp)
    func=$(mktemp)
    echo 'ping -c 1 -w 1 -q $1 > /dev/null ;
          if [ 0 -eq $? ]; then echo $1; fi' > $func
    grep -v "^#" /etc/resolv.conf > $tmp
    grep -rl type=vpn /etc/NetworkManager/system-connections \
        | xargs -n 1 sed -rne 's|dns=||p' \
        | sed -re 's|;|\n|g' \
        | grep -v "^\s*$" \
        | xargs -n 1 bash $func \
        | sed -re "s|(.*)|nameserver \1|" \
        | cat - $tmp \
        > /etc/resolv.conf
    rm -f $tmp $func;;
    vpn-down) resolvconf -u;;
esac

이 스크립트는 /etc/NetworkManager/dispatcher.d; 실행 가능해야하며 루트가 소유해야합니다. /etc/resolv.conf액세스 가능한 네임 서버를 찾아서 다시 작성할 수있는 모든 NetworkManager vpn 구성을 읽습니다 . 그것은 기록하지 않습니다 domainsearch라인; 그러나 불쾌한 NetworkManager 버그는 잊을 수 있습니다.

우분투 16.04를 사용합니다.


0

OpenVPN은 현재 DNS 설정을 푸시 할 수 없습니다. (보안 된) DNS 서버와 일치하도록 /etc/resolv.conf를 수동으로 변경해야합니다. 방금 액세스 서버와 동일한 컴퓨터에서 BIND9 서비스를 실행하고 터널을 통해 해당 서비스를 가리 킵니다. 해당 머신의 로컬 IP 주소를 사용하십시오 (예 : 192.168.1.110).

행운을 빕니다!

벽옥


Bruce Li의 답변으로 /etc/resolv.conf가 자동으로 수정됩니다
greuze

0

resolvconf, nor를 사용하지 않는 OpenSUSE 클라이언트가 systemd-networkd있지만 NetworkManager의 명령 으로 작동 하도록 공통 update-resolv-conf스크립트 를 수정할 수있었습니다 nmcli.

#!/usr/bin/env bash
#
# Parses DHCP options from openvpn to update resolv.conf
# To use set as 'up' and 'down' script in your openvpn *.conf:
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
#
# Example envs set from openvpn:
# foreign_option_1='dhcp-option DNS 193.43.27.132'
# foreign_option_2='dhcp-option DNS 193.43.27.133'
# foreign_option_3='dhcp-option DOMAIN be.bnc.ch'
# foreign_option_4='dhcp-option DOMAIN-SEARCH bnc.local'

case $script_type in

up)
    for optionname in ${!foreign_option_*} ; do
        option="${!optionname}"
        echo $option
        part1=$(echo "$option" | cut -d " " -f 1)
        if [ "$part1" == "dhcp-option" ] ; then
            part2=$(echo "$option" | cut -d " " -f 2)
            part3=$(echo "$option" | cut -d " " -f 3)
            if [ "$part2" == "DNS" ] ; then
                IF_DNS_NAMESERVERS="$IF_DNS_NAMESERVERS $part3"
            fi
            if [[ "$part2" == "DOMAIN" || "$part2" == "DOMAIN-SEARCH" ]] ; then
                IF_DNS_SEARCH="$IF_DNS_SEARCH $part3"
            fi
        fi
    done
    if [ -n "$IF_DNS_SEARCH" ]; then
        nmcli connection modify "${dev}" ipv4.dns-search "$IF_DNS_SEARCH"
    fi
    if [ -n "$IF_DNS_NAMESERVERS" ]; then
        nmcli connection modify "${dev}" ipv4.dns "$IF_DNS_NAMESERVERS"
    fi
    nmcli connection up "${dev}" # Force NM to reevaluate the properties
    ;;
esac

# Workaround / jm@epiclabs.io 
# force exit with no errors. Due to an apparent conflict with the Network Manager
# $RESOLVCONF sometimes exits with error code 6 even though it has performed the
# action correctly and OpenVPN shuts down.
exit 0

downNetworkManager 는 연결 종료시 nameserverand search(DNS 검색) 매개 변수를 자동으로 제거하기 때문에 핸들러 가 없습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.