我正在使用 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 工作站上我做。所以,我現在有點困惑,對此感到抱歉。