WireGuard网络隧道+假TCP+Nginx反向代理实现HTTP3教程

本网站已搭载http3(仅在http响应头头部servernode信息不包含frp时才支持,因为目前frp尚未支持http3),本文中源站主机默认指没有独立ip为nat的主机

本站已支持http3(图)

本站已支持http3

在跳板机安装支持HTTP3的Nginx并配置

nginx通常在1.25.0开始支持HTTP3,所以你需要安装≥1.25.0版本的Nginx,如果你已经安装了≥1.25.0版本的Nginx版本可以跳过这一步骤

这些版本通常不会在linux发行版软件包内,所以你一般无法直接通过apt或yum命令安装

所以本文讲述从源码编译下载安装Nginx

本文以nginx1.26.3为例,如果你想要其他版本可以到nginx:下载去获得其他版本,然后在文中替换相关内容即可
如果你的主机内已经安装了nginx,可以输入nginx -V复制configure arguments:后面的内容,以延续nginx之前的配置

在linux主机(新建一个文件夹),然后进入

输入

wget https://nginx.org/download/nginx-1.26.3.tar.gz

回车,下载Nginx

然后输入

tar -zvxf nginx-1.26.3.tar.gz

回车,解压压缩包

输入

cd nginx-1.26.3

回车,进入解压出的文件夹内

如果你已经安装了Nginx,可以输入

./configure 刚才复制的内容 --with-http_v3_module

如果你还没有安装Nginx,可以输入(这段配置已经提供大多数必要的组件,如有需要可以再添加,添加–prefix=/usr/local/nginx是为了讲解方便)

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_sub_module --with-http_ssl_module --with-http_v2_module --with-http_v3_module --with-http_realip_module

如果提示错误缺什么的时候你就用安装所需软件即可,以下安装命令包含了大部分nginx所需的软件

sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev

如果你是升级就输入make,如果你是安装就输入make install

注意:如果已经安装nginx,输入make install会覆盖原来目录下的nginx

回车后没有意外的情况下你就可以看到Nginx 安装/升级 完毕

此时Nginx的程序路径应该是/usr/local/nginx/sbin/nginx (升级的话程序路径原封不动,把下文的Nginx程序路径改成你原先Nginx程序路径)

输入

/usr/local/nginx/sbin/nginx -t

回车,查看配置文件路径

一般为/usr/local/nginx/conf/nginx.conf,(升级的话就复制替换下文的相关路径即可)

输入

vim /usr/local/nginx/conf/nginx.conf

回车,编辑配置文件

如果是全新安装,在http块中添加以下内容

server {
 listen 443 quic reuseport; #支持HTTP3
 listen 443 ssl default_server;
 add_header Alt-Svc 'h3=":443"; h3-29=":443"; h3-Q050=":443"; ma=86400, h2=":443"; ma=3600'; #支持多种HTTP3版本
 ssl_certificate /root/card/example.com.pem; #替换成你的ssl证书公钥路径
 ssl_certificate_key /root/card/example.com.key; #替换成你的ssl证书私钥路径

 location / {
  proxy_pass https://10.0.0.1:444; #后端服务器地址,请替换成你的源站地址,设置成10.0.0.1:444是为了方便讲解,下文相关配置不在赘述
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  #下面是缓存相关配置,不用可以删除。注意,如果你想添加,则需要在http块里添加proxy_cache_path 你想设置的缓存路径 levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
  proxy_cache my_cache;
  proxy_cache_key "$scheme$request_method$host$request_uri$http_accept_encoding";
  proxy_cache_valid 200 302 12h;
  proxy_cache_valid 404 1m;
  proxy_cache_background_update on;
  proxy_cache_use_stale error timeout invalid_header updating;
  proxy_http_version 1.1;
  proxy_set_header Connection "";
  keepalive_timeout 75s;
  keepalive_requests 1000;
 }
}

如果你已经拥有了相关配置,只需要支持http3,则只需要在server块中添加

listen 443 quic reuseport;
add_header Alt-Svc 'h3=":443"; h3-29=":443"; h3-Q050=":443"; ma=86400, h2=":443";

然后输入/usr/local/nginx/sbin/nginx 回车运行即可,你也可以把它加入到systemctl中

安装与配置WireGuard

在源站主机和跳板机都安装WireGuard

sudo apt install -y wireguard

在任意安装了WireGuard的主机内任意准备一个空文件夹,在里面输入

wg genkey > server.key

回车,生成源站主机连接时所用的私钥文件

再输入

wg pubkey < server.key > server.key.pub

回车,生成源站主机连接时所用的公钥文件
输入

wg genkey > clients.key

回车,生成跳板机主机连接时所用的私钥文件

再输入

wg pubkey < clients.key > clients.key.pub

回车,生成跳板机连接时所用的公钥文件

输入

cat server.key && cat server.key.pub && cat client.key && cat client.key.pub

显示所有公钥与私钥

在源站主机与跳板机输入以下的命令并按i键在/etc/wireguard/的文件夹内新建并编辑文件wg0.conf

vim /etc/wireguard/wg0.conf

然后在源站主机输入以下配置

[Interface]
PrivateKey = <源站主机的私钥>
Address = 10.0.0.1/24
ListenPort = 51820
MTU = 1300 #这个MTU这里设置的算是比较保守的了,大家可以根据自己的需求设定,不适宜太高,不然会出问题的。

[Peer] #你可以按照此格式添加更多跳板机,当然需要生成更多公钥与私钥
PublicKey = <跳板机的公钥> 
AllowedIPs = 10.0.0.2/32 
Endpoint = 跳板机的公网IP:51820 
PersistentKeepalive = 25

在跳板机输入以下配置

[Interface]
PrivateKey = <跳板机的私钥>
Address = 10.0.0.2/24
ListenPort = 51820
MTU = 1300 #与源站主机配置保持一致,下文不再赘述

[Peer]
PublicKey = <源站主机的公钥>
AllowedIPs = 10.0.0.1/32

然后两台主机都按Esc退出编辑模式再输入:wq回车退出并保存

两台主机再通过以下命令启动服务

sudo systemctl enable --now wg-quick@wg0

这样WireGuard与Nginx就算是配置的差不多了,此时应该可以用HTTP3访问了

udp伪装tcp

因为某些原因,国内与国外的主机使用WireGuard组网可能会导致运营商封端口,tcp相对比udp安全,所以将udp伪装成tcp比较有必要。目前比较主流的有两个方式,我分开讲

使用udp2raw伪装

从此下载:udp2raw项目releases

把你的跳板机WireGuard配置成以下内容

[Interface]
PrivateKey = <跳板机的私钥>
Address = 10.0.0.2/24
ListenPort = 51820
MTU = 1300
PreUp = nohup <你的udp2raw绝对路径> -s -l0.0.0.0:4099 -r 127.0.0.1:51820 -k "<这里设置你自己的密码>" --raw-mode faketcp -a > /var/log/udp2raw.log &
PostDown = killall <你的udp2raw程序名> || true

[Peer]
PublicKey = <源站主机的公钥>
AllowedIPs = 10.0.0.1/32

把你的源站主机WireGuard配置成以下内容

[Interface]
PrivateKey = <源站主机的私钥>
Address = 10.0.0.1/24
ListenPort = 51820
MTU = 1300
PreUp = nohup <你的udp2raw程序绝对路径> -c -l0.0.0.0:3333  -r<你的跳板机公网ip>:4099  -k "<你设置的密码>" --raw-mode faketcp -a > /var/log/udp2raw.log &
#如果你有多个跳板机,可以添加多个上面的那一条配置,但是要保证不同的本地端口,日志路径,跳板机公网ip。
#如果你使用ipv6,则0.0.0.0替换为[::],127.0.0.1替换为[::1],其余ipv6地址记得用[]包裹
PostDown = killall <你的udp2raw程序名> || true

[Peer] 
PublicKey = <跳板机的公钥>
AllowedIPs = 10.0.0.2/32
Endpoint = 127.0.0.2:3333
PersistentKeepalive = 25

然后重启两端的WireGuard

sudo systemctl restart wg-quick@wg0

那么一切就大概率大功告成了,如果无法连接,你可以看看两端的/var/log/udp2raw.log文件
如果你不喜欢udp2raw,那么还有更好的选择:phantun

使用Phantun伪装

phantun相比udp2raw,性能更高,MTU开销更少,也就是MTU能拉更高,代价就是使用变得更复杂了

从此下载:phantun项目releases

确保你的跳板机与源站主机都安装了iptables

如果没有则用以下命令安装

apt install iptables

在源站主机运行以下命令

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

对出站流量进行掩饰,注意这里的eth0需要改成你的网卡名字,这里使用eth0是因为大多数人的网卡名称就是eth0

在跳板机运行以下命令

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 4567 -j DNAT --to-destination 192.168.201.2
#ipv4 DNAT
ip6tables -t nat -A PREROUTING -p tcp -i eth0 --dport 4567 -j DNAT --to-destination fcc9::2
#ipv6 DNAT

然后把你的源站主机WireGuard配置成以下内容

[Interface]
PrivateKey = <源站主机的私钥>
Address = 10.0.0.1/24
ListenPort = 51820
MTU = 1300
PreUp = RUST_LOG=info <你的phantun_client程序绝对路径> --local 127.0.0.1:3333 --remote 你的跳板机公网ip:56789 &> /var/log/phantun_client.log &
#再讲一遍,如果你有多个跳板机,可以添加多个上面的那一条配置,但是要保证不同的本地端口,日志路径,跳板机公网ip。
PostDown = killall phantun_client || true

[Peer] 
PublicKey = qFszQiXBmmNa0+Gmqki6lZuV4WEKjDAAHTX9F458xBE=
AllowedIPs = 10.0.0.2/32
Endpoint = 127.0.0.1:3333
PersistentKeepalive = 25

然后把你的跳板机WireGuard配置成以下内容

[Interface]
PrivateKey = <跳板机的私钥>
Address = 10.0.0.2/24
ListenPort = 7777
MTU = 1300
PreUp = RUST_LOG=info <你的phantun_server程序绝对路径> --local 56789 --remote 127.0.0.1:7777 &> /var/log/phantun_server.log &
PostDown = killall phantun_server || true

[Peer] 
PublicKey = <源站主机的公钥>
AllowedIPs = 10.0.0.1/32

然后重启两端的WireGuard

sudo systemctl restart wg-quick@wg0

那么一切就大概率大功告成了,如果无法连接,你可以看看两端的/var/log/phantun_server.log或/var/log/phantun_client.log文件

文章标题:WireGuard网络隧道+假TCP+Nginx反向代理实现HTTP3教程 文章作者:emnasop

文章未特殊说明情况下,默认使用CC-BY-NC 4.0协议,转载需注明出处,不可用于商业用途
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇