经本人亲身实践,通过国内服务器转发科学上网流量不仅能有效避免墙的干扰,还有加速的作用。流量转发说白了就是流量从“国内境外vps”变成了“国内国内vps境外vps”。看似多了一步,其实大有好处:国内服务器延迟很低,但出入境流量走高级线路,加起来一算总延迟实际上降低了;此外选择好的中转服务器,高峰时期也能跑满带宽,爽的一批。
中转属于硬件加速,代价是额外需要一台国内的服务器,优点是更稳定、能(比较)有效防止境外ip或端口被封。一些付费工具的高级线路也使用中转,以提供更优质的体验。
本文以CentOS 7/8系统为例介绍国内服务器中转配置,分别介绍firewalld流量转发和nginx流量转发两种方式。
yum install -y firewalld
firewalld流量转发
firewalld
是CentOS7/8默认的防火墙前端软件,绝大多数主机商提供的镜像都已经安装。如果执行firewall-cmd --state
的输出不是 running,请使用下面命令安装并开启firewalld
:
在开机时启用一个服务:systemctl enable firewalld.service
启动:systemctl start firewalld
查状态:systemctl status firewalld
查询防火防所有开放端口及规则:firewall-cmd --list-all
停止:systemctl stop firewalld
重启:systemctl restart firewalld
重载:firewall-cmd --reload
接着配置转发。假设你将国内服务器8080端口流量转发到国外vps的443端口,转发命令如下:
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
firewall-cmd --query-masquerade # 检查是否允许伪装IP,返回no表示没开启,反之开启伪装IP
firewall-cmd --add-masquerade # 允许防火墙伪装IP
firewall-cmd --add-masquerade --permanent # --permanent 永久生效,没有此参数重启后失效
# 8080可以改成其他端口
firewall-cmd --permanent --add-port=1-65535/tcp
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --permanent --add-port=8080/udp
# 8080和上面保持一致,国外ip改成你国外vps的ip,443改成国外ss/ssr/v2ray等软件的端口,常规添加TCP即可
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toaddr=国外ip:toport=443
firewall-cmd --permanent --add-forward-port=port=8080:proto=udp:toaddr=国外ip:toport=443
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toaddr=8.212.130.39:toport=8080 && firewall-cmd --reload && firewall-cmd --list-all
# 重载firewall 防火墙配置
firewall-cmd --reload
# 删除规则 firewall-cmd --permanent --remove-forward-port=
firewall-cmd --permanent --remove-forward-port=port=8080:proto=tcp:toaddr=8.212.129.50:toport=8080
运行上述命令后,打开ss/ssr/v2ray等客户端软件,把ip和端口改成国内vps的ip和端口号,应该同样能正常上外网。
如果中转trojan流量,记得把客户端配置文件中的两个verify选项设置为false!
firewalld
转发的好处是效率高,直接在内核执行。
可以直接运行
systemctl enable firewalld.service
systemctl start firewalld
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
firewall-cmd --add-masquerade --permanent
firewall-cmd --permanent --add-port=1-65535/tcp
firewall-cmd --permanent --add-port=1-65535/udp
firewall-cmd --reload
firewall-cmd --list-all
firewall-cmd --permanent --add-forward-port=port=22022:proto=tcp:toport=22
中转配置+bbrpuls
yum install -y wget && wget -N --directory-prefix=/root -O install_bbrpuls_port.sh http://img.cloudduo.cn/vpn/v2ray/port/install_bbrpuls_port.sh && sh install_bbrpuls_port.sh
Nginx反向代理(测试当天就封443端口)
获取当前时间:
date +%Y_%m_%d_%H%M%S
location ^~ 面板url根路径 {
proxy_pass http://127.0.0.1:面板监听端口/面板url根路径;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location 节点路径 {
proxy_redirect off;
proxy_pass http://127.0.0.1:节点端口;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_read_timeout 300s;
# Show realip in v2ray access.log
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
示例:
location ^~ /cloud {
proxy_pass http://47.242.164.5:12345/cloud;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /cloudjiedian {
proxy_redirect off;
proxy_pass http://47.242.164.5:34305;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_read_timeout 300s;
# Show realip in v2ray access.log
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /cloudjiedian1 {
proxy_redirect off;
proxy_pass http://47.242.164.5:21212;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_read_timeout 300s;
# Show realip in v2ray access.log
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}



Nginx流量转发
Nginx是非常强大的四层、七层反向代理软件,功能强大,在互联网上广泛应用。本节介绍Nginx转发配置。
1. 首先安装nginx:yum install -y epel-release && yum install -y nginx
;
2. 配置nginx:编辑/etc/nginx/nginx.conf文件,加入转发配置:
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
# 增加的配置
stream {
server {
listen 端口号; # 1-65535的任意一个数字,无需与境外服务器的端口号相同
proxy_pass 境外ip:境外端口号; # 用境外ip和端口号替换
}
}
# 转发配置结束
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
....
}
配置中增加了以stream开头的那一段,其他都是自带的。将上面代码中的ip和端口换成你的,然后保存文件。用nginx -t
检查配置有没有错误,有如下输出说明配置正确:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
如果有问题,请按照提示更改。
3. 改好后设置开机启动并启动nginx:systemctl enable nginx && systemctl start nginx
。接着用ss -ntlp| grep -i nginx
查看软件是否正常运行。如果输出为空,可能的问题是端口号冲突,改成其他端口号试试;或者是selinux的限制,用下面命令禁用selinux:
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config setenforce 0
4. 如果服务器启动了防火墙,放行nginx监听的端口。怎么看防火墙是否开启呢?输入firewall-cmd --state
,输出是”running”表示防火墙正在运行。用如下命令把端口放行:
firewall-cmd --permanent --add-port=nginx中配置的端口号/tcp
fireawll-cmd --reload
5. 如果服务器厂商上层还有防火墙/安全组(阿里云/腾讯云等购买的vps),请记得到控制台放行相应端口。
完成上述操作后,搭建手机、电脑上的ss/ssr/v2ray等客户端,把ip和端口改成国内vps的ip和端口号,应该同样能正常上外网。
如果中转trojan流量,记得把客户端配置文件中的两个verify选项设置为false!
Nginx效率不如firewalld/iptables,但是配置更灵活,使用上更便利。
配置境外服务器
原则上只要境外服务器没被墙或者端口没有被封,配置好国内服务器就直接能用且有加速效果。对境外服务器做配置,主要是为了降低墙的干扰,减少ip被墙的机率。如果你不清楚下面的操作,请不要做这一步!
配置境外服务器的重点:除ssh的22、正常服务的端口(例如网站),其他端口只允许国内服务器连接。操作如下:
1. 启动系统防火墙:systemctl enable firewalld && systemctl start firewalld
2. 删除之前放行过的ss/ssr/v2ray等端口(如果配置过):firewall-cmd --permanent --remove-port=端口/tcp
3. 仅允许国内ip连接该服务器:
firewall-cmd --permanent --add-source=国内ip/32
fireawll-cmd --reload
经过如上配置后,gfw探测你的vps,除了ssh、网站等常用端口,ss/ssr/v2ray的端口直接无法连接,被墙的概率自然就降低了。
其他
一些注意事项:
- nginx支持转发流量到多个服务器实现负载均衡,配置上需要用到upstream块,请参考文档或留言;
- 如果用的是iptables,把firewalld命令替换成iptables命令执行就可以
- 如果动手能力强,最好把境外vps配置得像一个业务机器,例如一个有各种爬虫访问的网站,基本上就稳如狗了(本人用的就是这种);
- 配置客户端时,ip和端口填国内服务器的,其他信息(密码、加密方式等)和国外服务器保持一致;
- NAT VPS需要端口映射,因此客户端配置的ip和端口应该是NAT VPS映射获取到的公网ip和端口号。