2023/3/30 更新:
一直说如果有遇到问题要上来说下,拖拖拉拉一直没了这事。今天大概说一下从我发布这个规则到现在大概三年时间遇到的一些问题,用了这个方法之后,大概有两年多的时间,从来没有被封过IP,是一次也没有,这期间我一直用的v2ray+kcptun。大概半年多以前吧,一个不小心看到了Shadowsocks-rust有个2022-blake3的新加密协议,然后就手痒测试了一下,结果速度亮瞎了我的眼,无论是纯tcp还是加上udp,不需要任何加速(例如kcptun之类的),再垃圾的线路几乎都可以跑满带宽,甚至超过之前一直用的v2ray+kcptun,爱到不行了,于是乎转身重新投入Shadowsocks阵营,爽了好一段时间,各种4k 8k视频都基本没压力。然而,快乐的时间总是特别快,没多久陆续被干掉了几个IP,我有多个地方使用,每个地方使用不同的前端转发,当然不是全军覆没,而是挂了其中几个。但是还是有例外的情况,因为我有台vps用来中转Shadowsocks和v2ray的,这台vps上有多个IP,这台长期使用一直没事,直到目前一直在用,甚至有时候一个月我可以用掉将近2TB的流量它都仍然是稳稳的。总结一下,协议上可能Shadowsocks始终隐秘性会差一些(注:这仅仅是个人体验,没有任何技术验证。),但最最最重要的还是要看IP的体质,哈哈!所以,不要迷信任何可以防封锁防探测的东西,当然了,这些规则至少是加强了服务器自身的安全,确实能够防探测,但防封锁我觉得可以忽略了,选择一个自己用过最坚强的协议才是正道。
现在是特殊时期,各种代理的封锁疯狂程度已经可以比得上每年的6月了,我自用的v2ray也被墙了,使用的是mkcp+tls,思前想后,最关键还是没有防探测的意识,单纯依赖软件实在太难以防得住。当然,有人会说如果用tls+nginx反代就不会有问题,这种方式确实是比较不容易被封,但是问题是这种方式速度不够快,特别是电信这种坑爹出国的各种限速,根本无法满足个人看youtube 1080p的需求。痛定思痛,重新换了ip复活,为了不再浪费gfw的资源,节省一点纳税人的钱,也节省一点自己换ip的成本,部署了防探测到服务器,具体防探测防封锁的效果目前暂时还在验证中,如果有一天仍然被墙了,我会上来报告一下,如果没有,说明它仍然有效。
补充说明一下目前我使用的代理方式,由于新版v2ray(4.22.1)的mkcp有些问题,我现在使用v2ray的tcp+kcptun,实测效果不输mkcp,唯一缺点可能就是带宽有些浪费,流量小的慎用。
大体的思路其实很多人都有提过,就是不对外开放端口,靠防火墙来给自己开一条私有通道。除了你自己,别人无法访问这个端口,也就让gfw没有探测的条件。
本次实现环境服务器和客户端均为Debian,不过只要是Linux都是可以通用,在开始部署之前,假设你的服务器已经有iptables或者其他基于iptables的防火墙,并且没有打开你代理服务(ssr或者v2ray之类的)的端口。
2020/04/24规则更新
修复04/05规则重大错误,如果有之前用了之前规则的请立即更新防火墙规则。
2020/04/05规则更新,增加防暴力ping探测。
2020/04/05 更新内容
增加了防止ping暴力探测字节密码,请务必注意默认屏蔽了65字节到1500字节的ping,只要ping了其中一个非指定字节,默认封IP 3天,测试时请给自己留个白名单ip以免把自己挡在服务器外。
只有第一次ping中指定字节才规则才可以生效,如果第一次ping错字节,就算再ping第二次是对的也没用,直接封IP 3天,规则可根据需要自行调节。
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 93:1027 -m recent --set --name fuckgfw --rsource -j DROP
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 1029:1528 -m recent --set --name fuckgfw --rsource -j DROP
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 1028 -m recent --rcheck --seconds 259200 --name fuckgfw --rsource -j DROP
iptables -A INPUT -p tcp --dport 1:65535 --syn -m recent --rcheck --seconds 259200 --name fuckgfw --rsource -j DROP
iptables -A INPUT -p udp --dport 1:65535 -m recent --rcheck --seconds 259200 --name fuckgfw --rsource -j DROP
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 1028 -m recent --set --name v2port --rsource -j ACCEPT
iptables -A INPUT -p tcp --dport 5678 --syn -m recent --rcheck --seconds 3600 --name v2port --rsource -j ACCEPT
iptables -A INPUT -p udp --dport 5678 -m recent --rcheck --seconds 3600 --name v2port --rsource -j ACCEPT
上面的规则假设你的代理服务端口为5678,类型为tcp/udp,如果你要用kcptun之类的或者v2ray的mkcp,那么使用的就是udp端口(可根据自己需要删除其中一条不需要的tcp或udp规则),设定的ping密码为1000字节,端口开放时间为1小时(3600秒)。请不要直接复制使用,修改ping密码为自己自定义的字节数,建议设置1400以下任意值,具体length的值为你要设置的ping值+28,比如你设置1000字节,那么length就为1028。
客户端访问方式,假设服务器ip地址为12.34.56.78
Windows
ping -l 1000 12.34.56.78
Linux/Mac OS
ping -s 1000 -c 4 12.34.56.78
当你执行完ping的操作,你的服务器端口就会为你开放1个小时,这个端口的开放是仅为你的当前ip而开放,对其他人来说这个端口仍然是无法访问的。1个小时后还要再ping一次,可写一个ping的脚本,Windows用计划任务,Linux用crontab,定时执行ping,建议每59分钟ping一次,当然如果你的ip经常变动,那么每次变ip就要执行一次ping操作。用openwrt路由器的,并且是pppoe拨号的,可以在/etc/ppp/ip-up.d文件夹下新建一个ping的脚本,如果每次有断线,就会自动执行ping。
ping的动作执行完就可以开启你的代理软件了,只有你的ip可以连接你服务器的代理服务。以上的教程主要适用于动态ip的用户,如果你有静态ip,那么就简单了,直接把你的ip加入服务器的白名单,连ping都不需要了。
希望有一天我们不再需要翻墙,希望有一天我们有一个开放自由的环境,无论是现实还是网络。
苹果手机怎么ping呢 有没有好的工具
这个还真的不知道哦,有条件还是推荐使用路由器自动翻,android就好解决,ios不太熟悉。
已经按照博主的规则开启了,直接vmess+tcp+bbr,效果也还可以。我是用docker安装的v2ray,在这里提醒一下同样使用docker安装的朋友:docker服务会注册一个虚拟网卡DOCKER,访问docker服务的流量会直接被转发到DOCKER上,所有单单设置INPUT规则不够,其它IP依然可以连通。要再单独先阻挡DOCKER,再按照IP开启访问。
博主您好。kcptun效果好是好,但是加一个kcptun客户端感觉很不方便吧?尤其是iOS好像还没有kcptun的客户端。我如果直接vmess+tcp,然后开bbr行吗,可能效果差一点但是方便。我理解的这个方法关键在于私有通道,用啥协议无所谓,kcptun加速效果好一点。mkcp不需要额外的客户端,不知道和kcptun比咋样。另外,博主没有碰到过被运营商Qos的情况吗,udp流量大了容易被Qos,也就是会有一小段时间断联,过一会儿又好了
这个情况还是看个人网络状况来判断吧,如果是QOS很严重的,最好搞个国内中转,kcptun我在某些电信网络下可以有效提升数倍的速度,bbr提升不明显。防封锁来说这个方法不算很有效,最重要还是要看代理方式,不过这个方式可以一定程度上提升安全。mkcp我的体验是很容易被封,当然不同网络也可能不同情况,目前用下来感觉用联通+cdn中转nginx+vless+ws就很爽了,优选下cf的ip,速度都很理想,电信同样方式稳定性差一些。
请问目前这个规则还有效吗?
如果我要开放一段范围的端口,该如何设置呢?
如这个,我开放了 10123:10133端口,并把流量全部转发到8388 ss监听的端口
iptables -t nat -A PREROUTING -p tcp --dport 10123:10133 -j DNAT --to-destination 127.0.0.1:8388
其实我上面已经反馈过了,这个方法实测下来,有提升安全的效果,但是防止封锁还是需要依靠安全的代理软件,如果特征别妥妥的识别了,那么这个方法也救不了,ss的话我自己的体验是比较容易被识别,建议可以套个kcptun。
对了,再提醒一个点,如果vps有ipv6地址并启用了ipv6的话,还要再设置ipv6的ip6tables规则。
主要是现在自建的人也算比较普遍了,其中大多数还是不了解Linux系统甚至计算机都不懂多少的。我自己也仍然只能算入门者,而我一直以为防火墙是默认开启的就从没检查过,直到测试这个方法的时候才发现我所有的vps的默认规则都是accept。
建议可以稍微更新一点点blog内容,添加一下默认input规则就好了。
博主您好,请问这种方法是否需要将input的默认规则设为drop?否则若默认规则是accept的话,如果某主机没有提前进行ping的操作而是直接对VPS进行tcp连接的话,不会触发由错误ping导致的drop规则,就会被直接接受吧?是这样么?
是的,默认肯定是阻挡所有入站请求的,不然规则就没有意义了。规则顺序应该是:
1、默认阻挡所有入站。
2、当ping的字节相符,对相关的IP打开对应端口的访问权限;
当ping的字节不符,封锁相关IP。
3、规则在设定的时间内自动过期。
可能我的规则相对较偏激了,初衷只是为了提高探测的时间成本。这种方法本身也不是万全的,但对于个人使用而言足够了。
没看到您的回复,其实我发了提问之后就解决了这个问题。很多系统默认iptables规则是accept的,所以默认是接受所有流量的,也就是添加的规则都没触发就直接接受,这也就是为什么上面有人说:
“主,我按照你的配置设置,如果一个ip的ping字节错了确实不能再ping了,但是v2的服务似乎不受影响,而且动态ip更新后也不用ping自己就能连上,这是为什么?”
BTW,博主可能需要设置一个邮箱回复提醒?今天也是偶然打开这里才看到您的回复的
最后,感谢博主的分享。
可能我当时写的时候,默认大家都是有防火墙意识的,所以没有把这个基本前提写出来,最近因为站点迁来迁去搞丢了一些提醒的配置,后续找个时间完善一下,谢谢提醒。
主要是现在自建的人也算比较普遍了,其中大多数还是不了解Linux系统甚至计算机都不懂多少的。我自己也仍然只能算入门者,而我一直以为防火墙是默认开启的就从没检查过,直到测试这个方法的时候才发现我所有的vps的默认规则都是accept。
建议可以稍微更新一点点blog内容,添加一下默认input规则就好了。
如何了,今天还存在?个人认为不是gfw自己去扫,这样太累太慢,只需关注isp出口的udp异常即可,现在改为记录模式了,gfw平时睁一只眼闭一只眼,关键时候拿出ip的log一并封。
我暂时没遇到什么问题,从去年到现在一直很稳,之前用v2ray的kcp死得很快。
呜呜
我的被墙了
深表同情,可能这个方法也不是万无一失的,我自己用目前已经稳定了一年了,没遇到什么问题。
到现在有没有被墙呢
目前仍然很稳,没问题,设置好定时任务,几乎不需要折腾。
我又清楚所有规则重新试了一下,一开始先加iptables -A INPUT -p tcp --dport (port) -j DROP
然后完全按照你的配置输入(除了最后两步的端口),结果ping了之后还是没有开放v2的端口
我在最前面加了句
-A INPUT -p tcp --dport {v2端口} -j DROP
结果现在变成ping不ping都不能连上了,显示 net/http request canceled...
我觉得你应该分两步做测试,先设置好你服务器原本需要的规则,确定v2ray的端口是被防火墙屏蔽不能访问的,然后第二步再应用上面的规则,上面的规则不需要改动,最好你服务器有vnc远程可以访问,或者加个白名单的IP,万一规则测试失败不会把自己关在外面。
目前的规则我做过很多次测试,应该是没问题的了。
博主,我按照你的配置设置,如果一个ip的ping字节错了确实不能再ping了,但是v2的服务似乎不受影响,而且动态ip更新后也不用ping自己就能连上,这是为什么?
是用的最新的吗?如果是04/24前的规则请更新到现在最新的,前面的规则有问题。
我就是刚刚才看到,上面显示的应该就是最新的吧
是的,如果是这个情况的话你要先检查下你原有的防火墙规则,是否打开了v2ray的端口,默认不要打开v2ray的端口,这样规则才能生效。
这两天是封的比较疯狂,google一下就到这了
博主实践的怎么样了,能不能发我一份详细的配置呢
目前用了一个多月,暂时很稳,没问题。
详细配置都在上面了,每个步骤都有了。
非常好的思路,解决了我困扰已久的问题。
设定端口开放时间的目的没太明白。
按照我的需求,把正确ping过的ip自动归集到ipset,然后iptables规则进行访问控制。
op端按照博主提示,写脚本重新拨号后自动执行ping,安卓端用tasker实现自动化。
目前来看完美。
模板有些问题,暂时用默认模板了,没时间折腾,目前我在测试新的方式,动态全自动白名单,功能类似,基于ddns和csf防火墙,比这个无感,连ping都不需要了,抽空我整理下。
楼主你好,想要用你这个基于ddns的方案,能否麻烦分享一下?
没太明白你要实现什么功能?如果是动态ping,可以用计划任务执行即可。
哦,审不审核不知道,反正经常留言不成功,显示超时错误。。
看来用哪种方式也是个人喜好。
ipset可以设置timeout,也有较好的自由度。
超级期待您的新点子。
不管是trojan还是ss,后台依然有很多reset错误,估计墙还是在探测,但不明白详细机制了,不影响使用就不理它了。
抱歉,最近程序有点问题,因为工作较忙,没什么时间修复,程序是出错了但其实留言是成功的,不过我不知道为什么你的留言进了待审核,我原本的设置是只有第一次需要审核。如果是有cookie的话应该不需要再次审核的。
非常棒的点子,解决了困扰我好久的问题。
不过不太明白为什么要限制端口开放时间。
可以将v2port里面的IP地址自动归集为ipset,然后加规则控制访问。
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 1028-m recent --set --name v2port --rsource -j SET --add-set ipset_name src
就个人需求来说,这是最佳解决方案。
限制时间的原因是这个主要是用于动态IP,甚至有时候只是临时访问一下,如果设置成固定,安全性会有所降低,时间一长收集了一大堆没在使用的IP,规则的时间长短可以自行修改,对于长期需要开放的,我通常在路由器上用crontab设置个ping的定时任务,可以保证全天正常访问。