关于某SSR

发布于 2020-01-24  71 次阅读


2020/01/25,ssr爆炸,超时——初步估计端口被封,但是还是尝试了回滚(很显然失败了),以及服务更新和重启(同样也失败了),最后重新装ssr,切换到另一个端口,改了防火墙后,重启服务器,这才通掉,然而代价是,由于025号快照是基于Update指令后的版本,倒是锐速再次挂掉......

以下给几个SSR维护需要用到的东西:

1.指令:

启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
状态:/etc/init.d/shadowsocks status
配置文件路径:/etc/shadowsocks.json
日志文件路径:/var/log/shadowsocks.log
安装路径:/usr/local/shadowsocks/shadowsoks

2.配置文件:

{
"server": "0.0.0.0",
"server_ipv6": "::",
"local_address": "127.0.0.1",
"local_port": 1081,
"port_password":{
"端口1":"密码1",
"端口2":"密码2",
"端口3":"密码3",
"端口4":"密码4",
"端口5":"密码5"},
"timeout": 120,
"udp_timeout": 60,
"method": "chacha20",
"protocol": "auth_sha1_v4_compatible",
"protocol_param": "",
"obfs": "tls1.2_ticket_auth_compatible",
"obfs_param": "",
"dns_ipv6": false,
"connect_verbose_info": 1,
"redirect": "",
"fast_open": false,
"workers": 1
}
 iptables -I INPUT -p tcp --dport 端口 -j ACCEPT (开端口指令)

(部分内容引用自@Svlik )

被墙分析——

遇到无法顺利科学上网的情形,首先应该判断自身网络是否有问题。操作页很简单:浏览器打开百度,能顺畅打开说明网络没问题;打不开或者很难打开,说明自身网络不行,要先解决。

接下来查看服务器vps是否正常运行。ssh远程桌面连接到vps,查看服务端程序有没有正常运行。如果程序意外退出,重启后再试试能否科学上网。如果不能连接到服务器,登录服务器运营商管理后台,查看是否有欠费流量用尽被攻击等情形。服务器处于异常状态,则应先自行或联系客服解决,之后再重试能否科学上网。

做完上述两步,有如下现象可判定服务器已经处于被墙状态:

  • 管理后台显示vps运行正常,但国内无法ping通,境外ip可以(ip被列入黑名单);
  • 能ping通,也能telnet过去,但ssh等软件无法正常使用,抓包或日志显示应答超时(tcp阻断)。
  • 端口扫描建议:http://tool.chinaz.com/port/ (国内) https://www.yougetsignal.com/tools/open-ports/ (国外)

除ip被墙,还有以下姿势:

  1. 域名被墙:国内域名被解析到错误的ip导致网站无法打开(dns污染);
  2. 端口被墙:22/80/443等常用端口一切正常,科学上网端口无法连接(本次国庆前后现象最明显);
  3. tcp干扰:连接不稳定,经常断线,例如ssh连到境外服务器经常莫名其妙被断线。

比较简单有效的方法是多测试。某些网络(例如电信宽带)或设备(例如电脑)能正常科学上网,但是其它不行,也许只是配置或者运营商线路问题;如果只有境外朋友的能正常连上,就说明真的被墙了。

补救方法

  1. 国内服务器转发。阿里云等厂商的国际线路优先级比较高,其服务器与被墙vps能直接通信,这种情形下做个转发即可正常使用,代价是多买一个国内服务器。顺道说一下,如果国外线路不好,用转发方式也能大幅提升网速,以及降低被墙概率;教程:通过国内服务器转发流量
  2. 换ip。vultr等厂商提供随意更换ip的服务,可试试更换ip或者添加新的ip;
  3. 上cdn。(国内)cdn的公共ip基本不会被封,将域名解析到cdn,流量经过cdn再到被墙服务器,代价是需要一个域名并配置cdn;
  4. 换端口。针对端口被墙情形,更换新端口,采用另一种加密方式。
  5. 实在不行,那只能重建(重买)一台新服务器。

经本人亲身实践,通过国内服务器转发科学上网流量不仅能有效避免墙的干扰,还有加速的作用。流量转发说白了就是从“国内->境外vps”变成了“国内->国内vps->境外vps”,看起来多此一举,实际上是有道理的:国内大厂商国内服务器的延迟一般在50ms以内,但出入境流量都走高级线路,加起来一算延迟实际上是降低了。此外用服务器的ip连国外vps,看起来更像业务流量,墙(可能)会降低检测和干扰的概率,所以更稳定。

该方案属于 硬件加速 ,代价是额外需要一台国内的服务器(大概几十块钱一个月),优点是更稳定、能(比较)有效防止境外ip或端口被封。一些付费翻墙工具的高级线路也使用该技术做加速,可见折腾是有道理的。

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

配置国内服务器

既然要通过国内服务器转发流量,首先必须要一台国内服务器。国内服务器的选择有很多,阿里云、腾讯云等各种云基本上都可以。个人建议是购买大品牌的,不仅接入网络线路更好(BGP多线接入),而且服务质量更有保障。由于服务器仅做流量转发用,买最低配置的就可以,1核1G足够,看视频的话带宽买大点,也可以选择流量计费模式(不适合视频党)。

个人推荐安装的操作系统是CentOS 7,下文的操作基于该系统。

购买好服务器后,首先安装流量转发工具。本人常用的是 nginxhaproxy,因为 nginx 还可搭建迷惑性的网站,所以建议用nginx。

首先安装nginx:yum install -y epel-release && yum install -y nginx

接着配置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中的任意一个数字,例如8081
         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

如果有问题,请安装提示更改。改好后设置开机启动并启动nginx:systemctl enable nginx && systemctl start nginx

如果你的服务器启动了防火墙,记得把nginx监听的端口放行。怎么看防火墙是否开启呢?输入firewall-cmd --state,输出是”running”表示防火墙正在运行。用如下命令把端口放行并且禁用selinux:

firewall-cmd --permanent --add-port=nginx中配置的端口号/tcp
fireawll-cmd --reload
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
setenforce 0

如果服务器厂商上层还有防火墙/安全组,请记得到控制台放行相应端口。

配置好后,在你的ss/ssr/v2ray等软件里配置国内ip和端口号,看看能否正常连上。如果出现问题,用ss -ntlp查看端口是否被监听,以及firewall-cmd --list-all查看防火墙是否放行了端口。

配置境外服务器

原则上只要境外服务器没被墙或者端口被封,配置好国内服务器就能用且应该有加速效果。对境外服务器配置一番,主要是为了降低墙的干扰,减少ip被墙的机率。

首先还是安装nginx,安装和启动nginx的命令见上文。建议放一些静态页面(比如网上的网页模板)替换默认页面(上传到/usr/share/nginx/html目录下),让墙探测的时候看到托管了网站,并不是完全走看不懂的流量。

接下来才是配置境外服务器的重点:除了ssh的22端口,网站的80/443端口,其他端口只允许国内服务器连接。操作如下:

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
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
setenforce 0

经过如上配置后,gfw探测你的vps,除了ssh、网站等常用端口,ss/ssr/v2ray的端口根本无法连接,墙的概率自然就降低了。

其他

  1. nginx支持转发流量到多个服务器实现负载均衡,配置上需要用到upstream块,请参考文档或留言;
  2. 如果用的是iptables,把firewalld命令替换成iptables命令执行就可以
  3. 如果动手能力强,最好把境外vps配置得像一个业务机器,例如一个有各种爬虫访问的网站,基本上就稳如狗了(本人用的就是这种)

没有尽头!