国内服务器免备案的使用-对SNI(https)绕过方法
2024/12/9...大约 3 分钟
什么是SNI
简单来说就是域名的443被墙,SSL无法访问到网站内容。复杂的来讲,TLS是网络通讯的安全基础(HTTPS)。TLS提供的认证加密使得用户可以确定他们在与谁通讯, 并确保通讯信息不被中间人看到或篡改。 虽然TLS可以隐藏用户通讯的内容,但其并不能总是隐藏与用户通讯的对象。 比如TLS握手可以携带一个叫做加密服务器名称指示(SNI)的扩展, 这个扩展帮助客户端告诉服务器其想要访问的网站的域名。 包括中国在内的审查者利用这一扩展来检查并阻止用户访问特定的网站。

解决方法
目前来说,并没有好的方法绕过它。最优的方法是域名进行备案,使用国内服务器。可以参考过移动墙的方法,在国内进行免备案,然后301跳转,切记不要将内容放在国内。
443端口抢答
import socket
import threading
import time
def pipe(sock_in, sock_out):
try:
while True:
b = sock_in.recv(65536)
if not b:
break
sock_out.sendall(b)
except socket.error:
pass
finally:
time.sleep(1)
sock_in.close()
sock_out.close()
def connecting(cli_sock, _):
cli_sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 65535)
httpd_sock = socket.socket()
try:
httpd_sock.connect(('127.0.0.1', 444))
except socket.error:
cli_sock.close()
return
httpd_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
threading.Thread(target=pipe, args=(cli_sock, httpd_sock)).start()
pipe(httpd_sock, cli_sock)
def main():
serv_sock = socket.socket()
serv_sock.bind(('0.0.0.0', 443))
serv_sock.listen(50)
serv_sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1)
serv_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
while True:
threading.Thread(target=connecting, args=serv_sock.accept()).start()
if __name__ == '__main__':
main()将上面的代码保存为mianbeian.py,它将443端口转到了444端口。
接下来宝塔需要修改nginx的默认443端口,如果您要修改Nginx的默认端口还需要在/www/server/panel/vhost/nginx下修改phpfpm_status.conf和0.default.conf,以及您的网站配置所监听的端口。
修改后记得重启Nginx服务。然后444端口进行反代。
80端口抢答
import socket
import struct
import threading
import time
def main():
serv_sock = socket.socket()
serv_sock.bind(('0.0.0.0', 80))
serv_sock.listen(50)
# 设置TCP window size为1
serv_sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1)
# 不等待,立即关闭连接
serv_sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 0))
# 关闭Nagle算法,立即发送数据
serv_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
while True:
cli_sock, _ = serv_sock.accept()
try:
cli_sock.sendall(b'''HTTP/1.1 302 Moved Temporarily\r\n'''
b'''Content-Type: text/html\r\n'''
b'''Content-Length: 0\r\n'''
b'''Connection: close\r\n'''
b'''Location: http://www.baidu.com/\r\n\r\n''')
except Exception: # 防止客户端提前关闭连接抛异常
pass
def wait_second():
time.sleep(1) # 等待1秒钟,确保数据发送完毕
cli_sock.close()
threading.Thread(target=wait_second).start()
if __name__ == '__main__':
main()这个程序保存为tcp.py,直接运行后域名的80端口就会跳转到百度。
参考文献
更新日志
2026/1/9 12:40
查看所有更新日志
f8f53-于
