Linux에서 VPN 연결을 공유할 때 DNS를 어떻게 구성합니까?

Linux에서 VPN 연결을 공유할 때 DNS를 어떻게 구성합니까?

저는 이더넷을 통해 VPN 연결을 공유하기 위해 Linux 컴퓨터(라즈베리 파이)를 사용하고 있습니다. 라즈베리 파이가 VPN을 통하지 않고 인터넷에 정상적으로 연결되기를 원합니다. 거의 작동하게 되었지만 eth1 네트워크에 대한 DNS를 구성하는 방법을 모르겠습니다.

Connection to the internet: eth0 192.168.11.21/24, gateway 192.168.11.1
vpn connection: tun0 <- openvpn connection
vpn sharing network: eth1 192.168.5.1/24 <- this maching is the gatway for the vpn sharing network

eth1 구성:

eth1: /etc/network/interface
auto eth1
iface eth1 inet static
address 192.168.5.1
netmask 255.255.255.0

eth1(VPN 공유 네트워크)에 대한 dhcp 서버로 dnsmasq를 실행하고 있습니다.

# Configuration file for dnsmasq.
#
interface=eth1
dhcp-range=192.168.5.50,192.168.5.150,12h

VPN 구성

VPN을 사용하기 위해 eth1에서 들어오는 트래픽만 원합니다. 별도의 라우팅 테이블을 사용하여 직접 경로를 설정했습니다.

# extract from openvpn config
route-noexec
route-up "/etc/openvpn/route-up.sh"
down "/etc/openvpn/down.sh"

# route-up.sh
/sbin/ip route add $trusted_ip/32 via $route_net_gateway table vpn
/sbin/ip route add 0.0.0.0/1 via $route_vpn_gateway table vpn
/sbin/ip route add 128.0.0.0/1 via $route_vpn_gateway table vpn

또한 별도의 라우팅 테이블을 설정하기 위해 몇 가지 명령을 실행해야 했습니다.

# make a new routing table called vpn
echo 200 vpn >> /etc/iproute2/rt_tables 

# add a rule to use the routing table for the addresses on eth1
ip rule add from 192.168.5.0/24 table vpn

인터페이스를 하나로 묶는 방법:

sysctl net.ipv4.ip_forward=1      
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

테스트:

VPN 공유 네트워크에 Windows 노트북을 연결했습니다. 인터넷 주소와 직접 통신할 수 있습니다. 그러나 도메인 이름을 사용하면 DNS 조회가 실패합니다. DNS를 구성하는 효과적인 방법을 찾지 못했습니다.

나는 이것을 dnsmasq에 추가하려고 시도했습니다

server=<dns-server-address> 

또한 /etc/network/interfaces의 eth1 아래에 이 줄을 추가해 보았습니다.

dns-nameservers <dns-server-address> 

이로 인해 resolvconf -l이 다음을 반환했습니다.

# resolv.conf from eth1.inet
# Generated by ifup for eth1.inet
nameserver <dns-server-address1>
nameserver <dns-server-address2>

그러나 /etc/resolv.conf는 동일하게 유지됩니다.

# Generated by resolvconf
nameserver 127.0.0.1

/etc/resolv.conf를 직접 편집해 보기도 했습니다. - 하지만 자동으로 업데이트되고 거의 즉시 다시 작성됩니다.

--편집하다 --

내 목표는 VPN 공유 네트워크의 클라이언트에 특정 구성이 필요하지 않은 설정을 갖는 것입니다. (구성할 수 없는 장치를 연결하겠습니다)

또한 가능하다면 VPN을 통해 DNS 요청을 보내고 싶습니다.

--편집 2--

첫 번째. Linux 클라이언트를 사용한 테스트로 전환했습니다. 내 DNS 서버를 추가하기 위해 resolv.conf를 수정하면 VPN 인터넷 연결이 작동하게 됩니다.

그러나 - 솔루션 5가 나에게 적합한 것 같습니다. 이는 DNS 패킷을 가로채서 새 DNS 서버로 연결하도록 변경하는 것입니까?

나는 그것이 나를 위해 작동하도록 할 수 없었습니다. 여기에 내 구성을 게시하겠습니다. 뭔가 빠졌나요?

# iptables-save
# Generated by iptables-save v1.4.21 on Fri Sep 23 16:57:46 2016
*mangle
:PREROUTING ACCEPT [51:3878]
:INPUT ACCEPT [49:3758]
:FORWARD ACCEPT [2:120]
:OUTPUT ACCEPT [30:3438]
:POSTROUTING ACCEPT [32:3558]
-A PREROUTING -p tcp -m tcp --dport 53 -j MARK --set-xmark 0x1/0xffffffff
-A PREROUTING -p udp -m udp --dport 53 -j MARK --set-xmark 0x1/0xffffffff
COMMIT
# Completed on Fri Sep 23 16:57:46 2016
# Generated by iptables-save v1.4.21 on Fri Sep 23 16:57:46 2016
*nat
:PREROUTING ACCEPT [4:337]
:INPUT ACCEPT [3:277]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i tun0 -p tcp -m tcp --dport 53 -j DNAT --to-destination 198.18.0.1
-A PREROUTING -i tun0 -p tcp -m tcp --dport 53 -j DNAT --to-destination 198.18.0.2
-A POSTROUTING -o tun0 -j MASQUERADE
COMMIT
# Completed on Fri Sep 23 16:57:46 2016
# Generated by iptables-save v1.4.21 on Fri Sep 23 16:57:46 2016
*filter
:INPUT ACCEPT [41189:45918808]
:FORWARD ACCEPT [63803:44422296]
:OUTPUT ACCEPT [33919:5341216]
COMMIT
# Completed on Fri Sep 23 16:57:46 2016

# ip route list table vpn
0.0.0.0/1 via 172.21.24.1 dev tun0 
81.171.74.16 via 192.168.11.1 dev eth0 
128.0.0.0/1 via 172.21.24.1 dev tun0 


# ip route list table main
default via 192.168.11.1 dev eth0 
default via 192.168.11.1 dev eth0  metric 202 
172.21.24.0/23 dev tun0  proto kernel  scope link  src 172.21.24.57 
192.168.5.0/24 dev eth1  proto kernel  scope link  src 192.168.5.1 
192.168.11.0/24 dev eth0  proto kernel  scope link  src 192.168.11.21 
192.168.11.0/24 dev eth0  proto kernel  scope link  src 192.168.11.21  metric 202 

# ip rule
0:  from all lookup local 
32764:  from all fwmark 0x1 lookup vpn 
32765:  from 192.168.5.0/24 lookup vpn 
32766:  from all lookup main 
32767:  from all lookup default 

# cat /etc/resolv.conf 
# Generated by resolvconf
nameserver 127.0.0.1

# On the client
# cat /etc/resolv.conf 
# Generated by resolvconf
nameserver 192.168.5.1

-- 편집 3 --

# tcpdump -i tun0 -n port 53
23:44:29.787915 IP 192.168.5.1.53 > 192.168.5.128.38840: 36460 4/0/0 A 157.7.203.102, A 157.7.154.23, A 116.58.172.182, A 157.7.235.92 (101)
23:44:29.788071 IP 192.168.5.1.53 > 192.168.5.128.38840: 37999 0/0/0 (37)
23:44:30.619149 IP 192.168.5.1.53 > 192.168.5.128.58425: 3383 1/0/0 A 129.169.10.40 (47)
23:44:30.620635 IP 192.168.5.1.53 > 192.168.5.128.58425: 11649 0/1/0 (83)

이를 살펴보면 DNS 응답이 돌아오지만 클라이언트(192.168.5.128)로 전달되지 않습니다. 오른쪽? 이제 문제를 해결하는 방법을 알아내야 합니다...

답변1

DNS 서버가 Windows 시스템, 모든 OpenVPN 클라이언트 또는 RPI에만 적용되기를 원하는지, DNS 쿼리가 VPN을 통과할지 여부를 명확히 하지 않았습니다.

1.OpenVPN을 통한 클라이언트와 RPI DNS를 분리하세요.

가장 쉬운 경우입니다. 클라이언트 DNS를 설정하세요.클라이언트에서, 그리고 RPI DNS는/etc/resolv.conf.

2.클라이언트(OpenVPN 외부)와 RPI DNS를 분리합니다.

RPI에 다음 라우팅 규칙을 추가해야 한다는 점을 제외하면 위와 동일합니다.

    ip route add 8.8.8.8/32 via Your.Router.IP.Address dev Your.Non.VPN.Interface table vpn

귀하의 (Windows) 클라이언트가 Google의 DNS 8.8.8.8을 사용한다고 가정했습니다.

삼. 대안으로, 클라이언트의 DNS 패킷을 표시하고 이를 통해 라우팅할 수 있습니다.기본라우팅 테이블:

     iptables -A PREROUTING -t mangle -p tcp --dport 53 -j MARK --set-mark 1
     iptables -A PREROUTING -t mangle -p udp --dport 53 -j MARK --set-mark 1
     ip rule add from all fwmark 1 table main
     iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE

4.OpenVPN을 통하든 외부에서든 RPI와 클라이언트에 동일한 DNS 서버가 있습니다.

글머리 기호 1 또는 2와 동일하며 동일한 DNS 세트를 사용하십시오.

5.분명히 OpenVPN을 통해 모든 OpenVPN 클라이언트에 대한 자동 설정입니다.

각 VPN 클라이언트에 대해 개별적으로 DNS를 설정하는 것이 지루하다고 생각할 수 있습니다. 특히 Google만큼 쉽지 않은 서버 네트워크에 DNS를 설정해야 하는 경우에는 더욱 그렇습니다. 먼저 서버의 구성 파일에 다음 명령문을 추가하여 서버에서 RPI 클라이언트로 DNS 옵션을 푸시해야 합니다.

    push "dhcp-option DNS 10.66.0.4"

이 옵션은 다음과 같은 변수에 기록됩니다.foreign_option_{n}: 이 방법으로 푸시된 첫 번째 옵션은n=1이며 해당 값(위의 경우)은 다음과 같습니다.

    foreign_option_1="dhcp-options DNS 10.66.0.4"

이 변수는 자동으로위로스크립트를 세 부분으로 나누어 IP 주소를 추출해야 합니다.$var3, 이제 다음 줄을루트업스크립트:

    iptables -t mangle -A PREROUTING -p tcp --dport 53 -j MARK --set-mark 1
    iptables -t mangle -A PREROUTING -p udp --dport 53 -j MARK --set-mark 1
    ip rule add  fwmark 1 table vpn
    iptables -t nat -A PREROUTING -p tcp --dport 53 -i tun0 -j DNAT --to-destination $var3
    iptables -t nat -A PREROUTING -p udp --dport 53 -i tun0 -j DNAT --to-destination $var3

이 작업을 수행하려면5월역방향 경로 필터를 비활성화해야 합니다. 내 Arch Linux 노트북에서는 그렇게 하기 때문에 잘 모르겠습니다.~ 아니다그렇게 해야 하는데, Debian 워크스테이션에 있는 동안 저는하다. 그래서 지금은 조금 당황스럽습니다. 죄송합니다.

관련 정보