Wie konfiguriere ich DNS, wenn ich eine VPN-Verbindung unter Linux freigebe?

Wie konfiguriere ich DNS, wenn ich eine VPN-Verbindung unter Linux freigebe?

Ich verwende einen Linux-Computer (Raspberry Pi), um eine VPN-Verbindung über Ethernet zu teilen. Ich möchte, dass der Raspberry Pi normal eine Verbindung zum Internet herstellt (nicht über das VPN). Ich bin kurz davor, es zum Laufen zu bringen, weiß aber nicht, wie ich den DNS für das eth1-Netzwerk konfiguriere.

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-Konfiguration:

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

Ich habe dnsmasq als DHCP-Server für eth1 (VPN-Sharing-Netzwerk) laufen.

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

VPN-Konfiguration

Ich möchte, dass nur Verkehr von eth1 das VPN nutzt. Ich richte die Routen selbst mithilfe einer separaten Routing-Tabelle ein.

# 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

Ich musste auch einige Befehle ausführen, um die separate Routing-Tabelle einzurichten:

# 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

Verknüpfung der Schnittstellen:

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

Testen:

Ich habe einen Windows-Laptop in das VPN-Sharing-Netzwerk eingebunden. Er kann direkt mit Internetadressen kommunizieren. Aber die DNS-Suche nach Domänennamen schlägt fehl. Ich habe keine funktionierende Möglichkeit gefunden, den DNS zu konfigurieren.

Ich habe versucht, dies zu dnsmasq hinzuzufügen

server=<dns-server-address> 

Ich habe auch versucht, diese Zeile unter eth1 in /etc/network/interfaces hinzuzufügen

dns-nameservers <dns-server-address> 

Dies führte dazu, dass resolvconf -l Folgendes zurückgab:

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

aber /etc/resolv.conf bleibt gleich:

# Generated by resolvconf
nameserver 127.0.0.1

Ich habe sogar versucht, /etc/resolv.conf direkt zu bearbeiten. – Aber es wird automatisch aktualisiert und fast sofort wieder überschrieben.

--bearbeiten --

Mein Ziel ist ein Setup, das keine spezielle Konfiguration auf einem Client im VPN-Sharing-Netzwerk erfordert. (Ich werde Geräte anschließen, die nicht konfiguriert werden können.)

Ich möchte wenn möglich auch DNS-Anfragen über das VPN senden.

--Bearbeiten 2--

Zuerst. Ich bin zum Testen mit einem Linux-Client übergegangen. Durch Ändern von resolv.conf, um meinen DNS-Server hinzuzufügen, funktioniert die VPN-Internetverbindung.

Es sieht jedoch so aus, als wäre Lösung 5 die richtige für mich. Werden hier DNS-Pakete abgefangen und geändert, um sie an einen neuen DNS-Server umzuleiten?

Bei mir hat es nicht geklappt. Ich werde meine Konfiguration hier posten. Habe ich etwas übersehen?

# 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

-- Bearbeitung 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)

Wenn wir uns das ansehen, erhalten wir DNS-Antworten zurück, aber sie gelangen nicht zum Client (192.168.5.128). Stimmt das? Jetzt muss ich herausfinden, wie ich das beheben kann …

Antwort1

Sie haben nicht klargestellt, ob die DNS-Server spezifisch für Ihren Windows-Computer, für alle OpenVPN-Clients oder vielleicht sogar für Ihren RPI sein sollen und ob die DNS-Abfragen über das VPN erfolgen sollen oder nicht.

1.Separater Client (über OpenVPN) und RPI-DNSes.

Dies ist der einfachste Fall: Legen Sie die Client-DNS festim Clientund die RPI-DNSes in/etc/resolv.conf.

2.Separater Client (außerhalb von OpenVPN) und RPI-DNSes.

Wie oben, außer dass Sie dem RPI die folgende Routing-Regel hinzufügen müssen:

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

wobei ich davon ausging, dass Ihr (Windows-)Client Googles DNS 8.8.8.8 verwendet.

3. Alternativekönnen Sie DNS-Pakete von Clients markieren und durch dashauptsächlichRouting-Tabelle:

     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.Dieselben DNS-Server für RPI und Clients, egal ob über OpenVPN oder außerhalb.

Dasselbe wie bei Punkt 1 oder 2, verwenden Sie einfach den gleichen DNS-Satz.

5.Automatische Einstellung für alle OpenVPN-Clients, natürlich über OpenVPN.

Sie denken vielleicht, dass es mühsam ist, DNSes einzeln für jeden VPN-Client einzurichten, insbesondere wenn Sie DNSes im Netzwerk des Servers einrichten müssen, was nicht so einfach ist wie bei Google. Sie müssen zuerst die DNS-Option vom Server zum RPI-Client übertragen, indem Sie die folgende Anweisung zur Konfigurationsdatei des Servers hinzufügen:

    push "dhcp-option DNS 10.66.0.4"

Diese Option wird in eine Variable namensausländische_option_{n}: die erste auf diese Weise gedrückte Option hatn = 1, und sein Wert (im obigen Fall) ist:

    foreign_option_1="dhcp-options DNS 10.66.0.4"

Diese Variable wird automatisch weitergegeben an denhochSkript, bei dem Sie es in drei Teile aufteilen müssen, wobei Sie die IP-Adresse beispielsweise in$var3, und Sie können nun die folgenden Zeilen zu IhremRoute nach obenSkript:

    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

Damit dies funktioniert,Maimuss den Reverse-Path-Filter deaktivieren: Ich bin mir nicht sicher, weil ich auf meinem Arch Linux-Laptopnichtmuss das tun, während ich auf meiner Debian-WorkstationTun. Also, ich bin gerade ein wenig verwirrt, das tut mir leid.

verwandte Informationen