知识关系

所属体系: 数据中心与基础设施 / 数据中心网络体系 主题节点: 异地组网+Nginx反代 | 计算资源本地化 推荐前置: IT基础知识百科 相关主题: Linux查询ssh日志判断是否被入侵及加强ssh安全的办法 原始来源: source/_posts/异地组网加Nginx反代实现计算资源本地化.md 从旧博客迁移;已按知识图谱结构重新归档。


本次部署的目的是利用本地高性能的计算资源和云服务器畅通无阻的公网,实现无公网环境也可正常部署业务。

本文所用到的技术如下

名称作用软件
单向异地组网将云服务器和本地服务器组成局域网,因本地服务器没有公网,所以由云服务器建立UDP连接实现组网WireGuard
反代将对云服务器发起的访问根据配置的业务转发到本地服务器进行处理Nginx
网络转发配合wireguard实现对网络流量的路由和转发,确保组网的通畅iptables

单向异地组网

2025.2.18补充:组网成功后大概十几分钟,被运营商墙了,太狗了,因为wireguard走的是UDP协议,被运营商检测到了。目前有两个思路,找运营商加个公网IP或者想其他办法组网 2025.2.18 10:55记录思路:使用udp2raw将UDP流量封装到TCP流量中,并伪装成HTTPS 2025.2.18 10:57补充,尝试udp2raw能打通后先用着,如果再次被封则换为xtls-rprx-vision透明代理UDP流量,实现最强HTTPS伪装

特性udp2rawxtls-rprx-vision
工作原理把 UDP 伪装成 TCP 或 ICMP,进行 NAT 穿透通过 Xray Vision 协议将流量伪装成 HTTPS/TLS
支持协议任何 UDP 流量(WireGuard、IPSec、OpenVPN等)任何 TCP/UDP 流量(支持 UDP over TCP)
流量伪装可伪装为 TCP(HTTPS、SSH)或 ICMP伪装成合法 HTTPS 流量
加密方式XOR、AES(轻量级加密,防止 DPI 识别)XTLS(高级 TLS 伪装,难以被识别)
端口可伪装成 443(HTTPS)等,但仍是伪 TCP直接监听 443 端口,真实 HTTPS 伪装
数据包特征模拟 TCP,但仍然是 UDP 数据包封装真实 HTTPS 流量,运营商难以检测
防 DPI基本防御,部分 DPI 仍能检测出伪 TCP最高级别防御,难以被识别
延迟低,基本无影响略高,取决于 TLS 处理开销
适用场景适用于 UDP 被封但 TCP 可用的环境适用于 DPI 严格的环境,如中国大陆或企业网络
是否需要证书不需要需要 TLS 证书(Let’s Encrypt 等)
稳定性高,几乎无性能损耗高,但 TLS 可能增加 CPU 负担
适合长期使用可以,但可能被进一步分析更适合长期使用,难以封锁

服务器部分

# 安装wireguard
apt install wireguard -y
 
# 生成私钥公钥到/etc/wireguard/目录下
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey | tee /etc/wireguard/server_public.key
# 查看私钥公钥,稍后需要写入到配置文件中
cat /etc/wireguard/server_private.key
cat /etc/wireguard/server_public.key

/etc/wireguard/下创建一个配置文件,例如wg0.conf,按如下所述写入配置:

[Interface]
Address = 10.0.0.1/24 # 服务器的局域网IP,/24是前缀,对应255.255.255.0
ListenPort = 26666 # 端口协议是UDP,端口可以自定义
PrivateKey = 云服务器私钥 # 刚刚生成的服务器私钥
DNS=8.8.8.8
MTU=1420
 
# 这部分是配置的iptables的转发,其中eth0替换为云服务器公网的网卡名称
# 原理:
# 允许wg0的流量通过iptables转发到eth0
# iptables -A FORWARD -i wg0 -j ACCEPT
# 将eth0上的流量进行源地址伪装,让对方以为来自局域网的流量是从公网IP发出的
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
 
# 端口启动时执行,其中-A是添加
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 端口关闭时执行,其中-D是删除
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
 
[Peer]
PublicKey = 内网服务器公钥 # 稍后在内网服务器生成的公钥
# 允许内网服务器连接,IP是10.0.0.2,前缀32对应255.255.255.255
# 作用是仅允许这一个IP连接。可以根据需要自行组合IP段和前缀
AllowedIPs = 10.0.0.2/32
# 编辑完配置文件后启动服务
# 其中wg-quick是wireguard的启动工具,@连接wg0,是配置文件的名称
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

内网服务器部分

# 与服务器一致,生成公钥私钥,只是名称是client开头
wg genkey | tee /etc/wireguard/client_private.key | wg pubkey | tee /etc/wireguard/client_public.key
# 查看公钥私钥,准备写入配置文件
cat /etc/wireguard/client_private.key
cat /etc/wireguard/client_public.key
 

/etc/wireguard/下创建一个配置文件,例如wg0.conf,按如下所述写入配置:

[Interface]
Address = 10.0.0.2/24 # 10.0.0.2则是内网服务器在组网内的IP地址
PrivateKey = 内网服务器私钥
 
[Peer]
PublicKey = 云服务器公钥
AllowedIPs = 10.0.0.1/32 # 前缀32限制只允许云服务器IP连入
Endpoint = 云服务器IP:26666 # 指向云服务器IP和端口
PersistentKeepalive = 25
# 编辑完配置文件后启动服务
# 其中wg-quick是wireguard的启动工具,@连接wg0,是配置文件的名称
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

共同配置部分

在内网和云服务器均开启转发

echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sysctl -p

反向代理