我正在尝试使用配置如下的 OpenVPN 服务器将 DNS 推送到客户端:
push "dhcp-option DNS 192.168.x.x"
它运行良好,但我真正需要的是,在 VPN 连接期间,我不想使用我的主要解析器,客户端应该只使用服务器提供的 DNS。这可以通过推送来实现重定向网关但是我不想通过 VPN 隧道传输来自客户端的所有连接,只想传输特定的网络。
是否有可能以某种方式做到这一点?
Linux 客户端可以使用脚本,但在 Windows 上我不确定
答案1
使用redirect-private
,但也添加route
每个您想要通过 VPN 路由的网络。
顺便说一句,请注意,当其他接口没有到其 DNS 服务器的路由时,该接口上的 DNS 设置将停止工作。当redirect-gateway
从 (W)LAN 接口删除默认网关并通过原始网关添加到 VPN 服务器 IP 的主机路由时,就会发生这种情况。取决于您的设置,可能没有有效的设置,您必须更改 DNS 命名以包含一些内部网络的子域。
答案2
// 编辑:抱歉,我发帖时没看到 windows 部分。下面是关于 linux 的。
我以前在使用 openvpn 和 Linux 客户端时遇到过这个问题。但是 resolvconf 让我在编写推送的 dhcp-options 时遇到了额外的困难直接地到本地 resolv.conf 文件,断开与 VPN 的连接后无法恢复旧的名称服务器。所以我放弃了,并制作了两个小的 bash 脚本来处理 VPN 连接/断开连接时的 resolv.conf 文件。(当然,这些脚本必须安装在每个客户端上,因此这不是通用的解决方案。)
up-script 会将您的常规名称服务器定义备份到安全位置,然后用收到的 dhcp-option 中的定义覆盖它们。down-script 只是将您的常规文件移回原位。
附加到你的 vpn 连接配置文件
script-security 2
up /etc/openvpn/dns.up.sh
down /etc/openvpn/dns.down.sh
域名解析器
#!/bin/bash
mv /etc/resolv.conf /etc/resolv.conf.novpn
for optionname in ${!foreign_option_*} ; do
option="${!optionname}"
echo $option
part1=$(echo "$option" | cut -d " " -f 1)
if [ "$part1" == "dhcp-option" ] ; then
part2=$(echo "$option" | cut -d " " -f 2)
part3=$(echo "$option" | cut -d " " -f 3)
if [ "$part2" == "DNS" ] ; then
IF_DNS_NAMESERVERS="$IF_DNS_NAMESERVERS $part3"
fi
if [ "$part2" == "DOMAIN" ] ; then
IF_DNS_SEARCH="$IF_DNS_SEARCH $part3"
fi
fi
done
R=""
for SS in $IF_DNS_SEARCH ; do
R="${R}search $SS
"
done
for NS in $IF_DNS_NAMESERVERS ; do
R="${R}nameserver $NS
"
done
echo -n "$R" > /etc/resolv.conf
dns下载地址
#!/bin/sh
mv /etc/resolv.conf.novpn /etc/resolv.conf
答案3
Karma Fusebox。七年零九个月后,它帮我解决了问题。
Linux raspberrypi 5.4.51-v7l+ 上的 OpenVPN 2.4.7 #1333
塔