在 Linux 中共用 VPN 連線時如何設定 DNS?

在 Linux 中共用 VPN 連線時如何設定 DNS?

我正在使用 Linux 電腦(樹莓派)透過乙太網路共享 VPN 連線。我希望樹莓派能夠正常連接到網路(而不是透過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

我有 dnsmasq 作為 eth1 的 dhcp 伺服器運行(vpn 共享網路)

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

VPN 設定

我只希望來自 eth1 的流量使用 VPN。我使用單獨的路由表自己設定路由。

# 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

測試:

我將一台 Windows 筆記型電腦放在 VPN 共享網路上。它能夠直接與互聯網位址進行通訊。但使用域名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 用戶端進行測試。修改 resolv.conf 以新增我的 DNS 伺服器,使 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。

3. 或者,您可以標記來自客戶端的 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.RPI 和用戶端使用相同的 DNS 伺服器,無論是透過 OpenVPN 還是外部。

與第 1 項或第 2 項相同,只需使用同一組 DNS。

5.顯然是透過 OpenVPN 為所有 OpenVPN 用戶端進行自動設定。

您可能會認為在每個 VPN 用戶端上單獨設定 DNS 非常繁瑣,尤其是當您需要在伺服器網路中設定 DNS 時,這不像 Google 那麼簡單。您必須先將 DNS 選項從伺服器推送到 RPI 用戶端,方法是將下列語句新增至伺服器的設定檔:

    push "dhcp-option DNS 10.66.0.4"

該選項被寫入一個名為的變數外國選項_{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

為了使這項工作成功,你可能必須停用反向路徑過濾器:我不確定,因為在我的 Arch Linux 筆記型電腦上我這樣做不是需要這樣做,而在我的 Debian 工作站上我。所以,我現在有點困惑,對此感到抱歉。

相關內容