在没有重定向网关的情况下替换 Openvpn 客户端上的 DNS

Gab*_*cze 5 domain-name-system windows-7 openvpn tunnel

我正在尝试通过配置将 DNS 推送到带有 OpenVPN 服务器的客户端:

 push "dhcp-option DNS 192.168.x.x"
Run Code Online (Sandbox Code Playgroud)

它运行良好,但我真正需要的是在 VPN 连接期间我不想使用我的主要解析器,客户端应该只使用服务器提供的 DNS。可以通过 push redirect-gateway来完成,但我不想通过 VPN 将来自客户端的所有连接建立隧道,只通过特定网络。

有没有可能以某种方式做到这一点?
Linux 客户端可以使用脚本,在 Windows 上我不确定

Kar*_*box 0

// 编辑:抱歉,我发布此内容时没有看到 Windows 部分。下面是关于linux的。

前段时间我在使用 openvpn 和 Linux 客户端时遇到了这个问题。但是 resolvconf 给我带来了额外的困难,将推送的 dhcp-options直接写入本地 resolv.conf 文件,并且在与 VPN 断开连接后无法恢复旧的名称服务器。所以我放弃了,制作了两个小 bash 脚本来处理 vpn 连接/断开连接上的 resolv.conf 文件。(当然,这些脚本必须安装在每个客户端上,因此它不是通用的解决方案。)

up-script 将您的常规名称服务器定义备份到安全位置,然后用收到的 dhcp-option 中的名称覆盖它们。向下脚本只是将常规文件移回原位。

附加到您的 VPN 连接配置

script-security 2
up /etc/openvpn/dns.up.sh
down /etc/openvpn/dns.down.sh
Run Code Online (Sandbox Code Playgroud)

dns.up.h

#!/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
Run Code Online (Sandbox Code Playgroud)

dns.down.sh

#!/bin/sh

mv /etc/resolv.conf.novpn /etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)