背景 / 目标
我在 Proxmox 上做一个 透明代理网关架构,所有内网 VM (接在私有桥 vmbr1 上)不做任何客户端配置,即可通过 Gateway VM 实现:
• DHCP + DNS:dnsmasq 提供地址分配 & 本地 DNS 。
• 透明代理:Clash Meta ( TPROXY 模式拦截 TCP/UDP )。
• 出网: 通过 Proxmox 宿主机的公网出口做 NAT 。
目标链路:Client VM -> (DHCP/DNS via dnsmasq) -> Gateway VM -> Clash Meta -> Internet 。
我们已成功完成的工作
Proxmox 主机配置:
• 配置了 vmbr0 (公网桥接)和 vmbr1 (内网 LAN )。
• 启用 IP 转发,并使用 iptables 设置 NAT ,使网关 VM 的流量可以通过 Proxmox 主机的公网 IP 出口。
网关 VM 网络:
• 分配了静态 IP:192.168.1.254/24 。
• 仅连接到 vmbr1 (内网桥)。
• 作为其他 VM 的默认网关。
Clash Meta 设置(透明代理):
• 安装了 clash-meta 二进制文件并配置了 systemd 服务。
• 验证了通过 SOCKS5 (端口 7891 )路由的出站连接解析为代理 IP ,确认 Clash Meta 正常工作。
• 使用 iptables 应用了 TPROXY 和 mangle 规则进行流量拦截。
DNS 解析测试:
• 不使用代理时( curl https://ipinfo.io )返回 Proxmox 公网 IP 。
• 使用代理时( curl --socks5 127.0.0.1:7891 https://ipinfo.io )返回 Clash 代理 IP 。
⸻
当前阻塞问题:dnsmasq 无法启动
为了完成透明路由设置,我们尝试在网关 VM 上配置 dnsmasq 以提供 DHCP 和 DNS 服务。然而目前被以下问题阻碍:
• dnsmasq.service 启动多次失败。
• systemd 报告:exit-code status=2 ,通常意味着配置文件存在语法错误。
The dnsmasq.conf file was configured with the following settings(etc/dnsmasq/.conf):
interface=ens19
dhcp-range=192.168.1.100,192.168.1.200,12h
dhcp-option=3,192.168.1.254
dhcp-option=6,192.168.1.254
no-resolv
server=127.0.0.1
log-queries
log-dhcp
/etc/systemd/system/dnsmasq.service
[Unit]
Description=Custom dnsmasq for DHCP & DNS
After=network.target
[Service]
ExecStart=/usr/sbin/dnsmasq -k --conf-file=/etc/dnsmasq.conf
Restart=on-failure
[Install]
WantedBy=multi-user.tar
服务日志显示,由于第 1 行的问题导致启动失败,尽管语法看起来是正确的。我们正在排查:
• 可能的网卡名称错误( ens19 ,已确认无误)。
• Clash Meta 占用 53 端口的冲突(已解决)。
• 配置文件中可能存在缩进或不可见字符问题。
目前的分析
• Clash Meta 已经正常运行并通过 TPROXY 成功拦截流量。然而,它并不会为下游 VM 解析 DNS ,除非 DNS 请求被正确转发到 Clash 。
• 已禁用 systemd-resolved ,并将 resolv.conf 指向 127.0.0.1 ,以便让 DNS 流量流经 Clash 。
• 原本计划让 DNSMASQ 作为 LAN 的主要 DNS 服务器,并将上游 DNS 查询转发给 Clash ( 127.0.0.1 )。但由于 dnsmasq 无法启动,导致 VM 无法解析 DNS ,因此客户端 VM 上 ping google.com 失败。
因此,透明 DNS 路由链断裂,阻碍了完整 TPROXY 功能的最后一步。