那么我们首先研究一下 移动墙的原理(不想看废话的直接跳过 但授人以鱼不如授人以渔 多学刁是好事情)
1:什么是移动墙?
境外网站只要你的服务器IP不是国内域名经常就会出现电信联通可以访问,但是移动打不开的情况。
首先你要知道 很多国外服务器IDC 他们走的线路是不同的 例如:香港走南方电信,俄罗斯走北京联通;(以上来源于网络科普)移动的用户如果访问这些境外网站,移动公司就得给电信 联通钱,所以移动现在直接给你一刀切 就不让你访问,也就是墙掉域名无法访问
2:移动墙的原理
用移动的网访问电信联通带宽上的网站,就会产生一个跨域流量 相当于你来我停车场停车 你要给我停车费,移动就得给电信联通付停车费 建国互联网早期的网站都是选择电信和联通的 之前联通叫网通 所以移动吃亏了啊 就要给他俩每年很多费用 所以现在移动会自行劫持你的DNS 让你尽可能用移动的服务器 有一些热门网站 移动也会干脆给你镜像 给你劫持过来 放在自己的服务器上 对于境外IP的服务器 就直接给你限速(QoS策略 这里不做解释 网上很多人解释的比我好 我一知半解)对于有的违法网站就直接给你一刀切 不让你访问
3:解决方法
该方法有待考证稳定性!脚本来源互联网 我并非原创!
复制下方代码保存文件(从cat复制到EOF,复制后粘贴到终端回车,会自动将代码保存成geneva.py)cat <<'EOF' >geneva.py
#!/usr/bin/env python3
import os
import signal
from scapy.all import *
from netfilterqueue import NetfilterQueue
import argparse
window_size = 17
def modify_window(pkt):
try:
ip = IP(pkt.get_payload())
if ip.haslayer(TCP) and ip[TCP].flags == "SA":
ip[TCP].window = window_size
del ip[IP].chksum
del ip[TCP].chksum
pkt.set_payload(bytes(ip))
elif ip.haslayer(TCP) and ip[TCP].flags == "FA":
ip[TCP].window = window_size
del ip[IP].chksum
del ip[TCP].chksum
pkt.set_payload(bytes(ip))
elif ip.haslayer(TCP) and ip[TCP].flags == "PA":
ip[TCP].window = window_size
del ip[IP].chksum
del ip[TCP].chksum
pkt.set_payload(bytes(ip))
elif ip.haslayer(TCP) and ip[TCP].flags == "A":
ip[TCP].window = window_size
del ip[IP].chksum
del ip[TCP].chksum
pkt.set_payload(bytes(ip))
except:
pass
pkt.accept()
def parsearg():
global window_size
parser = argparse.ArgumentParser(description='Description of your program')
parser.add_argument('-q', '--queue', type=int, help='iptables Queue Num')
parser.add_argument('-w', '--window_size', type=int, help='Tcp Window Size')
args = parser.parse_args()
if args.queue is None or args.window_size is None:
exit(1)
window_size = args.window_size
return args.queue
def main():
queue_num = parsearg()
nfqueue = NetfilterQueue()
nfqueue.bind(queue_num, modify_window)
try:
print("Starting netfilter_queue process...")
nfqueue.run()
except KeyboardInterrupt:
pass
if __name__ == "__main__":
#sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
signal.signal(signal.SIGINT, lambda signal, frame: sys.exit(0))
main()
EOF
CentOS 安装依赖(centos7测试已通过)
yum install -y python3 python3-devel gcc gcc-c++ git libnetfilter* libffi-devel
pip3 install --upgrade pip
pip3 install scapy netfilterqueue
Ubuntu安装依赖(Ubuntu 22测试已通过)
sudo apt-get install build-essential python3-dev libnetfilter-queue-dev libffi-dev libssl-dev iptables python3-pip -y
pip3 install scapy netfilterqueue
执行程序: 一条条执行
nohup python3 geneva.py -q 100 -w 17 &
nohup python3 geneva.py -q 101 -w 4 &
iptables -I OUTPUT -p tcp --sport 80 --tcp-flags SYN,RST,ACK,FIN,PSH SYN,ACK -j NFQUEUE --queue-num 100
iptables -I OUTPUT -p tcp --sport 443 --tcp-flags SYN,RST,ACK,FIN,PSH SYN,ACK -j NFQUEUE --queue-num 101
如何查看是否运行成功?
输入命令ps -ef|grep geneva出现下方内容为启动成功
现在我们检测一下移动线路(cloudflare.com失败是因为还没解析过来)
前一秒我我还在被封
后一秒解决
注意 一定要开启强制https 宝塔的或者你cdn自带的即可 |