在 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(vpn 共享网络)的 dhcp 服务器运行

# 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.无论是通过 OpenVPN 还是在外部,RPI 和客户端的 DNS 服务器都是相同的。

与项目 1 或 2 相同,只需使用同一组 DNS。

5.所有 OpenVPN 客户端的自动设置,显然是通过 OpenVPN。

您可能认为在每个 VPN 客户端上单独设置 DNS 很繁琐,尤其是当您需要在服务器网络中设置 DNS 时,这不像 Google 那样简单。您必须首先将 DNS 选项从服务器推送到 RPI 客户端,方法是将以下语句添加到服务器的配置文件中:

    push "dhcp-option DNS 10.66.0.4"

该选项被写入名为foreign_option_{n}:通过这种方式推送的第一个选项将具有n=1,其值(在上述情况下)为:

    foreign_option_1="dhcp-options DNS 10.66.0.4"

此变量会自动传递给向上脚本,你必须把它分成三个部分,提取 IP 地址,比如说$变量3,现在您可以将以下几行添加到您的路由向上脚本:

    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 工作站上。所以,我现在有点困惑,对此我深感抱歉。

相关内容