自建代理节点与安全中转配置
使用 VPS、SOCKS5、SSH 白名单和防火墙控制构建可维护的自有网络出口。
自建代理完整流程
本文整理为两个实战章节:第一章搭建 DMIT 机房代理节点;第二章通过 DMIT 中转家宽 VDS,并完成 SSH、代理端口和防火墙加固。 整体链路:
普通代理:客户端 → DMIT VPS → 互联网
家宽中转:客户端 → DMIT VPS → 家宽 VDS → 互联网
dmit搭建3x-ui面板
[!NOTE] Username: PANEL_USERNAME Password: PANEL_PASSWORD Port: 44344 WebBasePath: PANEL_PATH Access URL: http://203.0.xxx.xxx:44344/PANEL_PATH ############################################### Start migrating database… Migration done! Created symlink /etc/systemd/system/multi-user.target.wants/x-ui.service → /etc/systemd/system/x-ui.service. x-ui v2.8.5 installation finished, it is running now…
# 在开启 TLS 之前,需要先安装 acme.sh 并申请证书:
# 申请证书
~/.acme.sh/acme.sh --issue -d proxy.example.com --standalone
# 安装证书到 root 目录
~/.acme.sh/acme.sh --installcert -d proxy.example.com --key-file /root/private.key --fullchain-file /root/cert.crt
# 申请完成后,在面板节点配置中填入路径:/root/cert.crt 和 /root/private.key
# 彻底删除旧证书
/root/.acme.sh/acme.sh --remove -d proxy.example.com
第一章、DMIT 自建代理节点
环境:DMIT VPS / 3x-ui 面板 / VLESS + WebSocket + TLS / FlClash(Mac)
一、购买服务器
推荐使用 DMIT(洛杉矶 CN2 GIA 线路),适合大陆用户。
-
注册账号:https://dmit.io
-
选择套餐:LAX.EB.TINY 或以上,选择 CN2 GIA 线路
-
系统选择:Debian 12 或 Ubuntu 22.04
-
购买后记录:
- 服务器 IP(如 `203.0.xxx.xxx`) - SSH 端口(默认 22) - root 密码
二、连接服务器
ssh root@203.0.xxx.xxx
首次登录后建议修改密码:
passwd
三、安装 3x-ui 面板
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
安装完成后会显示:
- 面板地址:
http://你的IP:2053 - 默认账号:
admin - 默认密码:
admin
安装后立即登录面板修改默认账号密码。
四、申请 SSL 证书
节点使用 TLS 需要域名和证书,先将域名解析到服务器 IP:
| 记录类型 | 主机名 | 值 |
|---|---|---|
| A | aolao | 203.0.xxx.xxx |
然后在面板中申请证书:
面板设置 → SSL 证书 → 申请证书,填入域名 proxy.example.com,申请成功后证书路径:
公钥:/root/cert/proxy.example.com/fullchain.pem
私钥:/root/cert/proxy.example.com/privkey.pem
五、创建入站节点
进入面板 → 入站列表 → 添加入站:
| 字段 | 值 |
|---|---|
| 协议 | VLESS |
| 端口 | 44905 |
| 传输 | WebSocket |
| 主机(Host) | proxy.example.com |
| 路径 | /zhichaoproxy |
| 安全 | TLS |
| SNI | proxy.example.com |
| 公钥路径 | /root/cert/proxy.example.com/fullchain.pem |
| 私钥路径 | /root/cert/proxy.example.com/privkey.pem |
添加客户端,记录 UUID,点击保存。
六、获取节点配置
在入站列表中点击对应入站的 二维码/链接 图标,可以:
- 复制
vless://链接(推荐) - 复制订阅链接
⚠️ 订阅链接经第三方转换服务(如 sub.v1.mk)转换后,
server会被自动替换为 Cloudflare 优选 IP,可能导致节点不可用。推荐直接使用 VLESS 链接导入客户端。
七、导入 FlClash(Mac)
FlClash 3.0.2 已支持导入 Clash 订阅。复制订阅链接后,将链接中的 sub 改为 clash 即可。
需要更细致的分流规则时,可使用订阅转换服务。
八、常见问题
以下记录搭建和导入节点时遇到的常见问题及处理方法。
节点延迟超时,但 ping 正常
通常是端口未开放或被防火墙拦截,检查并放行服务器端口:
ufw allow 44905
订阅更新后节点失效
订阅转换服务可能将 server 替换为 Cloudflare 优选 IP,而该 IP 对当前网络不可达。可以改用 VLESS 链接转换,或在 FlClash 覆写脚本中强制替换 server 为真实 IP:
function main(config) {
if (config.proxies) {
config.proxies = config.proxies.map(proxy => {
if (proxy.name && proxy.name.includes("你的节点名")) {
proxy.server = "203.0.xxx.xxx";
}
return proxy;
});
}
return config;
}
开启 DNS 覆写后节点超时(多订阅冲突)
多个订阅的 DNS 模式不同,例如一个使用 fake-ip,另一个使用普通模式,可能产生冲突。在覆写脚本中统一 DNS 配置,并将节点域名加入 fake-ip-filter 白名单:
dns:
enhanced-mode: fake-ip
fake-ip-filter:
- "*.ggff.net"
- "*.你的节点域名"
VLESS 链接转换后没有流量/到期信息
流量和到期信息存储在订阅链接的响应头中,VLESS 链接不携带这些信息,这是正常现象。如需查看流量,登录 3x-ui 面板查看。
九、配置文件字段说明
| 字段 | 说明 |
|---|---|
server | 实际连接的服务器 IP,必须是真实可达的地址 |
servername | TLS 握手时使用的域名(SNI),需与证书匹配 |
network: ws | 使用 WebSocket 传输,穿透性更好 |
ws-opts.path | WebSocket 路径,需与服务端一致 |
ws-opts.Host | HTTP Host 头,通常与 servername 相同 |
tls: true | 启用 TLS 加密 |
skip-cert-verify | 是否跳过证书验证,有真实证书时设为 false |
fake-ip | DNS 模式,给域名分配假 IP 并由代理内核接管,速度更快但需配置白名单 |
fake-ip-filter | fake-ip 白名单,列表内域名走真实 DNS 解析 |
十、Clash / Mihomo 配置示例
# ================================
# Clash / Mihomo 配置文件示例
# ================================
# HTTP 代理端口
# 浏览器/系统代理一般填这个
port: 7890
# SOCKS5 代理端口
# 适合 Telegram / SSH 等软件
socks-port: 7891
# 混合代理端口
# 同时支持 HTTP 和 SOCKS5
mixed-port: 7893
# 是否允许局域网设备连接
allow-lan: true
# 绑定地址
# 0.0.0.0 = 所有网卡
# 127.0.0.1 = 仅本机
bind-address: "*"
# 工作模式
# rule = 规则模式(最常用)
# global = 全局代理
# direct = 全局直连
mode: rule
# 日志等级
# silent / error / warning / info / debug
log-level: info
# Clash 控制面板 API
external-controller: 127.0.0.1:9090
# 控制面板密钥
secret: ""
# 是否启用 IPv6
ipv6: true
# ================================
# DNS 配置
# ================================
dns:
# 启用内置 DNS
enable: true
# IPv6 DNS
ipv6: true
# DNS 监听地址
listen: 0.0.0.0:1053
# 增强模式
# fake-ip = 推荐
enhanced-mode: fake-ip
# fake-ip 地址池
fake-ip-range: 198.18.0.1/16
# 默认 DNS
# 用于解析 DNS 服务器自身
default-nameserver:
- 223.5.5.5
- 119.29.29.29
# 国内 DNS
nameserver:
- https://dns.alidns.com/dns-query
- https://doh.pub/dns-query
# 国外 DNS
fallback:
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query
# ================================
# 节点配置
# ================================
proxies:
# 节点名称
- name: 香港节点
# 节点协议
# ss / vmess / trojan / hysteria2 等
type: ss
# 服务器地址
server: hk.example.com
# 端口
port: 443
# 密码
password: your_password
# 加密方式
cipher: aes-256-gcm
# UDP 转发
udp: true
- name: 美国节点
type: trojan
server: us.example.com
port: 443
password: your_password
sni: www.cloudflare.com
skip-cert-verify: true
udp: true
# ================================
# 策略组
# ================================
proxy-groups:
# 手动选择组
- name: Proxy
# select = 手动选择
type: select
# 可选节点
proxies:
- 香港节点
- 美国节点
- DIRECT
# 自动测速组
- name: Auto
# url-test = 自动测速
type: url-test
# 节点列表
proxies:
- 香港节点
- 美国节点
# 测速网址
url: http://www.gstatic.com/generate_204
# 测速间隔(秒)
interval: 300
# ================================
# 规则配置
# 从上到下匹配
# 命中即停止
# ================================
rules:
# 本地域名直连
- DOMAIN-SUFFIX,local,DIRECT
# OpenAI 走代理
- DOMAIN-SUFFIX,openai.com,Proxy
- DOMAIN-SUFFIX,chatgpt.com,Proxy
# Telegram 走代理
- DOMAIN-SUFFIX,t.me,Proxy
- DOMAIN-SUFFIX,telegram.org,Proxy
# 域名直连
- DOMAIN-SUFFIX,cn-shanghai.fcapp.run,DIRECT
# 中国 IP 直连
- GEOIP,CN,DIRECT
# 其余全部代理
- MATCH,Proxy
# ================================
# Tun 模式(可选)
# 开启后可接管系统流量
# ================================
tun:
enable: true
# 系统协议栈
stack: system
# 自动配置路由
auto-route: true
# 自动配置防火墙
auto-redir: true
# DNS 劫持
dns-hijack:
- any:53
第二章、DMIT 中转家宽 VDS
记录日期:2026-07-13。本文记录从拿到家宽 IP VDS 后,将其通过 DMIT 自建节点作为入口连通,并完成 SSH 加固、Fail2ban、代理服务和防火墙白名单配置的实战过程。出于安全考虑,不记录明文密码,只保留凭据文件路径和可复用命令。
最终链路:
客户端 → DMIT 自建节点 → 家宽 VDS SOCKS5 → 家宽 IP → 互联网
socks5://gostuser:REPLACE_WITH_STRONG_PASSWORD@198.51.xxx.xxx:1080
for i in {1..5}; do
curl -x socks5h://198.51.xxx.xxx:1080 -w "TCP:%{time_connect}s TLS:%{time_appconnect}s TTFB:%{time_starttransfer}s 总耗时:%{time_total}s\n" -o /dev/null -s https://api.openai.com/v1/models
sleep 0.5
done
一、主机与网络信息
| 项目 | 值 |
|---|---|
| 家宽 IP VDS | 198.51.xxx.xxx |
| 主机名 | l.admin |
| 系统 | Debian GNU/Linux 12 (bookworm) |
| DMIT 自建节点 / 跳板 | 203.0.xxx.xxx |
| 额外 SSH 白名单 IP | 203.0.xxx.xxx、203.0.xxx.xxx |
| SSH 端口 | 22 |
当前 Netcatty 连接路径:
本地 → DMIT 节点 203.0.xxx.xxx → 家宽 IP VDS 198.51.xxx.xxx:22
如果用标准 SSH 命令复现跳板连接:
ssh -J admin@203.0.xxx.xxx admin@198.51.xxx.xxx
ssh -J admin@203.0.xxx.xxx operator@198.51.xxx.xxx
也可以写入 ~/.ssh/config:
Host dmit-la
HostName 203.0.xxx.xxx
User admin
Host home-vds
HostName 198.51.xxx.xxx
User admin
Port 22
ProxyJump dmit-la
之后直接连接:
ssh home-vds
二、拿到家宽 VDS 后进行初始检查
先确认系统、SSH、当前连接、防火墙和 Fail2ban 状态:
cat /etc/os-release
hostname -f || hostname
sshd -T | egrep '^(port|permitrootlogin|passwordauthentication|pubkeyauthentication|kbdinteractiveauthentication|allowusers) '
who -u
ss -tnp | awk 'NR==1 || /:22[[:space:]]/'
nft list ruleset
iptables-save -t filter
command -v fail2ban-client || true
systemctl is-active fail2ban || true
当时发现:
- 系统是 Debian 12
- SSH 运行在
22端口 - 曾经允许
root和密码登录 - Fail2ban 最初未安装或未运行
- 有来自
91.92.xxx.xxx的 SSH 爆破尝试
三、排查异常 SSH 来源
当时看到陌生来源 91.92.xxx.xxx,使用以下命令排查:
who -u
ss -tnp | awk 'NR==1 || /:22[[:space:]]/'
ps -ef | grep '[s]shd'
grep '91\.92\.40\.44' /var/log/auth.log | tail -20
journalctl -u ssh -u sshd --since '24 hours ago' --no-pager | grep '91\.92\.40\.44' | tail -20
curl -fsS --max-time 8 https://ipinfo.io/91.92.xxx.xxx/json
观察到该地址尝试了 root、deploy、rosa、debian、ubuntu 等账号,属于 SSH 爆破来源,未发现成功登录记录。
四、创建普通管理用户
创建两个普通 sudo 用户:
operatoradmin示例命令:
useradd -m -s /bin/bash operator
useradd -m -s /bin/bash admin
usermod -aG sudo operator
usermod -aG sudo admin
# 设置密码,实际密码不写入本文
chpasswd <<'EOF'
operator:REPLACE_WITH_PASSWORD
admin:REPLACE_WITH_PASSWORD
EOF
id operator
id admin
getent group sudo
后来密码被改成较短的 16 位左右版本,当前密码保存位置:
/root/netcatty-updated-users-20260710T031557Z.txt
该文件应保持仅 root 可读写的权限:
chmod 600 /root/netcatty-updated-users-20260710T031557Z.txt
五、配置 SSH 登录策略
目标策略:
- 禁止
root通过 SSH 登录 - 保留普通用户密码登录,便于
operator、admin使用 - 只允许白名单 IP 登录 SSH 写入 SSH 加固配置:
cat > /etc/ssh/sshd_config.d/90-netcatty-hardening.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication yes
PubkeyAuthentication yes
KbdInteractiveAuthentication no
UsePAM yes
MaxAuthTries 3
LoginGraceTime 30
AllowUsers operator@203.0.xxx.xxx operator@203.0.xxx.xxx operator@203.0.xxx.xxx admin@203.0.xxx.xxx admin@203.0.xxx.xxx admin@203.0.xxx.xxx
EOF
sshd -t
systemctl reload ssh
sshd -T | egrep '^(permitrootlogin|passwordauthentication|kbdinteractiveauthentication|maxauthtries|logingracetime|allowusers) '
修改 SSH 配置前应保持当前会话,并另开终端验证新会话,避免把自己锁在服务器外。
六、配置 nftables SSH 白名单
只允许以下 IP 访问 TCP 22:
203.0.xxx.xxx203.0.xxx.xxx203.0.xxx.xxx运行时加载规则:
nft delete table inet netcatty_ssh_whitelist 2>/dev/null || true
nft -f - <<'EOF'
table inet netcatty_ssh_whitelist {
set ssh_admin_ipv4 {
type ipv4_addr
flags interval
elements = { 203.0.xxx.xxx, 203.0.xxx.xxx, 203.0.xxx.xxx }
}
chain input {
type filter hook input priority -5; policy accept;
ct state established,related accept
ip saddr @ssh_admin_ipv4 tcp dport 22 accept
tcp dport 22 drop
}
}
EOF
nft list table inet netcatty_ssh_whitelist
持久化规则:
mkdir -p /etc/nftables.d
nft list table inet netcatty_ssh_whitelist > /etc/nftables.d/ssh_whitelist.nft
chmod 0644 /etc/nftables.d/ssh_whitelist.nft
nft -c -f /etc/nftables.conf
systemctl reload nftables
systemctl enable nftables
复核时该表仍存在:
table inet netcatty_ssh_whitelist
set ssh_admin_ipv4 = { 203.0.xxx.xxx, 203.0.xxx.xxx, 203.0.xxx.xxx }
tcp dport 22 drop for non-whitelisted source IPs
确认
/etc/nftables.conf已包含/etc/nftables.d/*.nft;如果没有,需要手动加入include,否则单独保存文件不会自动加载。
七、安装并配置 Fail2ban
安装 Fail2ban:
DEBIAN_FRONTEND=noninteractive apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y fail2ban
配置 SSH jail:
cat > /etc/fail2ban/jail.d/sshd.local <<'EOF'
[sshd]
enabled = true
port = ssh
backend = systemd
maxretry = 3
findtime = 10m
bantime = 12h
ignoreip = 127.0.0.1/8 ::1 203.0.xxx.xxx 203.0.xxx.xxx 203.0.xxx.xxx
EOF
fail2ban-client -t
systemctl enable --now fail2ban
systemctl restart fail2ban
fail2ban-client status
fail2ban-client status sshd
当时 Fail2ban 曾封禁:
91.92.xxx.xxx
45.148.xxx.xxx
178.18.xxx.xxx
45.78.xxx.xxx
62.60.xxx.xxx
2026-07-13 复核时 Fail2ban 仍为 active,但当前封禁列表为空,说明原有封禁已到期或被清空:
systemctl is-active fail2ban
fail2ban-client status sshd
nftables 白名单用于减少 SSH 暴露面,是主要防线;Fail2ban 负责处理认证层爆破,作为补充防线。
八、在家宽 VDS 部署 Gost SOCKS5
家宽 VDS 使用 Gost 提供带认证的 SOCKS5 出口,DMIT 节点作为唯一主要调用来源。
| 项目 | 值 |
|---|---|
| 服务名 | gost.service |
| 二进制 | /usr/local/bin/gost |
| 版本 | gost v3.2.6 |
| 监听地址 | 0.0.0.0:1080 |
| 协议 | SOCKS5 |
| 认证用户 | gostuser |
| 服务文件 | /etc/systemd/system/gost.service |
代理密码属于敏感信息,不写入笔记。需要查看时应在服务器上读取 /etc/systemd/system/gost.service,不要外传。
检查当前服务:
systemctl status gost --no-pager -l
systemctl cat gost.service
ss -tulpen | grep ':1080'
/usr/local/bin/gost -V
服务配置模板:
# /etc/systemd/system/gost.service
[Unit]
Description=GOST SOCKS5 Proxy
After=network.target
[Service]
ExecStart=/usr/local/bin/gost -L=socks5://gostuser:REPLACE_WITH_STRONG_PASSWORD@0.0.0.0:1080
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
首次创建或重建服务:
gostuser REPLACE_WITH_STRONG_PASSWORD
# 1. 确认 gost 二进制存在
ls -lh /usr/local/bin/gost
/usr/local/bin/gost -V
# 2. 写入 systemd 服务文件
cat > /etc/systemd/system/gost.service <<'SERVICE_EOF'
[Unit]
Description=GOST SOCKS5 Proxy
After=network.target
[Service]
ExecStart=/usr/local/bin/gost -L=socks5://gostuser:REPLACE_WITH_STRONG_PASSWORD@0.0.0.0:1080
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
SERVICE_EOF
# 3. 启动并设置开机自启
systemctl daemon-reload
systemctl enable --now gost
systemctl status gost --no-pager -l
当前记录没有包含 Gost 二进制的下载安装命令;重装时应从 Gost 官方发布页下载与系统架构匹配的版本,再放到
/usr/local/bin/gost并赋予执行权限。
九、限制 SOCKS5 端口来源
当前机器启用了 UFW:
Default: deny (incoming), allow (outgoing), disabled (routed)
1080 端口只放行以下来源:
203.0.xxx.xxx
203.0.xxx.xxx
203.0.xxx.xxx
对应命令:
ufw default deny incoming
ufw default allow outgoing
ufw allow from 203.0.xxx.xxx to any port 1080 proto tcp
ufw allow from 203.0.xxx.xxx to any port 1080 proto tcp
ufw allow from 203.0.xxx.xxx to any port 1080 proto tcp
ufw status verbose
复核时在 nftables 中看到 UFW 生成的 1080 规则:
ip saddr 203.0.xxx.xxx tcp dport 1080 accept
ip saddr 203.0.xxx.xxx udp dport 1080 accept
ip saddr 203.0.xxx.xxx tcp dport 1080 accept
ip saddr 203.0.xxx.xxx udp dport 1080 accept
ip saddr 203.0.xxx.xxx tcp dport 1080 accept
ip saddr 203.0.xxx.xxx udp dport 1080 accept
检查命令:
ufw status verbose
nft list ruleset | grep -n '1080'
ss -tulpen | grep ':1080'
当前 Gost SOCKS5 主要使用 TCP。除非确认需要 UDP 转发,否则只放行 TCP 可以进一步减少暴露面。不要同时用 UFW 和自定义 nftables 重复维护同一端口的冲突规则。
十、从 DMIT 测试家宽 SOCKS5
在 DMIT 节点或其他白名单 IP 上测试:
curl -x socks5h://gostuser:REPLACE_WITH_STRONG_PASSWORD@198.51.xxx.xxx:1080 https://ifconfig.me
curl -x socks5h://gostuser:REPLACE_WITH_STRONG_PASSWORD@198.51.xxx.xxx:1080 https://ipinfo.io/ip
预期结果:出口 IP 应显示为家宽 IP VDS,即 198.51.xxx.xxx 对应的公网出口。这里使用 socks5h://,目标域名由 SOCKS5 服务端解析,可避免 DMIT 提前解析目标域名。
查看连接日志:
journalctl -u gost --since '10 minutes ago' --no-pager
journalctl -u gost -f
日志常见字段:
client=203.0.xxx.xxx:xxxxx
clientID=gostuser
handler=socks5
local=198.51.xxx.xxx:1080
host=目标域名:443
这说明 DMIT 节点已通过家宽 VDS 的 1080 SOCKS5 服务转发流量。
十一、在 DMIT 上接入家宽 SOCKS5 出站
完成上一步只证明 DMIT → 家宽 VDS → 互联网 已连通。要让客户端获得家宽出口,还需要在 DMIT 的 Xray/3x-ui 中新增一个指向家宽 SOCKS5 的出站,并为家宽节点单独建立入站或路由。
推荐节点结构:
机房节点:客户端 → DMIT 入站 → freedom → 互联网
家宽节点:客户端 → DMIT 家宽入站 → SOCKS5 出站 → 家宽 VDS → 互联网
DMIT 上的 Xray SOCKS 出站示例:
{
"tag": "home-socks",
"protocol": "socks",
"settings": {
"servers": [
{
"address": "198.51.xxx.xxx",
"port": 1080,
"users": [
{
"user": "gostuser",
"pass": "REPLACE_WITH_PASSWORD"
}
]
}
]
}
}
路由规则的核心是将“家宽入站”的流量送到 home-socks:
{
"type": "field",
"inboundTag": ["home-in"],
"outboundTag": "home-socks"
}
客户端订阅中建议保留两个节点:
DMIT-机房出口DMIT-家宽中转两个客户端节点的服务器地址都应是 DMIT,而不是直接把家宽 VDS 暴露给客户端;区别在于 DMIT 服务端将两个入站分别路由到freedom和home-socks。
3x-ui 不同版本对自定义出站和路由的入口名称可能不同。修改前先备份 Xray 配置,保存后检查 Xray 日志,确认配置格式受当前版本支持。
十二、客户端验证完整链路
分别选择两个节点并检查出口:
curl https://ipinfo.io/ip
curl https://ifconfig.me
预期结果:
| 客户端节点 | 预期出口 |
|---|---|
DMIT-机房出口 | DMIT 机房 IP |
DMIT-家宽中转 | 家宽 VDS 公网出口 IP |
进一步检查:
- 使用
https://dnsleaktest.com或https://browserleaks.com/dns检查 DNS - 使用
https://browserleaks.com/webrtc检查 WebRTC - 确认客户端订阅中没有家宽 VDS 的地址
- 确认从非白名单 IP 无法访问家宽 VDS 的 22 和 1080 端口
十三、日常验证与排查命令
确认 SSH 白名单:
nft list table inet netcatty_ssh_whitelist
确认 SSH 有效配置:
sshd -T | egrep '^(port|permitrootlogin|passwordauthentication|pubkeyauthentication|kbdinteractiveauthentication|allowusers) '
确认 Fail2ban:
systemctl status fail2ban --no-pager
fail2ban-client status sshd
确认当前登录来源:
who -u
ss -tnp | awk 'NR==1 || /:22[[:space:]]/'
确认普通用户与 sudo 权限:
id operator
id admin
sudo -l -U operator
sudo -l -U admin
从 DMIT 跳板测试登录:
ssh -J admin@203.0.xxx.xxx admin@198.51.xxx.xxx
ssh -J admin@203.0.xxx.xxx operator@198.51.xxx.xxx
确认 Gost:
systemctl status gost --no-pager -l
ss -tulpen | grep ':1080'
journalctl -u gost --since '10 minutes ago' --no-pager
确认 DMIT 能使用家宽出口:
curl -x socks5h://gostuser:REPLACE_WITH_PASSWORD@198.51.xxx.xxx:1080 https://ipinfo.io/ip
从非白名单 IP 测试 SSH 和 SOCKS5,应无法建立连接。
十四、停用与清理
如果不再使用 SOCKS5,停掉服务并删除放行规则:
systemctl disable --now gost
ufw delete allow from 203.0.xxx.xxx to any port 1080 proto tcp
ufw delete allow from 203.0.xxx.xxx to any port 1080 proto tcp
ufw delete allow from 203.0.xxx.xxx to any port 1080 proto tcp
ufw status verbose
如果 DMIT IP 发生变化,需要同步更新:
- SSH
AllowUsers - nftables SSH 白名单
- Fail2ban
ignoreip - UFW 1080 端口白名单
十五、安全注意事项
- 不要在公开笔记、订阅、截图、聊天记录中保存明文密码或家宽后端凭据
- 家宽 VDS 不直接进入客户端订阅,客户端只连接 DMIT
root登录只在短时间排障时使用,完成后关闭- 修改白名单前必须确认当前来源 IP 已包含在新规则中
- Gost 监听
0.0.0.0:1080时必须依赖防火墙白名单和账号认证 - DMIT IP 变化后应同步更新所有白名单和 Fail2ban 配置
- 定期通过
sshd -T检查 SSH 最终有效配置,避免被其他片段覆盖 - 定期检查 DNS、WebRTC、出口 IP 和代理端口可达性
Xray 节点仅使用 IPv4
问题判断
域名只有 A 记录,仅代表客户端连接节点时使用 IPv4,不代表服务器访问目标网站时不会使用 IPv6。服务器具有双栈出口时,目标网站仍可能看到服务器的 IPv6。
分别检查服务器的 IPv4 和 IPv6 出口:
curl -4 https://api.ipify.org
curl -6 https://api6.ipify.org
如果两条命令分别返回 IPv4 和 IPv6,说明服务器具有双栈出口。
优先方案:限制 Xray 出站使用 IPv4
如果只希望代理节点的出站流量使用 IPv4,应优先调整 Xray,而不是关闭整个系统的 IPv6。配置字段可能随 Xray 或 3X-UI 版本变化,修改前应备份完整配置。
在 3X-UI 的 Xray Configs 中检查 DNS 和 freedom 出站配置:
{
"dns": {
"queryStrategy": "UseIPv4",
"servers": [
"1.1.1.1",
"8.8.8.8"
]
},
"outbounds": [
{
"protocol": "freedom",
"settings": {
"domainStrategy": "ForceIPv4"
},
"tag": "direct"
}
]
}
关键字段:
queryStrategy: UseIPv4:DNS 查询优先返回 IPv4 地址。domainStrategy: ForceIPv4:强制 freedom 出站使用 IPv4。
sendThrough 可按需绑定服务器的实际公网 IPv4,不应照抄其他服务器地址:
{
"protocol": "freedom",
"sendThrough": "服务器实际IPv4",
"settings": {
"domainStrategy": "ForceIPv4"
},
"tag": "direct"
}
如果还需要让节点入站仅监听 IPv4,可按实际部署设置:
{
"listen": "服务器实际IPv4"
}
保存配置后:
- 在 3X-UI 中重启 Xray。
- 在客户端更新订阅。
- 断开并重新连接节点。
- 再次检查客户端出口地址。
备选方案:临时关闭系统 IPv6
只有在 Xray 的 IPv4 出站配置无法满足需求时,才考虑关闭整个系统的 IPv6。该操作会影响服务器上的所有服务。
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1
临时配置会在重启后失效。
永久关闭系统 IPv6
写入独立的 sysctl 配置文件:
sudo tee /etc/sysctl.d/99-disable-ipv6.conf >/dev/null <<'EOF'
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
EOF
应用配置:
sudo sysctl --system
部分网络栈、容器或宿主环境可能需要重启:
sudo reboot
恢复系统 IPv6
删除配置并重新加载:
sudo rm /etc/sysctl.d/99-disable-ipv6.conf
sudo sysctl --system
sudo reboot
验证结果
IPv6 请求应失败:
curl -6 https://api6.ipify.org
IPv4 请求应返回服务器的公网 IPv4:
curl -4 https://api.ipify.org
检查服务器的 IPv6 地址和路由:
ip -6 addr
ip -6 route
客户端连接节点后,可使用以下网站检查出口:
注意事项:
- 删除节点域名的
AAAA记录不能阻止服务器出站使用 IPv6。 - Cloudflare 仅保留
A记录时,通常只能确保客户端通过 IPv4 连接节点。 ForceIPv4会导致仅支持 IPv6 的目标不可访问。sendThrough必须填写当前服务器真实存在的 IPv4 地址。- 如果 sysctl 配置生效后 IPv6 仍可用,应检查内核启动参数、网络管理器、容器网络及宿主机配置。