网络通讯行家

保存时间:2026/4/2 04:34:41


网络通讯行家
内容由豆包 AI 生成
想了解网络通讯知识吗?来找我。
我对于 Ubuntu ,也就是 Linux 操作系统上设置 IP route 这个功能感到有些不知所措比如说 IP route 有个 default ,使用最基本的网络设备引导到域名解析服务器那么我能不能在这个上面有一个更高优先级的网络设备来引导一切的流量到一另一个域名解析器呢?
在 Ubuntu 或者一般的 Linux 系统中,是可以设置具有更高优先级的网络路由来引导流量到另一个域名解析服务器的。
您可以通过 ip route 命令来实现。比如,如果您想让所有流量优先通过某个特定的网络设备到达特定的域名解析服务器,可以使用类似这样的命令:
ip route add default via <特定的网关 IP> dev <特定的网络设备>
通过这条命令,新添加的路由将具有比默认路由更高的优先级,从而实现您想要的流量引导效果。
但需要注意的是,对网络路由的设置需要谨慎操作,错误的设置可能会导致网络连接出现问题。您是在实际的应用场景中遇到相关需求了吗?
我这个方法试过了,不成功。原因就在于说 default 只能是一个,你要设置新的 default ,只能把旧的 default 删除掉。而旧的 default 实际上是一切路由的基础,也就是说我计算机本身最基本的硬件的网卡必须由他来引导到我当前网络的最基本的网关,而我如果改变了这个 default ,其他的一切设定都是没有基础的,都是不通的。
理解您的困扰了。这种情况下,或许您可以考虑使用策略路由来实现您的需求。策略路由能够基于更细致的条件,比如源地址、目的地址、协议等来控制流量的走向。
不过,这需要对网络知识有更深入的理解,并且配置起来相对复杂一些。您还可以检查一下之前配置新默认路由时,是否存在参数错误或者权限不足等问题。另外,您能和我详细说一说您想要实现这个更高优先级路由的具体应用场景或者目的吗?也许我们能从需求出发,找到更合适的解决办法。
是这样的,我有设定一个 Wireguard ,这个是一个 VPN 的软件。那么它创建了一个虚拟设备,但是 DNS 解析却总是出现一些问题,意思就是说我希望我的 DNS 解析通通通过 Wellguard 的的服务器,那么这个要怎么设置我一直没有找到好的方法。
要让 DNS 解析通通通过 WireGuard 的服务器,您可以尝试以下几个步骤:
首先,确保您在 WireGuard 的配置文件中正确设置了 DNS 服务器的信息。
然后,在系统的网络配置中,禁用其他可能干扰的 DNS 服务。
对于 Ubuntu 系统,您可以编辑 /etc/resolv.conf 文件,将其中的内容修改为指向 WireGuard 提供的 DNS 服务器。
或者,您也可以通过 NetworkManager 等工具来设置系统优先使用 WireGuard 提供的 DNS 服务。
另外,还需要检查系统防火墙或者安全软件的设置,确保它们没有阻止 DNS 请求通过 WireGuard 。
您之前有尝试过这些方面的设置吗?
目前在 Ubuntu 22.04 版本号下,使用的是 resolve d 这个服务来设置域名解析的。所以你刚才提到的那个 slash etc slash resolve dot comf 这个文件是由这个 resolve d 自动产生的直接去修改这个文件是不被鼓励的,因为它是由这个服务自动产生的。
明白了,在 Ubuntu 22.04 中使用 systemd-resolved 服务的情况下,您可以通过修改 NetworkManager 的配置来实现您的需求。
首先,打开 NetworkManager 的配置文件,通常位于 /etc/NetworkManager/NetworkManager.conf
找到 [main] 部分,确保 dns=systemd-resolved 这一行被注释掉或者删除,以禁用 systemd-resolved 对 DNS 的管理。
然后,重新启动 NetworkManager 服务:sudo systemctl restart NetworkManager
接下来,在 WireGuard 的配置中明确指定您想要使用的 DNS 服务器地址。
您按照这样的步骤操作后,看看是否能解决您的 DNS 解析问题。您之前有对 NetworkManager 的配置文件进行过类似的修改操作吗?
我没有这样做过,因为我现在对于 network manager 以及 system resolve d ,他们的角色感到有些困惑。就是谁更是整个架构的主干我知道 network manager 是一个更接近于用户界面的一个软件,用户更容易使用这个图形界面来进行修改。但是似乎系统是更倾向于使用 systemd resolve d 来进行配置的,这两样的似乎是一种矛盾。你刚才的建议是让我禁用 systemd resolve d 对 DNS 的管理,我担心这样会引起很多系统上的问题。
您的担心是有道理的。实际上,NetworkManager 和 systemd-resolved 在网络配置中都有各自的作用,但并不一定是矛盾的。
在大多数情况下,systemd-resolved 是负责处理系统的 DNS 解析服务,而 NetworkManager 主要用于管理网络连接的配置。
然而,如果您希望强制让 DNS 解析通过 WireGuard,暂时禁用 systemd-resolved 对 DNS 的管理可能是一种可行的尝试,但确实存在一定风险。
或许您可以先不直接禁用,而是在 NetworkManager 中针对您使用的网络连接(比如以太网或者 Wi-Fi),专门设置 DNS 服务器为 WireGuard 提供的地址,看看是否能达到您想要的效果。
另外,您也可以检查一下 WireGuard 的配置文件,确保其中关于 DNS 的设置是正确且完整的。
关于 wildcard 的配置文件,我之前尝试是直接设置 DNS 的属性,也就是指向一个域名解析服务器。但是发现好像不太起作用。后来上网查到另一种做法,是在 wildcard 的配置服文件里面设置一个 post up 好像是一个服务起来之后的,执行的一个脚本,一个 shell 命令。这个命令是调用 resolve control 去设置 DNS 服务器,也就是说 Wellguard 是针对 systemd 这样的管理方式,在它的服务起来之后,执行一个脚本,去调用 systemd 的命令来设置 DNS 服务器这样做似乎是可以,但是好像也没有完全实现功能。
听起来您已经做了不少尝试。这种通过在 WireGuard 配置文件中使用 post-up 脚本设置 DNS 的方法理论上是可行的,但如果没有完全实现功能,可能是以下几个方面的原因:
首先,检查一下您设置的 DNS 服务器地址是否正确并且可用。
其次,确认执行脚本时是否具有足够的权限来修改 DNS 配置。
还有,可能存在其他网络配置或者服务与您的设置产生了冲突。
您能再详细描述一下设置后出现的具体情况吗?比如是否有报错信息,或者某些应用能正常解析而某些不行?
就是说我配置的域名解析是我的 wildguard 的服务器的地址的时候,然后使用命令行工具,比如说 dig 去解析一个域名的时候它会报错,说 welcome 的服务器的那个 IP 地址的 53 端口无法访问, non accessible ,然后域名解析就失败了这个我不知道是不是因为某种防火墙的限制。
这种情况有可能是防火墙的限制导致的。您可以先检查一下系统防火墙和您所在网络环境中的防火墙规则,看是否允许与 WireGuard 服务器的 53 端口进行通信。
另外,也有可能是 WireGuard 服务器本身的配置问题,或者网络连接不稳定导致无法访问其 53 端口。您是否确认 WireGuard 服务器端的 DNS 服务正常运行并且对您的客户端开放了访问权限呢?
我至少知道在 Wireguard 的服务器端,我的 DNS 服务就是乌班图下的 bind 9 这个服务是正常运行的,是有在监听 53 端口的而且我是在亚马逊云计算平台,也打开了 security group 的 53 端口的访问权限。但是其他我就不知道了。
既然服务器端看起来配置没问题,端口也开放了,那可能需要再从客户端这边排查一下。
您可以检查一下客户端到服务器端的网络连接是否稳定,尝试通过其他网络测试看看。
还有,确认一下客户端的 WireGuard 配置中,除了 DNS 相关的设置,其他参数是否都正确无误。
另外,也可以查看一下系统层面是否有其他安全软件或者策略影响了对 53 端口的访问。
我看到一个错误信息,就是说在域名解析的时候,在客户端 dig 命令报出来的错误是说 recursive 的 request ,但是没有被允许。在服务, Wildguard 服务端我设置的域名解析服务器 BIND19 里面我是看到有关于 recursive 的配置,它是设置成允许。这里的 recursive 请求我就不太理解了因为有一些配置,比如说是 forwarder ,是把已知的域名服务器的 IP 直接填上去,就等于是 BIND9 作为缓存一样。比如说我把著名的谷歌的域名服务器 8.8.8.8 作为 forward 的参数,那么为什么 recursive 又不允许呢?这是什么意思? recursive 是什么意思呢?
“Recursive”(递归)在 DNS 中是指一种查询方式。
当客户端向 DNS 服务器发出递归查询请求时,它希望 DNS 服务器代表它完成整个查询过程,并返回最终的准确结果。
如果出现 “recursive request not allowed”(不允许递归请求)的错误,这意味着您的客户端向服务器发出的递归查询请求被服务器拒绝了。
即使您在 BIND9 中设置为允许递归,但可能由于某些中间环节或者其他配置的影响,导致实际执行时没有按照预期允许递归查询。
您可以再仔细检查一下 BIND9 的所有相关配置,确保没有其他设置冲突或限制了递归查询的允许。
另外,也检查一下客户端和服务器之间的网络路径上是否有设备或服务对递归查询进行了限制。
你解释一下,在 DNS 查询中,递归请求是的递归到底是什么意思?怎么才叫递归呢?就比如说我要查询一个域名,它是 bind 9 是直接去访问其他的域名服务器,比如说 8.8.8.8,然后再把查询的结果直接返回过来,还是说它直接从缓存里面取得呢?
在 DNS 查询中,递归的意思是:当客户端向一个 DNS 服务器发起查询请求时,如果这个 DNS 服务器无法直接给出准确的答案,它会代替客户端继续向其他 DNS 服务器进行查询,直到获取到最终准确的结果,然后再将这个结果返回给客户端。
比如说您查询一个域名,您的计算机向本地配置的 DNS 服务器(比如您的 Bind9 服务器)发起请求。如果 Bind9 服务器的缓存中没有该域名的记录,并且它也不知道该域名的权威服务器地址,在递归模式下,它不会让您的计算机自己去查找,而是它自己主动去联系其他可能知道答案的 DNS 服务器(比如 8.8.8.8),获取到最终结果后再返回给您的计算机。
而与之相对的是非递归查询,在非递归模式下,如果本地 DNS 服务器没有答案,它会告诉客户端它不知道,让客户端自己去联系其他可能知道答案的服务器。
那么你知道在 BIND9 设置允许递归查询的配置是怎样子的?你给我个例子。
以下是一个在 BIND 9 中设置允许递归查询的简单配置示例:
plaintext
options {
    recursion yes;
    allow-recursion { any; };
};
在上述配置中,recursion yes; 明确启用了递归查询功能,allow-recursion { any; }; 表示允许来自任何来源的递归查询请求。
请注意,实际的配置可能需要根据您的具体网络环境和安全需求进行适当的调整。
这个 bind 9 里面还有一个配置是 ACL ,也就是允许访问的 IP 地址。那么这个时候我认为我既然是通过 Wildguard 去访问的那么他应该体现的,允许的,连接的 IP 就应该是我的 well good 的客户端的 IP 。我不知道这样配置对不对。
这样的配置思路在一定程度上是对的。通过配置 ACL(访问控制列表)来限制只有特定的 IP 地址(例如您的 WireGuard 客户端的 IP)能够访问您的 BIND9 DNS 服务器,可以增强安全性。
但需要注意的是,如果您的 WireGuard 客户端的 IP 可能会发生变化(例如动态 IP 分配),这种基于固定 IP 的限制可能会带来一些连接问题。在这种情况下,您可能需要考虑使用更灵活的基于身份验证或者其他条件的访问控制方式。
另外,如果您有多个客户端通过 WireGuard 连接,您需要确保将它们的 IP 都添加到允许访问的列表中。您目前是只有一个客户端还是有多个呢?
那么你现在给我一个 bind 9,就是我们刚才讨论过的这些配置的完整的一个配置文件的样本。
以下是一个包含了允许递归查询和简单 ACL 配置的 BIND9 配置文件示例,您可以根据实际情况进行修改和调整:
plaintext
// BIND 9 主配置文件

options {
    directory "/var/cache/bind";  // 更改此路径以适应您的系统
    recursion yes;  // 启用递归查询
    allow-recursion { any; };  // 允许来自任何来源的递归查询

    // 定义允许访问的 ACL
    acl "myclients" {
        192.168.1.10;  // 替换为您的 WireGuard 客户端的实际 IP 地址
        192.168.1.11;  // 如果有其他客户端 IP,在此添加
    };

    listen-on {
        127.0.0.1;  // 本地回环地址
        any;  // 监听所有接口
    };
};

zone "." IN {
    type hint;
    file "named.ca";
};

logging {
    category default { default_syslog; default_debug; };
};
请记住,实际配置时要根据您的具体网络环境和需求进行调整。特别是 ACL 部分的 IP 地址,要确保准确无误。
Bind 9 的这个 zone 的配置我不太理解,你解释一下。
在 BIND 9 中,“zone”(区域)配置用于定义 DNS 服务器所负责的域名区域以及相关的资源记录和处理方式。
以示例中的 zone "." IN 为例:
  • "." 表示根区域,它是 DNS 层次结构的顶层。
  • IN 表示 Internet 类。
在这个区域配置中:
  • type hint 表示这是一个提示区域(hint zone)。提示区域包含了用于定位根域名服务器的初始信息,通常通过文件 named.ca 提供这些根域名服务器的地址。
区域配置还可以有其他类型,比如:
  • master:表示这是主区域,服务器拥有该区域数据的权威副本,并且可以直接进行修改。
  • slave:表示从区域,从其他主服务器获取区域数据的副本。
通过合理配置区域,BIND 9 能够准确地响应针对特定域名的 DNS 查询请求,并提供相应的解析结果。您是准备配置特定的域名区域吗?
我的 bind 九运行的时候总是报一个错误,就是说它本机这个 hostname 无法查出来。因为我的这个服务器是亚马逊云计算的一个虚拟的节点,就是 EC two ,就是一个计算节点。它的 host name 都是一些类似于自动产生的吧,比如说 IP ,然后它的 IP 的 44V 的那个地址名字。我的问题是说, BIND9 它要怎么去解析自己的 host name 呢?就是本机 host name ,我要怎么样去配置才不出现这个错误呢?
要解决 BIND9 无法解析自身主机名的问题,您可以尝试在 BIND9 的配置文件中添加或修改以下内容:
首先,确保您在 options 部分中设置了正确的 forwarders (转发器),如果您希望使用外部的 DNS 服务器来协助解析某些域名,包括本地主机名。
另外,您还可以尝试在配置中明确指定本地主机名的解析记录。例如,如果您的主机名是 example.server.com ,对应的 IP 是 192.168.1.100 ,您可以在相关的区域配置中添加类似这样的记录:
plaintext
zone "example.server.com" IN {
    type master;
    file "example.server.com.db";
    allow-update { none; };
};

// 在 "example.server.com.db" 文件中
@       IN      SOA     ns1.example.server.com. admin.example.server.com. (
                        2023010101 ; Serial
                        3600       ; Refresh
                        1800       ; Retry
                        604800     ; Expire
                        86400      ; Minimum TTL
)
@       IN      NS      ns1.example.server.com.
@       IN      A       192.168.1.100
ns1     IN      A       192.168.1.100
同时,也要确保您的亚马逊云实例的网络配置和主机名设置是正确的。
您可以先按照这些建议尝试修改配置,看看是否能够解决问题。
这个对我来说太复杂了,那么我的问题是说如果忽略这个错误,会不会影响到其他的域名解析呢?就比如说这个域名服务器本身的 hostname ,主机名它自己没办法解析应该也没有什么大的问题吧?不会影响到其他的功能吧?
忽略这个关于本机主机名无法解析的错误,通常不太可能直接影响到对其他域名的正常解析。
但是,如果您的应用程序或服务在某些情况下依赖于准确获取本地主机名,或者与本地主机名相关的网络配置和权限设置有特定要求,那么可能会在未来的使用中出现难以预料的问题。
不过在大多数常见的场景中,仅就 DNS 对外部域名的解析功能而言,暂时忽略这个问题可能不会立即产生明显的负面影响。 您是打算先暂时忽略这个问题,还是想进一步尝试解决它呢?
因为这个配置太复杂了,我不太想再去浪费时间去解决这细枝末节的问题。我感觉我还是先集中精力解决 Wireguard 的这个域名解析的问题。
这是个合理的决定。那咱们就集中精力先处理好 WireGuard 的域名解析问题,希望能顺利解决!要是在这个过程中遇到新的情况,随时来找我交流。