先说结论,如果是免费版本 CF
,那么,TCP + socket
是不能代理通信的。
因为免费版本只是接管了 http
层,把 TCP
层给禁掉了。但是,注意上面的话,是代理不能通信。
这里说一下如何在 CF
接管域名的情况下,进行 TCP + socket
通信
先弄一下脚本吧,就是 server
跑一个 tcp + socket
的服务,然后本地进行连接,如果,有输出,就说明调用成功。
测试是使用 15000
端口,在使用前,需要打开安全组和防火墙。
server.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| import socket
HOST = '0.0.0.0' # 使用回环地址,也可以是服务器的公共 IP 地址 PORT = 15000 # 端口号,可以自定义一个未被占用的端口号
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((HOST, PORT))
server_socket.listen(1) print(f"Server is listening on {HOST}:{PORT}...")
client_socket, client_address = server_socket.accept() print(f"Connected by {client_address}")
while True: data = client_socket.recv(1024) # 接收数据,最多 1024 字节 if not data: break print(f"Received from client: {data.decode()}") client_socket.sendall(data) # 将接收到的数据返回给客户端
client_socket.close() server_socket.close()
|
client.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import socket
PORT = 15000 # 与服务端相同的端口号
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((HOST, PORT)) print(f"Connected to server at {HOST}:{PORT}")
message = "Hello, server!" client_socket.sendall(message.encode())
data = client_socket.recv(1024) # 接收数据,最多 1024 字节 print(f"Received from server: {data.decode()}")
client_socket.close()
|
DNS 直连
如果,子域名不走代理,而是走 DNS
直连,那么,tcp + socket
是可以连通的。
但是,别人可以进行抓包,抓到这个 IP
,会导致 CF
防护形同虚设。
其他域名
就是将 CF
接管的域名放弃,不用来连接 tcp
层通信,重新买一个域名。
这个域名可以直连,也可以用反向代理。
Spectrum
这个只有 CF
付费版本才会带有这个功能。
但是,很不幸,CF
有三种付费模式。
其中只有 Enterprise
才具备任意 TCP/UDP
端口连接。而 Pro
只支持 ssh
的 22
和 我的世界的 22535
,Business
只比 Pro
多了一个 RDP
「远程桌面连接」。