保存时间:2026/4/2 04:47:26
--help:显示帮助信息,列出所有可用的命令行选项及其说明。--auth-no-cache:不缓存用户名 / 密码,每次需要时都会从标准输入提示输入。--cd dir:在读取配置文件、密钥文件等之前,将当前工作目录更改为指定的绝对路径 dir。--chroot dir:在初始化后将根目录切换到指定的 dir ,增强安全性。--config file:从指定的配置文件中加载额外的配置选项。--daemon progname:使 OpenVPN 在完成所有初始化功能后作为守护进程运行,并将消息和错误输出发送到系统日志文件。--remote host [port] [proto]:指定要连接的远程 VPN 服务器的主机名或 IP 地址、端口号以及协议(默认为 UDP) 。--proto proto:指定 VPN 连接使用的协议,如 UDP 或 TCP 。--dev tun|tap:指定使用的虚拟网络接口类型,tun 用于路由 IP 数据包,tap 用于桥接以太网帧 。--auth-user-pass [file]:使用用户名 / 密码进行认证,可以从指定文件读取或在命令行输入。--cert file:指定客户端证书文件的路径。--key file:指定客户端私钥文件的路径 。--log file|syslog|stderr:指定日志输出的目标,可以是文件、系统日志或标准错误输出 。--verb level:设置日志的详细程度,0 表示静默,只记录致命错误,数字越大日志越详细3。client-cert-not-required和verify-client-cert等,以下是具体介绍:no。若设置为yes,则表示服务器端不强制要求客户端提供证书,此时无论客户端证书是自行签发还是由权威机构签发,都不是必需的,客户端即使不发送证书也能尝试连接服务器。yes,表示服务器端会严格验证客户端证书的有效性。当客户端发送证书时,服务器会检查证书的颁发机构、有效期、证书链完整性等,自行签发的证书通常会因颁发机构不受信任而被拒绝。yes,以确保只有持有合法有效证书的客户端才能连接服务器。client-cert-not-required为yes时,服务器会调用此脚本进一步验证客户端身份。openssl命令行工具来生成客户端证书,以下是具体步骤及命令示例:# 生成根证书私钥
openssl genrsa -out ca.key 2048
# 生成根证书请求
openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=FJ/L=XM/O=MyOrg/OU=MyOU/CN=MyCA"
# 自签名根证书
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt -days 3650
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=FJ/L=XM/O=MyOrg/OU=MyOU/CN=client1"
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365
openssl x509 -req -in client.csr -signkey client.key -out client.crt -days 365
client.crt)和私钥(client.key)可用于 OpenVPN 客户端配置,将其提供给客户端设备或软件使用。verify-client-cert yes),使用上述openssl命令生成的客户端证书在以下情况下能否通过验证有所不同:ca.crt添加到 OpenVPN 服务端的信任证书列表中,在服务端配置文件中通过ca指令指定根证书文件路径,如ca /etc/openvpn/ca.crt。openssl命令行工具生成 OpenVPN 服务器端根证书以及用该根证书签发客户端证书的详细过程:openssl genrsa命令生成一个 2048 位的 RSA 私钥,用于根证书。openssl genrsa -out ca.key 2048
openssl req命令生成根证书请求文件,需要填写一些证书相关的信息,如国家、州、城市、组织等。openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=FJ/L=XM/O=MyOrg/OU=MyOU/CN=MyCA"
openssl x509命令对根证书请求进行自签名,生成根证书文件,有效期设置为 10 年(3650 天)。openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt -days 3650
openssl genrsa命令生成客户端私钥。openssl genrsa -out client.key 2048
openssl req命令生成客户端证书请求,需要填写客户端相关的信息,如CN(通用名)等。openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=FJ/L=XM/O=MyOrg/OU=MyOU/CN=client1"
openssl x509命令,通过根证书和根证书私钥对客户端证书请求进行签署,生成客户端证书,有效期设置为 1 年(365 天)。openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365
ca.crt和客户端证书client.crt及私钥client.key可分别用于 OpenVPN 服务端和客户端的配置。/etc/ssl/openssl.cnf文件来调整加密算法的支持情况,但需谨慎操作,确保安全性。openssl version命令,查看系统中已安装的 OpenSSL 版本。确保其版本较新,若版本过旧,可考虑先进行更新。sudo apt-get install libssl-dev命令,安装 OpenSSL 开发库,它包含了 Blowfish 等多种加密算法的实现。sudo nano /etc/ssl/openssl.cnf命令打开配置文件。CipherString配置项,将其修改为DEFAULT@SECLEVEL=1或更低的值,以允许使用 Blowfish 等较旧的加密算法。make或cmake等。openssl dhparam命令,以下是具体步骤:openssl dhparam -out dhparam.pem [key_size]命令,其中[key_size]是要生成的 DH 密钥的长度,通常建议使用 2048 位或更高,例如openssl dhparam -out dhparam.pem 2048。该命令会生成一个包含 DH 参数的文件dhparam.pem。openssl dhparam -in dhparam.pem -noout -text命令查看生成的dhparam.pem文件中的内容,其中包含了私钥信息。可以通过文本处理工具从输出中提取私钥。dhparam.pem文件中提取公钥。例如,在 C 语言中,可以使用 OpenSSL 库提供的函数来读取dhparam.pem文件并提取公钥。openssl genrsa命令生成 RSA 私钥文件,例如执行openssl genrsa -out rootCA.key 2048,将生成一个 2048 位的 RSA 私钥文件rootCA.key。openssl req命令创建证书请求文件,执行openssl req -new -key rootCA.key -out rootCA.csr。openssl x509命令对证书请求进行自签发,生成根证书文件。例如执行openssl x509 -req -days 3650 -in rootCA.csr -signkey rootCA.key -out rootCA.crt,其中-days 3650表示证书的有效期为 10 年。openssl x509 -noout -text -in rootCA.crt命令查看生成的自签发根证书的详细信息,包括证书的版本、序列号、颁发者、有效期等。/etc/ssl/certs目录下,以.crt或.pem等格式存在。当你在系统中进行与 SSL/TLS 相关的操作时,如使用curl、wget等命令访问 HTTPS 网站,系统会自动使用这些内置的根证书来验证服务器证书的有效性。/etc/ssl/certs目录下,然后使用update-ca-certificates命令更新系统的证书库,使其生效。apt-get来安装相应的证书包。例如,对于某些企业内部的根证书,可能会有专门的apt源提供安装包。openssl命令行工具结合系统中的根证书进行数字签名。例如,你可以使用openssl dgst命令对文件进行签名,并指定使用系统中的根证书作为信任锚点。ssl模块或 Java 的java.security.cert包等,可以在代码中指定使用系统的根证书来进行 SSL/TLS 连接的验证和数字签名操作。.crt或.pem格式)准备好,并确保该证书是由你信任的证书颁发机构颁发的,或者是你自己生成的自签名根证书。/etc/openvpn/server.conf或/etc/openvpn/client.conf,分别对应服务器端和客户端。在配置文件中找到与证书相关的配置项,如ca、cert、key等。ca配置项的值设置为你信赖的证书文件的完整路径。例如,如果你的证书文件名为trusted_ca.crt,且位于/etc/openvpn/certs/目录下,则在配置文件中添加或修改ca /etc/openvpn/certs/trusted_ca.crt。sudo service openvpn restart命令,重启OpenVPN服务器服务,使新的证书配置生效。/var/log/openvpn/目录下,检查是否有与证书验证相关的错误或警告信息。--ca选项,以下是具体说明:--ca参数指定信任的证书文件路径。例如:openvpn --config server.conf --ca /etc/openvpn/certs/trusted_ca.crt。其中server.conf是你的服务器配置文件,/etc/openvpn/certs/trusted_ca.crt是信任的证书文件的实际路径。--ca参数来指定信任的证书。例如:openvpn --config client.conf --ca /etc/openvpn/certs/trusted_ca.crt。这里的client.conf是客户端配置文件,路径需根据实际情况填写。--data-ciphers命令行参数用于指定允许使用的数据加密算法列表。以下是设置该参数的一些要点和示例:openvpn --show-ciphers命令查看当前 OpenVPN 版本支持的所有加密算法。这些算法通常包括 AES-128-CBC、AES-256-CBC、BF-CBC 等多种类型。openvpn --config client.conf --data-ciphers AES-128-CBC,AES-256-CBC。--data-ciphers参数,它们协商加密算法时会按照双方都支持且优先级最高的算法来确定最终使用的算法。!来排除特定算法。例如,openvpn --config client.conf --data-ciphers AES-128-CBC,!BF-CBC表示优先使用 AES-128-CBC 算法,并且排除 BF-CBC 算法。--data-ciphers参数时,需确保所选算法在你的环境中可用且安全。openvpn --show-ciphers命令,OpenVPN会列出其支持的所有加密算法,包括对称加密算法、哈希算法等。openssl list-cipher-algorithms命令,会列出系统中OpenSSL库支持的所有对称加密算法,如AES、DES、3DES、Blowfish等。openssl list -message-digest-algorithms命令,可查看系统支持的哈希算法,包括MD5、SHA1、SHA224、SHA256等。openssl list-public-key-algorithms命令,能查看系统支持的公钥加密算法,如RSA、DSA、ECDSA等。--data-ciphers参数来实现,以下是在客户端和服务器端的具体操作:--data-ciphers参数指定加密算法。例如:openvpn --config server.conf --data-ciphers AES-256-CBC,其中server.conf是你的服务器配置文件。--data-ciphers参数。例如:openvpn --config client.conf --data-ciphers AES-256-CBC,这里的client.conf是客户端配置文件。--data-ciphers参数时,要确保客户端和服务器端都设置了相同的加密算法,否则可能会导致连接失败。data-cipher算法设置为AES-256-CBC,但仍出现协商数据通道加密算法失败的情况时,可从以下几方面排查解决:server.conf和client.conf,确保配置文件中关于--data-ciphers参数的设置正确无误,且没有其他与加密算法相关的冲突设置或语法错误。--auth参数指定的认证方式与加密算法不兼容等,如有需要可将其调整为与AES-256-CBC兼容的设置。AES-256-CBC算法,需要确保使用的密钥长度为 256 位,密钥长度不正确可能导致协商失败。AES-256-CBC算法的支持存在问题或存在兼容性差异,建议升级到最新稳定版本。--data-ciphers命令行参数来体现,如openvpn --config server.conf --data-ciphers AES-256-CBC。--data-ciphers,OpenVPN会读取默认的配置文件。在不同的系统中,默认配置文件的位置有所不同:/etc/openvpn/server.conf用于服务器端,/etc/openvpn/client.conf用于客户端。/etc/openvpn/server.conf和/etc/openvpn/client.conf 。C:\Program Files\OpenVPN\config\server.ovpn用于服务器端,C:\Program Files\OpenVPN\config\client.ovpn用于客户端 。/usr/local/etc/openvpn/server.conf用于服务器端,/usr/local/etc/openvpn/client.conf用于客户端 。--log或--log-append参数来设置命令行输出的 log 文件,以下是具体介绍:--log参数--log参数可以指定 OpenVPN 将日志信息输出到指定的文件中,并且会覆盖该文件原有的内容。例如:openvpn --config client.conf --log openvpn.log,这会将 OpenVPN 客户端的日志信息输出到当前目录下的openvpn.log文件中,若该文件已存在,则会先清空文件再写入日志。--log-append参数--log-append参数与--log类似,但它会将日志信息追加到指定文件的末尾,而不会覆盖原文件内容。例如:openvpn --config client.conf --log-append openvpn.log,这样多次运行 OpenVPN 客户端时,日志信息会不断追加到openvpn.log文件中。--verb参数来调整日志的详细程度,--verb后面的数字越大,日志越详细,取值范围通常是 0 到 11,例如openvpn --config client.conf --log openvpn.log --verb 3。systemd中创建服务时,服务名称中使用@符号是一种模板化的服务定义方式,openvpn@server和openvpn是不同的服务,主要区别如下:@后面的server是一个实例标识符。通过这种方式,可以根据不同的实例需求创建多个不同配置的 OpenVPN 服务实例,每个实例可以有自己独立的配置文件和运行参数。/etc/openvpn/server.conf或/etc/openvpn/client.conf等,在启动服务时直接使用该配置文件中的设置。/etc/openvpn/server1.conf、/etc/openvpn/server2.conf等,然后通过openvpn@server1、openvpn@server2等服务名称来分别启动对应的服务实例。systemd创建一个openvpn@server实例服务的命令行示例:/etc/systemd/system/openvpn@.service文件,内容如下:[Unit]
Description=OpenVPN connection to %i
After=network.target
[Service]
Type=notify
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --config /etc/openvpn/%i.conf
KillMode=process
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload,使systemd重新加载配置文件。/etc/openvpn/server.conf配置文件,配置文件中的参数可根据具体情况进行调整。sudo systemctl start openvpn@server启动openvpn@server实例服务。sudo systemctl status openvpn@server查看服务运行状态,若出现问题可查看日志文件进行排查。sudo systemctl enable openvpn@server,设置openvpn@server服务实例在系统开机时自动启动。openvpn@server.service:/etc/systemd/system/openvpn@server.service文件,内容如下:[Unit]
Description=OpenVPN connection to %i
After=network.target
[Service]
Type=notify
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --config /etc/openvpn/%i.conf
KillMode=process
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload,使systemd重新加载配置文件。/etc/openvpn/server.conf配置文件,配置文件中的参数可根据具体情况进行调整。sudo systemctl start openvpn@server启动openvpn@server实例服务。sudo systemctl status openvpn@server查看服务运行状态,若出现问题可查看日志文件进行排查。sudo systemctl enable openvpn@server,设置openvpn@server服务实例在系统开机时自动启动。systemd的openvpn@.service配置文件中,%i是一个实例化参数。systemctl start openvpn@server启动服务时,%i会被实际的实例标识符server替换。这样,在ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --config /etc/openvpn/%i.conf这一行中,%i就会分别替换为server,从而使得 OpenVPN 服务以ovpn-server为进程名运行,并使用/etc/openvpn/server.conf作为配置文件。systemd的man页面中有关于%i等参数的说明。systemd.unit(5)手册页中提到,在服务单元文件中可以使用%i等类似的%specifiers 作为参数占位符。当使用systemctl start service@instance这种形式启动服务时,%i会被实际的实例标识符instance替换,从而实现根据不同实例动态调整配置等功能 。httpd@.service文件中的execstart = /usr/sbin/httpd $options -d foreground -f conf/%i.conf这一行,当使用systemctl start httpd@littlebank启动服务时,%i就会被替换为littlebank,即服务会使用/etc/httpd/conf/littlebank.conf作为配置文件。%i的原文节选:push "sndbuf 524288"和push "rcvbuf 524288"指令,分别将发送和接收缓冲区大小设置为 512KB,可根据实际情况调整大小3。keepalive 10 60指令,每 10 秒发送一次保活探测包,若 60 秒内未收到响应则认为连接中断并尝试重新连接,减少因长时间无数据传输导致的连接中断和丢包。/etc/sysctl.conf文件,添加或修改net.core.rmem_max和net.core.wmem_max参数来增大系统的接收和发送缓冲区大小,如net.core.rmem_max=1048576,设置完成后执行/sbin/sysctl -p使配置生效 。sudo apt update和sudo apt upgrade命令更新系统。uname -r命令查看内核版本。sudo apt update,这将更新系统的软件包列表,确保获取到最新的 Wireguard 软件包信息3。sudo apt install wireguard命令进行安装,安装过程中可能会提示你输入密码3。sudo modprobe wireguard命令手动加载 Wireguard 内核模块,然后通过lsmod | grep wireguard命令查看模块是否已成功加载3。wg genkey | sudo tee /etc/wireguard/private.key生成私钥,再使用sudo chmod go= /etc/wireguard/private.key修改私钥文件权限,最后通过sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key生成公钥。/etc/wireguard/wg0.conf配置文件,填写如PrivateKey、Address、ListenPort等参数,同时添加客户端的PublicKey和AllowedIPs等信息3。PrivateKey、Address等信息,以及服务器的PublicKey、Endpoint和AllowedIPs等参数3。sudo wg-quick up wg0命令启动 Wireguard 服务,若要关闭服务,则使用sudo wg-quick down wg0命令1。sudo wg命令查看对等体上隧道的状态,检查是否已成功建立连接1。ping命令测试客户端与服务器之间的连接,或尝试访问网络资源,以确保 Wireguard 正常工作。/etc/wireguard/wg0.conf[Interface]
# 服务器私钥
PrivateKey = <服务器私钥>
# 服务器在Wireguard网络中的IP地址
Address = 10.0.0.1/24
ListenPort = 51820
# 可选的DNS服务器地址,可根据实际情况修改或添加多个
DNS = 8.8.8.8, 8.8.4.4
# 定义客户端
[Peer]
# 客户端公钥
PublicKey = <客户端公钥>
# 允许客户端访问的IP地址范围
AllowedIPs = 10.0.0.2/32
wg0-client.conf的文件[Interface]
# 客户端私钥
PrivateKey = <客户端私钥>
# 客户端在Wireguard网络中的IP地址
Address = 10.0.0.2/24
[Peer]
# 服务器公钥
PublicKey = <服务器公钥>
# 服务器的公网IP地址和端口
Endpoint = <服务器公网IP地址>:51820
# 允许客户端通过VPN访问的IP地址范围
AllowedIPs = 0.0.0.0/0
10.0.0.0/24作为 Wireguard 网络的子网,你可以根据实际需求选择其他私有子网,如192.168.100.0/24等。AllowedIPs = 0.0.0.0/0表示客户端将所有流量都通过 VPN 隧道转发到服务器,此时服务器10.0.0.1就相当于客户端的网关。DNS = 8.8.8.8, 8.8.4.4,这是使用谷歌的公共 DNS 服务器,你也可以使用自己搭建的 DNS 服务器或其他公共 DNS 服务器,如114.114.114.114等。wgX(X 为数字,如 wg0),类似于 tun或tap设备,以下是关于其网络流量转发的相关介绍:wgX的虚拟网络接口。这个接口作为 Wireguard 隧道的端点,负责处理加密和解密后的网络数据包。 tun设备类似,wgX设备工作在网络层,主要用于处理 IP 数据包,它为数据包提供了一个虚拟的传输通道,使得数据包能够在不同的网络之间进行安全传输。wgX虚拟设备,Wireguard 客户端会对这些流量进行加密,并通过 UDP 数据包将加密后的流量发送到服务器的指定端口。服务器收到 UDP 数据包后,通过wgX虚拟设备接收,解密数据包,并将原始的 IP 数据包转发到目标地址。wgX虚拟设备,Wireguard 服务器会对这些流量进行加密,并通过 UDP 数据包将加密后的流量发送到客户端的指定端口。客户端收到 UDP 数据包后,通过wgX虚拟设备接收,解密数据包,并将原始的 IP 数据包转发到目标地址。wgX虚拟设备。wgX虚拟设备转发所有流量,可按照以下步骤进行操作:ip route show命令,查看当前系统的路由表信息,了解现有网络连接和路由情况,这有助于后续配置路由时确定是否需要删除或修改某些默认路由。wgX虚拟设备转发:sudo ip route add default via 10.0.0.1 dev wg0
wgX为wg0,且服务器在 Wireguard 网络中的 IP 地址为10.0.0.1,需根据实际情况进行调整。/etc/rc.local文件,如果该文件不存在则创建它,并添加以下内容:#!/bin/bash
ip route add default via 10.0.0.1 dev wg0
exit 0
sudo chmod +x /etc/rc.local命令赋予该文件可执行权限。这样系统在启动时会自动执行该脚本,设置路由规则,确保所有流量都通过wg0设备转发。netplan.io工具(如果尚未安装):sudo apt install netplan.io。/etc/netplan/目录下的配置文件,通常是50-cloud-init.yaml或类似名称的文件,添加以下内容:network:
version: 2
renderer: networkd
ethernets:
# 此处为你的有线网络接口,通常为eth0或ens3等
enp0s3:
dhcp4: true
routes:
- to: 0.0.0.0/0
via: 10.0.0.1
on-link: true
table: 100
routing-policy:
- from: 10.0.0.2/32
table: 100
sudo netplan apply命令应用新的网络配置,使路由配置持久化生效。netplan和systemd-resolved(通过 D-Bus 接口进行设置)都在网络配置和路由中起着重要作用,但它们的职责和主导情况有所不同:/etc/netplan/目录下,以.yaml为后缀。netplan会根据其配置文件生成相应的网络配置和路由规则,并将这些配置应用到系统中,使网络接口和路由设置生效。如果通过netplan配置了路由规则,那么这些规则将在系统启动时被加载并生效。systemd系统中的一个组件,负责域名解析和本地 DNS 缓存等功能。它通过 D-Bus 接口提供了一种动态配置 DNS 服务器、域名解析策略等功能的方式。systemd-resolved主要关注域名解析,但它也可以通过 D-Bus 接口进行一些与网络相关的设置,如设置 DNS 服务器、配置域名解析策略等。在某些情况下,它可以与netplan配合使用,例如,当通过netplan配置了 DNS 服务器地址后,systemd-resolved会使用这些配置来进行域名解析。netplan主要用于静态网络配置和路由规则的设置,而systemd-resolved主要用于动态的域名解析和 DNS 相关的设置。在进行网络配置和路由设置时,通常建议优先使用netplan来进行统一的配置,而systemd-resolved则主要用于处理域名解析和 DNS 相关的问题。/etc/resolv.conf文件中的 DNS 服务器地址。这个文件由systemd-resolved或NetworkManager等系统服务管理和维护。https://dns.alidns.com/dns-query1。about:config,回车后在出现的配置页面中可修改相关设置。如network.trr.mode可用于开启 DNS over HTTPS 支持并选择模式;network.trr.uri可指定与 DoH 兼容的 DNS 服务器的 URL;network.trr.bootstrapaddress可输入 DoH 解析器的 IP 地址 。/etc/resolv.conf文件里的 DNS 解析服务器设置为127.0.0.53是比较常见的情况,这是因为systemd-resolved服务在起作用,以下是具体解释:systemd-resolved服务简介systemd-resolved是systemd系统中的一个组件,用于提供域名解析和本地 DNS 缓存等功能。当该服务启动后,它会监听127.0.0.53这个本地环回地址的53端口,作为本地的 DNS 解析服务器。127.0.0.53这个地址。systemd-resolved服务接收到请求后,首先会在本地缓存中查找是否有对应的域名解析结果。systemd-resolved服务在运行时会动态生成/etc/resolv.conf文件,并将自身监听的127.0.0.53地址写入该文件作为 DNS 服务器地址。/etc/resolv.conf文件获取 DNS 服务器配置时,就会使用systemd-resolved服务进行域名解析。127.0.0.53实际上是本地回环地址127.0.0.1的一个变体,而端口53是 DNS 服务默认使用的端口,127.0.0.53:53这种表示主要与systemd-resolved服务相关,以下是详细解释:127.0.0.1到127.255.255.254这个范围内的 IP 地址都属于本地回环地址,主要用于本地主机上的进程间通信。当数据发送到本地回环地址时,数据不会离开本地主机,而是直接在本地的网络协议栈中进行处理,相当于在本地机器内部进行了一次循环。127.0.0.53作为其中一个本地回环地址,被systemd-resolved服务用来监听 DNS 请求,它允许本地的应用程序通过这个地址与systemd-resolved服务进行通信,而不需要将 DNS 请求发送到外部网络。53进行通信,无论是 UDP 还是 TCP 协议,当应用程序需要进行域名解析时,它会向 DNS 服务器的53端口发送请求。systemd-resolved服务运行在本地主机上,它监听127.0.0.53的53端口,当应用程序如浏览器等需要进行域名解析时,会将 DNS 请求发送到这个地址和端口,systemd-resolved服务接收到请求后,会在本地缓存中查找域名对应的 IP 地址,如果缓存中没有,则会向外部 DNS 服务器查询,并将结果返回给应用程序。127.0.0.53与127.0.0.1:53在功能上有相似之处,都是用于在本地进行网络通信和服务监听,但在具体使用场景和配置上存在一些差异,以下是详细解释:127.0.0.53:53:主要用于systemd-resolved服务在本地监听 DNS 请求。它作为系统的本地 DNS 解析服务的监听地址,应用程序会将 DNS 查询请求发送到这个地址的 53 端口,由systemd-resolved进行处理。127.0.0.1:53:通常用于一些自行安装并配置在本地监听 53 端口的 DNS 服务器软件,如 BIND 等,也可以用于测试本地的 DNS 服务配置或进行一些自定义的 DNS 处理。127.0.0.53:53:在使用systemd-resolved的系统中,其配置由systemd-resolved服务自动管理,/etc/resolv.conf文件通常会被该服务动态更新为指向127.0.0.53作为 DNS 服务器地址。127.0.0.1:53:如果要使用127.0.0.1:53作为本地 DNS 服务器监听地址,需要手动安装和配置相应的 DNS 服务器软件,并进行相应的网络配置调整,如修改/etc/resolv.conf文件等。dig(Domain Information Groper)是一个用于查询 DNS 域名信息的工具,其返回结果包含了丰富的信息,以下是对其主要结构和各部分含义的解释:dig命令时输入的完整命令行参数,包括查询的域名、查询类型等。dig查询所使用的 DNS 服务器的 IP 地址和端口号,如;; SERVER: 127.0.0.53#53(127.0.0.53)表示使用了本地systemd-resolved服务监听的127.0.0.53地址的53端口。;; WHEN: Sat Dec 14 16:30:25 CST 2024表示查询时间,;; MSG SIZE rcvd: 116表示接收到的消息大小。; <<>> DiG 9.16.1-Ubuntu <<>> example.com为例,这部分明确了查询的域名是example.com,你也可以根据需要指定查询类型,如A(查询 IPv4 地址)、AAAA(查询 IPv6 地址)、MX(查询邮件交换记录)等。example.com. 300 IN A 93.184.216.34,其中example.com.是域名,300是该记录的生存时间(TTL),以秒为单位,IN表示该记录的类别为 Internet,A是记录类型,表示这是一个 IPv4 地址记录。93.184.216.34,即域名对应的 IP 地址。如果查询的是其他类型的记录,如MX记录,则会显示邮件服务器的优先级和域名等信息。dig命令返回结果中,权威服务器部分提供了负责所查询域名解析的权威 DNS 服务器的相关信息,以下是对其含义和作用的详细解释:ns1.example.com. ns2.example.com.等,这些域名是权威 DNS 服务器的标识,方便进行管理和配置。192.168.1.10 203.0.113.5等,客户端在进行域名解析时,会根据这些 IP 地址与权威 DNS 服务器进行通信,获取域名的解析结果。dig中得到的谷歌 DNS IP 地址与使用ping谷歌得到的 IP 地址不一致,可能是由以下多种原因造成的:dig查询时,可能得到的是最新的谷歌 DNS IP 地址,但ping时使用的是本地缓存中旧的 IP 地址。dig和ping结果不一致。dig和ping操作,可能会得到不同的 IP 地址。dig和ping操作在时间上存在差异,就可能导致获取到不同的 IP 地址。dig和ping结果不同。ping使用的 IP 地址与dig得到的不一致。dig和ping都使用systemd-resolved在127.0.0.53进行查询,但得到的结果不一样,可能说明以下几种情况:dig和ping在查询域名时的具体实现机制可能存在差异。dig主要用于详细的 DNS 查询和信息获取,可能会严格按照 DNS 协议进行完整的查询流程;而ping主要是测试网络连接,其对 DNS 的使用可能更侧重于快速获取一个可用的 IP 地址来建立连接,在某些情况下可能会使用本地缓存或采取更简化的查询方式。dig会返回详细的 DNS 记录信息,包括权威服务器等,而ping只关心获取到的 IP 地址是否能成功响应 ICMP 请求。因此,即使两者从systemd-resolved获取到的原始结果相同,但在结果的处理和显示上可能存在差异,给你造成结果不同的错觉。systemd-resolved自身有 DNS 缓存机制,dig和ping查询的时间间隔内,如果缓存发生了更新,可能导致两者结果不同。比如dig查询时缓存未更新,获取到了最新的权威解析结果,而ping查询时缓存已更新为另一个 IP 地址。dig查询时返回了某台服务器的 IP 地址,但ping时由于网络路由变化,实际连接到了谷歌的另一台服务器,导致 IP 地址不同。ping的结果被恶意篡改,而dig的结果相对更准确可靠。ping或systemd-resolved的行为。例如,某个配置文件中设置了特定域名的强制解析规则,导致ping获取到的结果不符合预期。ping获取 DNS 解析的方式及相关情况如下:ping命令时,系统首先会检查本地的 DNS 缓存,如果缓存中有对应域名的解析记录,则直接从缓存中获取 IP 地址5。ping会向系统配置的 DNS 服务器发送查询请求,以获取域名对应的 IP 地址。DNS Client服务相关,相关数据也可能会在系统注册表中有一定的存储和记录1。systemd-resolved或nscd等服务管理,不同的 Linux 发行版可能会稍有差异5。mdnsresponder等进程进行维护和管理。ipconfig /flushdns命令,即可刷新 DNS 解析缓存1。systemd-resolved作为 DNS 解析服务,可以使用sudo systemd-resolve --flush-caches命令来清除缓存;如果使用nscd服务,则可以通过sudo service nscd restart命令重启nscd服务来清除缓存5。sudo killall -hup mdnsresponder;在 macOS Yosemite(10.10)中,使用sudo discoveryutil udnsflushcaches命令。adb shell su -c 'ndc resolver clearnetdns'
adb shell su -c 'ndc resolver flushdefaultif'
adb shell ip route flush cache命令来清除 DNS 缓存 2。ConnectivityManager类来清除 DNS 缓存2。以下是使用 Kotlin 编写的示例代码:import android.content.Context
import android.net.ConnectivityManager
fun clearDnsCache(context: Context) {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
try {
// 通过反射调用系统内部方法
val method = connectivityManager.javaClass.getDeclaredMethod("clearDnsCache")
method.isAccessible = true
method.invoke(connectivityManager)
} catch (e: Exception) {
e.printStackTrace()
}
}
dig返回的 DNS 解析和ping谷歌的 IP 地址不一致,可能有以下原因:dig可获取详细 DNS 记录,包括 A、AAAA、MX、NS 等多种记录类型。若域名对应多个 IP 地址,dig通常会返回所有记录,而ping往往只选择其中一个 IP 进行连接测试,导致结果显示不同。dig返回的是权威 DNS 服务器提供的原始解析结果,而ping可能会对结果进行筛选或优化。比如,ping可能会优先选择响应速度快或网络延迟低的 IP 地址进行连接,而dig则是按照 DNS 记录的优先级和顺序返回。dig查询时可能获取到最新的解析结果,而ping可能使用了缓存中的旧结果。dig查询时的路由与ping时不同,可能导致ping连接到谷歌的其他服务器,从而 IP 地址不同。dig和ping请求时间不同,可能被分配到不同服务器,得到不同 IP 地址。dig和ping工具本身可能存在不同配置参数或默认行为。例如,ping可能设置了特定的超时时间或重试次数,在网络不稳定时,可能导致连接到不同 IP 地址。ping或dig的行为。如防火墙规则、IP 策略等,可能导致ping请求被重定向或过滤,与dig结果不同。dig命令中,如果你只想得到权威服务器部分而不显示其他信息,可以使用+nssearch参数。example.com的权威服务器,你可以在终端中输入以下命令:dig +nssearch example.com
example.com域名的权威服务器信息,而不会显示其他如A记录、MX记录等详细的 DNS 记录信息。dig返回部分不包含权威服务器内容,可能有以下几种情况:dig查询自然不会返回权威服务器内容,通常会显示相应的错误提示,如 “NXDOMAIN”(不存在的域名)。dig查询中不直接显示权威服务器信息。dig可能直接返回缓存中的结果,而不会再次查询权威服务器并显示其信息。dig命令与权威服务器的通信,导致无法获取权威服务器内容。dig返回的结果不完整,不包含权威服务器信息。dig命令时,如果使用了特定的参数或选项,可能会影响权威服务器信息的显示。例如,使用了只查询特定记录类型的参数,而该记录类型与权威服务器无关,就可能导致不显示权威服务器内容。wireguard-dkms进行动态编译。apt install wireguard命令安装时,系统会自动安装预编译好的 Wireguard 内核模块。wireguard-dkms包使用 DKMS(动态内核模块支持)来自动构建 Wireguard 内核模块10。如果系统内核有更新或需要重新编译 Wireguard 内核模块以适配特定需求,可以使用apt-get install wireguard-dkms等命令安装该包,它会根据当前系统的内核版本等情况进行动态编译。wireguard-dkms进行动态编译内核模块时,当内核升级版本后,主要是通过 DKMS(动态内核模块支持)机制来自动进行重新编译的,其过程涉及到一些脚本和钩子函数,以下是具体介绍:wireguard-dkms包时,它会将 Wireguard 内核模块的源文件复制到对应的目录下,并记录相关的模块信息,如模块名称、版本、依赖等。update-initramfs等脚本,这些脚本会在执行过程中调用 DKMS 的相关脚本,触发 DKMS 对已安装的内核模块进行重新编译。wireguard-dkms包中的dkms.conf文件是一个关键配置文件,它定义了模块的名称、版本、源文件路径等信息,还可以指定一些编译选项和安装脚本。wireguard-dkms包的安装过程中,postinst脚本会在安装完成后被执行。这个脚本会调用 DKMS 的dkms add命令,将 Wireguard 内核模块添加到 DKMS 的管理列表中,并进行首次编译和安装。trigger脚本会在系统内核升级等事件发生时被调用。这个脚本会检查已安装的内核模块是否需要重新编译,如果需要,就会调用dkms build和dkms install命令,对模块进行重新编译和安装。