VPN探索-VPN的工作原理
背景介绍
目前,我正在使用两款VPN软件:Quantumult X (QX) 和 MotionPro Plus (MPP)。
- Quantumult X(后续简称QX,类似于Clash/Stash等VPN软件)可以使用分流策略,对接VMESS、SS等其他协议,灵活地管理网络流量。
- MotionPro Plus(后续简称MPP)是一种企业级VPN客户端,通过网关、用户名+密码+多因素认证(MFA),并使用TLS VPN协议,建立安全隧道以访问企业内网资源。
两款VPN均会在MacOS中配置虚拟网卡、DNS服务及路由表。然而,当两者同时启用时,会出现无法分别访问各自资源的问题。
问题描述
当前DNS配置
使用scutil
命令检查系统DNS配置:
scutil --dns
命令解释:scutil --dns
是MacOS下用于查看系统DNS解析器配置的命令。它显示当前网络环境中的DNS优先级、接口绑定和解析器列表。
输出结果如下:
DNS configuration
resolver #1
nameserver[0] : 10.150.0.12
nameserver[1] : 10.150.0.89
nameserver[2] : 198.19.0.3
if_index : 29 (utun6)
flags : Supplemental, Request A records
reach : 0x00000002 (Reachable)
order : 102000
可以看出,当前DNS优先级以MPP的DNS(10.150.0.12 和 10.150.0.89)为最高。这导致访问如Google等服务时,DNS解析通过MPP的网络,无法正常访问。
问题初步判断
DNS解析顺序由优先级决定。要实现两款VPN各自资源的正常访问,需要调整DNS优先级或为特定域名指定专用DNS服务器。
解决尝试及过程
1. 调整DNS优先级(不建议通过此步骤操作,建议通过MacOs系统设置搜索DNS进行相应设置)
通过networksetup
命令,将QX的DNS(198.19.0.3)设置为主DNS:
sudo networksetup -setdnsservers Wi-Fi 198.19.0.3
命令解释:
networksetup
是管理MacOS网络设置的工具。-setdnsservers Wi-Fi 198.19.0.3
将Wi-Fi接口的DNS服务器设置为QX的DNS。
结果:
- QX的资源访问恢复正常。
- 但MPP资源(如example.domain)因通过QX的DNS解析,返回fake-IP,无法访问。
2. 为特定域名绑定DNS服务器
在QX的[dns]
模块中,为example.domain
配置解析规则,指定其使用MPP的DNS服务器:
[dns]
server=/*.example.domain/10.150.0.12
使用dig
命令验证域名解析结果:
dig example.domain
命令解释:dig
是一个强大的DNS查询工具,用于检查域名的解析状态和结果。
结果:
example.domain. 6 IN A 198.18.5.73
返回结果为fake-IP(198.18.5.73),无法通过MPP的路由表访问资源。
3. 使用dns_exclusion_list
排除Fake-IP
尝试将example.domain
加入QX的dns_exclusion_list
,希望通过系统默认的DNS解析:
[dns]
dns_exclusion_list=example.domain
再次查询域名:
dig example.domain
结果:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN
NXDOMAIN
表明域名解析失败。
4. 还原dns_exclusion_list
尝试使用Fake-IP + QX内部转发到10.内网IP
查看QX日志发现:
[QTXDomainResolver] Through special DNS server 10.150.0.12 for example.domain
[QTXDomainResolver] Begin A query for example.domain
[QTXDomainResolver] Send type A query packet for example.domain to 10.150.0.12
[QTXDomainResolver] End A query for example.domain from server 10.150.0.12 no A record, takes 0.013070 seconds
分析:
QX无法通过
dns_exclusion_list
解析到有效IP:- 开启
dns_exclusion_list
后,域名不再经过QX的[dns]
配置。
- 开启
QX降级解析失败的尝试:
- 配置
[filter] example.domain reject
:返回127.0.0.1,流量被阻断。 - 配置
[dns] server=/*.example.domain/127.0.0.1
使其超时降级:未成功。
- 配置
QX无法正常访问内网DNS服务无法进行到下一步使用Fake-IP 通过QX内部转发到10.内网IP:
- 即使明确指定内网DNS为
[dns] server=/*.example.domain/10.150.0.12
,QX依然无法解析有效记录。 - 由于内网DNS(10.150.0.12)没有响应A记录,导致解析失败。
- 即使明确指定内网DNS为
5. 最终解决方案:手动配置hosts
将example.domain
手动映射到内网IP地址,跳过DNS解析:
sudo nano /etc/hosts
添加以下内容:
10.250.0.xx example.domain
命令解释:nano
是终端中的文本编辑器。/etc/hosts
文件用于手动配置域名到IP地址的映射。
结果:
- 成功访问MPP资源(example.domain)。
- 两个VPN均能正常工作,分别访问其对应资源。
收获与总结
1. DNS与流量转发的关系
- DNS解析:将域名解析为IP地址。
- 路由表:根据解析得到的IP地址,通过相应网关转发流量。
- VPN隧道:通过虚拟网卡和加密隧道实现安全的数据传输。
两者结合,实现流量分流和资源访问。
2. VPN运行机制
- Quantumult X:基于分流策略,结合虚拟网卡、路由表和DNS模块,灵活管理流量。
- MotionPro Plus:通过内网网关和TLS协议建立安全连接,适用于企业内部资源访问。
3. 解决中的关键问题
- QX的
dns_exclusion_list
机制限制:不能直接通过QX的dns
模块为特定域名指定非fake-IP解析。 - QX对内网DNS的访问限制:导致内网资源解析失败。
- 手动配置
hosts
文件:有效解决了DNS优先级冲突。
4. 额外尝试
- 配置多种DNS降级机制,探讨其可行性。
- 排查QX对内网DNS服务访问失败的具体原因。
未来优化方向
- 自定义的DNS解析工具?
- 探索QX为何无法正常访问内网IP的DNS服务,并优化其DNS降级策略。
- 研究通过动态脚本实现自动化域名解析分流,减少手动配置工作。
- 深入了解MacOS虚拟网卡的DNS解析机制,进一步优化VPN工具间的兼容性。
通过以上调整,成功解决了两款VPN冲突的问题,确保资源访问的稳定性和灵活性。如果您也面临类似问题,希望本文的解决思路对您有所帮助。
VPN 的基础介绍与软件特性
虚拟专用网络(VPN, Virtual Private Network) 是一种通过公用网络建立加密连接的技术,能够保护数据传输安全、隐藏真实IP地址、访问受限制资源等。根据功能和实现方式不同,VPN通常分为多种类型。以下是对本次使用的两款VPN软件的详细介绍:
1. Quantumult X (QX)
Quantumult X 是一款功能强大的网络代理工具,主要用于网络分流、隐私保护和协议对接。其核心特点包括:
- 支持多种协议:如VMess、Shadowsocks(SS)、SOCKS5等。
- 强大的分流策略:用户可基于域名、IP地址、地域等自定义规则,将流量分配到不同的代理或直接连接。
- DNS设置与流量控制:提供精细化的DNS模块,可为特定域名绑定DNS服务器。
- 适用场景:适合需要跨境访问的用户,也可用于复杂网络环境中的流量优化。
QX 的运行机制:
- 在本地创建虚拟网卡,并结合路由表实现流量转发。
- 通过DNS解析,将域名转换为IP地址后分配到相应的代理。
2. MotionPro Plus (MPP)
MotionPro Plus 是一款企业级VPN解决方案,专注于通过加密隧道实现安全远程访问。其特点包括:
- 网关认证:通过网关、用户名+密码以及多因素认证(MFA)确保连接安全。
- TLS协议支持:使用安全传输层协议(TLS)保护数据通信。
- 专属内网资源访问:适用于访问特定内网服务(如公司文件系统或内部应用)。
- 适用场景:企业员工远程办公或访问受限制的内部资源。
MPP 的运行机制:
- 在本地配置虚拟网卡并启动加密隧道,与指定网关建立连接。
- 通过专属DNS和路由表,将数据流量安全地导向内网资源。
两款VPN在本次实验中的区别
特性 | Quantumult X (QX) | MotionPro Plus (MPP) |
---|---|---|
主要用途 | 跨境访问和流量分流 | 安全连接企业内网 |
协议支持 | VMess、Shadowsocks、SOCKS5等 | TLS VPN |
认证方式 | 无需专门认证,依赖代理配置 | 用户名+密码+MFA认证 |
DNS配置优先级 | 支持多DNS配置,并允许自定义优先级 | 默认优先级高,专注于企业内部DNS解析 |
适用环境 | 复杂网络环境、多代理需求场景 | 企业内部资源访问及安全需求 |
VPN的实际应用场景
- 跨境访问:通过QX快速访问全球受限资源,如国际网站、流媒体服务等。
- 企业远程办公:利用MPP建立安全隧道,访问公司内部系统(如CRM、ERP等)。
- 隐私保护:两款工具均具备隐匿IP地址和加密流量的功能,在公共Wi-Fi环境中尤为重要。
命令行工具诊断网络问题
1. 查看网卡配置
在 Linux 和 macOS 系统中,使用 ifconfig
命令可以查看当前网络接口的详细配置。网卡的 IP 地址、子网掩码以及接口的状态等信息都会显示在输出中。
ifconfig
输出示例:
utun6: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 4064
options=6460<TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
inet 198.19.0.1 --> 198.19.0.1 netmask 0xffffff00
utun9: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1400
options=6460<TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
inet 10.150.73.62 --> 10.150.73.62 netmask 0xfffffc00
从中可以看到每个网络接口的 IP 地址、网络掩码以及 MTU(最大传输单元)。这些信息对定位网络连接问题非常有帮助。
2. 查询路由表
路由表定义了数据包在网络中转发的路径。在某些情况下,网络连接问题可能是由于错误的路由配置引起的。通过 route
命令,可以查看到当前的路由配置。
查询特定目标地址的路由路径:
route -n get 10.150.0.12
输出示例:
route to: 10.150.0.12
destination: 10.150.0.0
mask: 255.255.255.0
gateway: 10.150.73.62
interface: utun9
flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>
recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire
0 0 0 0 0 0 1400 0
查询默认路由:
route -n get default
输出示例:
route to: default
destination: default
mask: default
interface: utun6
flags: <UP,DONE,CLONING,STATIC,GLOBAL>
recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire
0 0 0 0 0 0 4064 0
从这些路由信息中,我们可以看到数据包会通过特定的网关和接口转发,能够帮助我们判断是否存在路由错误。
3. 路由追踪
traceroute
命令用于追踪数据包从本地计算机到达目标地址的路径。它可以帮助你分析网络中的延迟和瓶颈。
使用 traceroute
命令追踪目标地址的路由:
traceroute 10.150.50.107
输出示例:
traceroute to 10.150.50.107 (10.150.50.107), 200 hops max, 40 byte packets
1 * * *
如果 traceroute
命令没有得到响应,可能是目标地址的防火墙阻止了 ICMP 数据包,或者网络中存在其他问题。
查询另外一个目标:
traceroute 10.150.0.12
输出示例:
traceroute to 10.150.0.12 (10.150.0.12), 200 hops max, 40 byte packets
1 10.150.5.58 (10.150.5.58) 19.869 ms 16.813 ms 15.787 ms
2 2.255.255.253 (2.255.255.253) 13.391 ms 15.780 ms 13.814 ms
3 10.150.5.126 (10.150.5.126) 16.705 ms 15.134 ms 33.041 ms
4 192.170.4.10 (192.170.4.10) 19.544 ms 21.756 ms 19.241 ms
5 * *^X *
通过 traceroute
命令,可以清楚地看到从源主机到目标主机的数据包经过的各个节点(路由器)。如果有某一跳长时间没有响应,可以初步怀疑在该节点或之后的网络链路上存在问题。
4. DNS 服务查询
DNS 是将域名解析为 IP 地址的系统。当网络连接正常,但无法通过域名访问网站时,问题很可能出在 DNS 配置上。通过 scutil --dns
命令可以查看系统当前的 DNS 配置。
scutil --dns
输出示例:
DNS configuration
resolver #1
nameserver[0] : 198.19.0.3
if_index : 28 (utun9)
flags : Supplemental, Request A records
reach : 0x00000003 (Reachable,Transient Connection)
order : 101600
resolver #2
nameserver[0] : 10.150.0.12
nameserver[1] : 10.150.0.91
nameserver[2] : 198.19.0.3
if_index : 29 (utun6)
flags : Supplemental, Request A records
reach : 0x00000002 (Reachable)
order : 102000
输出中列出了所有配置的 DNS 服务器及其对应的接口信息。如果某个 DNS 服务器不可达,系统会自动尝试使用其他 DNS 服务器。通过查看这些信息,您可以确认当前 DNS 是否配置正确,是否存在 DNS 服务不可用的情况。