Pages

Sunday, 29 March 2020

翻墙,防封锁防探测


各种代理的被封锁的疯狂程度已经可以比得上每年的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之类的)的端口。

其实就两条iptables规则解决。

适用TCP的规则:
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m length --length 128 -m recent --set --name fuckgfw --rsource -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 5678 --syn -m recent --rcheck --seconds 3600 --name fuckgfw --rsource -j ACCEPT
上面的规则假设你的代理服务端口为5678,类型为tcp,设定的ping密码为100字节,端口开放时间为1小时(3600秒)。请不要直接复制使用,修改ping密码为自己自定义的字节数,建议设置1400以下任意值,具体length的值为你要设置的ping值+28,比如你设置1000字节,那么length就为1028。
上面的设置适合使用tcp的用户,如果你要用kcptun之类的或者v2ray的mkcp,那么使用的就是udp端口,可使用下面规则。

适用UDP的规则:
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m length --length 128 -m recent --set --name fuckgfw --rsource -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 5678 -m recent --rcheck --seconds 3600 --name fuckgfw --rsource -j ACCEPT

客户端访问方式,假设服务器ip地址为12.34.56.78,
Windows下,
ping -l 100 12.34.56.78

Linux下,
ping -s 100 -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都不需要了。

暂时写到这里,之后有需要再做补充.