使用国内服务器中转流量

经本人亲身实践,通过国内服务器转发科学上网流量不仅能有效避免墙的干扰,还有加速的作用。流量转发说白了就是流量从“国内<–>境外vps”变成了“国内<–>国内vps<–>境外vps”。看似多了一步,其实大有好处:国内服务器延迟很低,但出入境流量走高级线路,加起来一算总延迟实际上降低了;此外选择好的中转服务器,高峰时期也能跑满带宽,爽的一批。

中转属于 硬件加速 ,代价是额外需要一台国内的服务器,优点是更稳定、能(比较)有效防止境外ip或端口被封。一些付费工具的高级线路也使用中转,以提供更优质的体验。

本教程详细介绍转发的过程,如有不明白的地方,欢迎留言讨论。

配置国内服务器中转流量

既然要通过国内服务器转发流量,首先必须要一台国内服务器。国内服务器的选择有很多,建议使用NAT VPS,年付几十到一两百,NAT VPS中转请参考:使用NAT VPS中转加速。也可以用阿里云、腾讯云这些大厂商的服务器,质量和服务都比较有保障。由于服务器仅做流量转发用,买最低配置的就可以,1核256m内存足够,看视频的话带宽买大点,也可以选择流量计费模式(不适合视频党)。

本文以CentOS 7/8系统为例介绍国内服务器中转配置,分别介绍firewalld流量转发和nginx流量转发两种方式。

firewalld流量转发

firewalld是CentOS7/8默认的防火墙前端软件,绝大多数主机商提供的镜像都已经安装。如果执行 firewall-cmd --state的输出不是 running,请使用下面命令安装并开启firewalld

yum install -y firewalld
systemctl enable firewalld
systemctl start firewalld

接着配置转发。假设你将国内服务器8080端口流量转发到国外vps的443端口,转发命令如下:

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
firewall-cmd --permanent --add-masquerade
# 8080可以改成其他端口
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --permanent --add-port=8080/udp
# 8080和上面保持一致,国外ip改成你国外vps的ip,443改成国外ss/ssr/v2ray等软件的端口
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 --reload

运行上述命令后,打开ss/ssr/v2ray等客户端软件,把ip和端口 改成国内vps的ip和端口号,应该同样能正常上外网。

如果中转trojan流量,记得把客户端配置文件中的两个verify选项设置为false!

firewalld转发的好处是效率高,直接在内核执行。

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的端口直接无法连接,被墙的概率自然就降低了。

其他

一些注意事项:

  1. nginx支持转发流量到多个服务器实现负载均衡,配置上需要用到upstream块,请参考文档或留言;
  2. 如果用的是iptables,把firewalld命令替换成iptables命令执行就可以
  3. 如果动手能力强,最好把境外vps配置得像一个业务机器,例如一个有各种爬虫访问的网站,基本上就稳如狗了(本人用的就是这种);
  4. 配置客户端时,ip和端口填国内服务器的,其他信息(密码、加密方式等)和国外服务器保持一致;
  5. NAT VPS需要端口映射,因此客户端配置的ip和端口应该是NAT VPS映射获取到的公网ip和端口号。

《使用国内服务器中转流量》上有27条评论

          1. 我填的是 v2xtls.org 这种的,没有https:// 这样不行吗,应该填哪种格式啊

  1. 为啥苹果shadowrocket访问中转都没问题,能上外网,但是安卓和windows的v2ray就不行呢?中转不了啊

  2. firewall-cmd –permanent –add-forward-port=port=8080:proto=tcp:toaddr=国外ip:toport=443
    这行不能填写dns啊,有什么办法吗

  3. 回帖,注意我的测试时间。用腾某云的linux配合nginx可通。开始为了省事用宝塔面板配合原生的firewalld不通,面板配置防火墙方便一点。尝试了各种放通端口都不行,直接运行命令也不行。然后关掉firewall,用nginx可以实现。注意:利用宝塔面板的nginx插件提供的配置修改会报错。大意就是已经存在了一个配置文件,不能在这里配。要根据报错路径,找到对应的配置文件,在对应的配置文件中修改才可以,然后测试通过。建议通过宝塔面板来处理,包括修改和找文件对于新手是比较友善的。而且自带终端,可以执行命令。因为云服务商已经提供了外部的防火墙,所以内部即使全放通,外部规则也能具有保护。下一步是将各服务器的防火墙搭建好。

      1. 回帖,坐标SH,当时也是在这里测试的。选的NJ的linux,因为有优惠。结果用了一晚上,第二天还是挂了。最后放弃了,买的justmysocks。原来的搬瓦送朋友了。首先这种方式是可以通的,就像小编讲的刚开始不要上太多流量。这个没有道理也没有原理。但是最扯的是,下午搞好以后,晚上11点左右,被报告说有日本的IP登陆了我的服务器,第二天上去看,处理器一直100%。但是也查不到大量吃处理器的程序。流量也不多。还好是按量付费,直接销毁就得了。我也是带符号的混合密码,没想通是哪里出的问题,总之做好防护,最好用自生成的随机密码。如果折腾到最后真的心累了,就justmysock吧,写在这里,是因为我也是第一次听这个东西,很多人都不知道搬瓦自己搞的服务。

    1. 测试先用按量付费,自己能弄好的。再转包年包月。按量付费的最高带宽100兆,八毛钱一个GB的流量,应该是只记单向。后面转包年包月可以最大两百兆带宽。价格一样。按量付费测试好以后,做个镜像快照,同地区可以另购其他更便宜的linux。不一定要在按量配置上转包年的。

  4. nginx支持转发流量到多个服务器实现负载均衡,配置上需要用到upstream块,请参考文档,这个文档在哪里呢?

  5. 请问一下可以用firewall-cmd实现一台中转机链接N台落地鸡吗?
    我是用站群服务器搭建的SK5被墙的很厉害 想用香港鸡中转一下
    有什么需要注意的地方吗?

      1. 我尝试了使用gost搭建隧道 用ws做伪装,sk5是gost自带的,我直接链接落地鸡是双通的,但是使用中转的话显示绑定在中转的udp通道上然后不通
        比如1.1.1.1是落地,2.2.2.2是中转
        我sk5直接链接1.1.1.1就是双通
        我sk5链接2.2.2.2通过ws隧道转发到1.1.1.1的sk5端口,显示的是连接SK5服务器成功,以绑定在2.2.2.2的UDP隧道,尝试转发失败
        这种情况我是双通的吗..

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注