2017-08-06 00:43:44 -07:00
|
|
|
|
Udp2raw-tunnel
|
|
|
|
|
![image2](/images/image2.PNG)
|
2017-08-14 00:56:20 -07:00
|
|
|
|
加密、防重放攻击的、信道复用的udp tunnel,利用raw socket中转udp流量,可以给udp流量加上tcp或icmp包头,以骗过udp防火墙。同时有心跳保活,且在断线重连后保持上层连接不掉线的功能。
|
2017-08-06 00:43:44 -07:00
|
|
|
|
|
2017-08-06 00:46:25 -07:00
|
|
|
|
[English](/README.md)
|
|
|
|
|
|
|
|
|
|
[udp2raw+kcptun step_by_step教程](kcptun_step_by_step.md)
|
|
|
|
|
|
|
|
|
|
[udp2raw+finalspeed step_by_step教程](finalspeed_step_by_step.md)
|
2017-08-09 05:15:03 -07:00
|
|
|
|
|
|
|
|
|
如果你需要加速跨国网游、网页浏览,解决方案在另一个repo:
|
|
|
|
|
|
|
|
|
|
https://github.com/wangyu-/UDPspeeder
|
2017-08-11 02:26:25 -07:00
|
|
|
|
# 功能特性
|
2017-08-06 00:43:44 -07:00
|
|
|
|
### 把udp流量伪装成tcp /icmp
|
2017-08-06 00:46:25 -07:00
|
|
|
|
用raw socket给udp包加上tcp/icmp包头,可以突破udp流量限制或Udp QOS。或者在udp nat有问题的环境下,提升稳定性。 另外也支持用raw 发udp包,这样流量不会被伪装,只会被加密。
|
2017-08-06 00:43:44 -07:00
|
|
|
|
|
|
|
|
|
### 模拟TCP3次握手
|
|
|
|
|
模拟TCP3次握手,模拟seq ack过程。另外还模拟了一些tcp option:MSS,sackOk,TS,TS_ack,wscale,用来使流量看起来更像是由普通的linux tcp协议栈发送的。
|
|
|
|
|
|
2017-08-09 23:37:30 -07:00
|
|
|
|
### 心跳保活、自动重连,连接快速恢复,单向链路失效检测
|
2017-08-10 23:06:34 -07:00
|
|
|
|
心跳保活、自动重连,udp2raw重连可以恢复上次的连接,重连后上层连接继续有效,底层掉线上层不掉线。有效解决上层连接断开的问题。 (功能借鉴自[kcptun-raw](https://github.com/Chion82/kcptun-raw))(**就算你拔掉网线重插,或者重新拨号获得新ip,上层应用也不会断线**)
|
2017-08-06 00:43:44 -07:00
|
|
|
|
|
2017-08-09 23:37:30 -07:00
|
|
|
|
Client能用单倍的超时时间检测到单向链路的失效,不管是上行还是下行,只要有一个方向失效就能被client检测到。重连只需要client发起,就可以立即被server处理,不需要等到server端的连接超时后。
|
2017-08-07 13:58:42 +08:00
|
|
|
|
|
2017-08-08 19:09:51 -07:00
|
|
|
|
对于有大量client的情况,对于不同client,server发送的心跳是错开时间发送的,不会因为短时间发送大量的心跳而造成拥塞和延迟抖动。
|
2017-08-06 00:43:44 -07:00
|
|
|
|
|
2017-08-11 02:41:07 -07:00
|
|
|
|
### 加密 防重放攻击 防中间人攻击
|
2017-08-13 05:57:20 -07:00
|
|
|
|
用aes128cbc加密,md5/crc32做数据完整校验。用类似ipsec/openvpn的 replay window机制来防止重放攻击。
|
2017-08-11 02:41:07 -07:00
|
|
|
|
|
2017-08-11 02:46:33 -07:00
|
|
|
|
设计目标是,即使攻击者可以监听到tunnel的所有包,可以选择性丢弃tunnel的任意包,可以重放任意包;攻击者也没办法获得tunnel承载的任何数据,也没办法向tunnel的数据流中通过包构造/包重放插入任何数据。client和server互相认证对方,无法被中间人攻击。
|
2017-08-11 02:41:07 -07:00
|
|
|
|
|
2017-08-06 00:43:44 -07:00
|
|
|
|
### 其他特性
|
|
|
|
|
信道复用,client的udp端支持多个连接。
|
|
|
|
|
|
2017-08-06 00:46:25 -07:00
|
|
|
|
server支持多个client,也能正确处理多个连接的重连和连接恢复。
|
2017-08-06 00:43:44 -07:00
|
|
|
|
|
|
|
|
|
NAT 穿透 ,tcp icmp udp模式都支持nat穿透。
|
|
|
|
|
|
|
|
|
|
支持Openvz,配合finalspeed使用,可以在openvz上用tcp模式的finalspeed
|
|
|
|
|
|
2017-08-09 23:46:03 -07:00
|
|
|
|
支持Openwrt,没有编译依赖,容易编译到任何平台上。release中提供了ar71xx版本的binary
|
2017-08-07 13:58:42 +08:00
|
|
|
|
|
2017-08-09 23:37:30 -07:00
|
|
|
|
epoll纯异步,高并发,除了回收过期连接外,所有操作的时间复杂度都跟连接数无关。回收过期连接的操做也是柔和进行的,不会因为消耗太多cpu时间造成延迟抖动。
|
2017-08-07 13:58:42 +08:00
|
|
|
|
|
2017-08-06 00:43:44 -07:00
|
|
|
|
### 关键词
|
|
|
|
|
突破udp qos,突破udp屏蔽,openvpn tcp over tcp problem,openvpn over icmp,udp to icmp tunnel,udp to tcp tunnel,udp via icmp,udp via tcp
|
|
|
|
|
|
|
|
|
|
# 简明操作说明
|
|
|
|
|
|
|
|
|
|
### 环境要求
|
2017-08-12 03:56:39 -07:00
|
|
|
|
Linux主机,有root权限。主机上最好安装了iptables命令(apt/yum很容易安装)。在windows和mac上可以开虚拟机(桥接模式和<del>NAT模式</del>经测试都可用)。
|
2017-08-06 00:43:44 -07:00
|
|
|
|
|
|
|
|
|
### 安装
|
|
|
|
|
下载编译好的二进制文件,解压到任意目录。
|
|
|
|
|
|
|
|
|
|
https://github.com/wangyu-/udp2raw-tunnel/releases
|
|
|
|
|
|
|
|
|
|
### 运行
|
|
|
|
|
假设你有一个server,ip为44.55.66.77,有一个服务监听在udp 7777端口。 假设你本地的主机到44.55.66.77的UDP流量被屏蔽了,或者被qos了
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
在client端运行:
|
|
|
|
|
./udp2raw_amd64 -c -l0.0.0.0:3333 -r44.55.66.77:4096 -a -k "passwd" --raw-mode faketcp
|
|
|
|
|
|
|
|
|
|
在server端运行:
|
|
|
|
|
./udp2raw_amd64 -s -l0.0.0.0:4096 -r 127.0.0.1:7777 -a -k "passwd" --raw-mode faketcp
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
现在client和server之间建立起了,tunnel。想要在本地连接44.55.66.77:7777,只需要连接 127.0.0.1:3333。来回的所有的udp流量会被经过tunneling发送。在外界看起来是tcp流量,不会有udp流量暴露到公网。
|
|
|
|
|
|
|
|
|
|
# 进阶操作说明
|
|
|
|
|
|
|
|
|
|
### 命令选项
|
|
|
|
|
```
|
|
|
|
|
udp2raw-tunnel
|
|
|
|
|
version: Aug 5 2017 21:03:54
|
|
|
|
|
repository: https://github.com/wangyu-/udp2raw-tunnel
|
|
|
|
|
|
|
|
|
|
usage:
|
|
|
|
|
run as client : ./this_program -c -l local_listen_ip:local_port -r server_ip:server_port [options]
|
|
|
|
|
run as server : ./this_program -s -l server_listen_ip:server_port -r remote_ip:remote_port [options]
|
|
|
|
|
|
|
|
|
|
common options,these options must be same on both side:
|
|
|
|
|
--raw-mode <string> avaliable values:faketcp(default),udp,icmp
|
|
|
|
|
-k,--key <string> password to gen symetric key,default:"secret key"
|
|
|
|
|
--auth-mode <string> avaliable values:aes128cbc(default),xor,none
|
|
|
|
|
--cipher-mode <string> avaliable values:md5(default),crc32,simple,none
|
|
|
|
|
-a,--auto-rule auto add (and delete) iptables rule
|
|
|
|
|
-g,--gen-rule generate iptables rule then exit
|
|
|
|
|
--disable-anti-replay disable anti-replay,not suggested
|
|
|
|
|
client options:
|
|
|
|
|
--source-ip <ip> force source-ip for raw socket
|
|
|
|
|
--source-port <port> force source-port for raw socket,tcp/udp only
|
|
|
|
|
this option disables port changing while re-connecting
|
|
|
|
|
other options:
|
|
|
|
|
--log-level <number> 0:never 1:fatal 2:error 3:warn
|
|
|
|
|
4:info (default) 5:debug 6:trace
|
|
|
|
|
--log-position enable file name,function name,line number in log
|
|
|
|
|
--disable-color disable log color
|
|
|
|
|
--disable-bpf disable the kernel space filter,most time its not necessary
|
|
|
|
|
unless you suspect there is a bug
|
|
|
|
|
--sock-buf <number> buf size for socket,>=10 and <=10240,unit:kbyte,default:1024
|
|
|
|
|
--seqmode <number> seq increase mode for faketcp:
|
|
|
|
|
0:dont increase
|
|
|
|
|
1:increase every packet
|
|
|
|
|
2:increase randomly, about every 3 packets (default)
|
|
|
|
|
-h,--help print this help message
|
|
|
|
|
```
|
|
|
|
|
### iptables 规则
|
2017-08-10 00:05:47 -07:00
|
|
|
|
用raw收发tcp包本质上绕过了linux内核的tcp协议栈。linux碰到raw socket发来的包会不认识,如果一直收到不认识的包,会回复大量RST,造成不稳定或性能问题。所以强烈建议添加iptables规则屏蔽Linux内核的对指定端口的处理。用-a选项,udp2raw会在启动的时候自动帮你加上Iptables规则,退出的时候再自动删掉。如果长期使用,可以用-g选项来生成相应的Iptables规则再自己手动添加,这样规则不会在udp2raw退出时被删掉,可以避免停掉udp2raw后内核向对端回复RST。
|
2017-08-06 00:43:44 -07:00
|
|
|
|
|
|
|
|
|
用raw收发udp包也类似,只是内核回复的是icmp unreachable。而用raw 收发icmp,内核会自动回复icmp echo。都需要相应的iptables规则。
|
|
|
|
|
### cipher-mode 和 auth-mode
|
|
|
|
|
如果要最大的安全性建议用aes128cbc+md5。如果要运行再路由器上,建议xor+simple。但是注意xor+simple只能骗过防火墙的包检测,不能防止真正的攻击者。
|
|
|
|
|
|
|
|
|
|
### seq-mode
|
|
|
|
|
facktcp模式并没有模拟tcp的全部。所以理论上有办法把faketcp和真正的tcp流量区分开来(虽然大部分ISP不太可能做这种程度的包检测)。seq-mode可以改变一些seq ack的行为。如果遇到了连接问题,可以尝试更改。在我这边的移动线路用3种模式都没问题。
|
|
|
|
|
|
|
|
|
|
# 性能测试
|
|
|
|
|
iperf3 的UDP模式有BUG,所以,这里用iperf3的tcp模式,配合Openvpn,测试udp2raw的性能。(iperf3 udp issue ,https://github.com/esnet/iperf/issues/296 )
|
|
|
|
|
|
|
|
|
|
openvpn关掉了自带的加密。
|
|
|
|
|
#### iperf3 命令:
|
|
|
|
|
```
|
|
|
|
|
iperf3 -c 10.222.2.1 -P40
|
|
|
|
|
iperf3 -c 10.222.2.1 -P40 -R
|
|
|
|
|
```
|
|
|
|
|
#### client主机
|
2017-08-06 00:46:25 -07:00
|
|
|
|
vultr 2.5美元每月套餐(single core 2.4ghz cpu,512m ram,日本东京机房),
|
2017-08-06 00:43:44 -07:00
|
|
|
|
#### server主机
|
2017-08-06 00:46:25 -07:00
|
|
|
|
bandwagonhost 3.99美元每年套餐(single core 2.0ghz cpu,128m ram,美国洛杉矶机房)
|
|
|
|
|
### 测试1
|
2017-08-06 00:43:44 -07:00
|
|
|
|
raw_mode: faketcp cipher_mode: xor auth_mode: simple
|
|
|
|
|
|
|
|
|
|
![image4](/images/image4.PNG)
|
|
|
|
|
|
|
|
|
|
(反向的速度几乎一样,所以只发正向测试的图)
|
|
|
|
|
|
|
|
|
|
测试中cpu被打满。其中有30%的cpu是被openvpn占的。 如果不用Openvpn中转,实际达到100+Mb/S 应该没问题。
|
|
|
|
|
|
2017-08-06 00:46:25 -07:00
|
|
|
|
### 测试2
|
2017-08-06 00:43:44 -07:00
|
|
|
|
raw_mode: faketcp cipher_mode: aes128cbc auth_mode: md5
|
|
|
|
|
|
|
|
|
|
![image5](/images/image5.PNG)
|
|
|
|
|
|
|
|
|
|
(反向的速度几乎一样,所以只发正向测试的图)
|
|
|
|
|
|
2017-08-06 00:46:25 -07:00
|
|
|
|
测试中cpu被打满。绝大多数cpu都是被udp2raw占用的(主要消耗在aes加密)。即使不用Openvpn,速度也不会快很多了。
|
2017-08-06 00:43:44 -07:00
|
|
|
|
# 应用
|
|
|
|
|
### 中转 kcptun
|
2017-08-06 08:28:11 -07:00
|
|
|
|
[udp2raw+kcptun step_by_step教程](kcptun_step_by_step.md)
|
2017-08-06 00:43:44 -07:00
|
|
|
|
### 中转 finalspeed
|
2017-08-06 08:28:11 -07:00
|
|
|
|
[udp2raw+finalspeed step_by_step教程](finalspeed_step_by_step.md)
|
2017-08-10 07:08:21 -07:00
|
|
|
|
# 如何自己编译
|
|
|
|
|
[编译教程](build_guide.zh-cn.md)
|
2017-08-06 00:43:44 -07:00
|
|
|
|
# 相关repo
|
|
|
|
|
### kcptun-raw
|
2017-08-11 21:46:38 -07:00
|
|
|
|
udp2raw was inspired by kcptun-raw,which modified kcptun to support tcp mode.
|
2017-08-06 00:43:44 -07:00
|
|
|
|
|
|
|
|
|
https://github.com/Chion82/kcptun-raw
|
2017-08-11 21:46:38 -07:00
|
|
|
|
### relayRawSocket
|
|
|
|
|
kcptun-raw was inspired by relayRawSocket. A simple udp to raw tunnel,wrote in python
|
|
|
|
|
|
|
|
|
|
https://github.com/linhua55/some_kcptun_tools/tree/master/relayRawSocket
|
2017-08-06 00:43:44 -07:00
|
|
|
|
### kcpraw
|
|
|
|
|
another project of kcptun with tcp mode
|
|
|
|
|
|
|
|
|
|
https://github.com/ccsexyz/kcpraw
|
|
|
|
|
### icmptunnel
|
|
|
|
|
Transparently tunnel your IP traffic through ICMP echo and reply packets.
|
|
|
|
|
|
|
|
|
|
https://github.com/DhavalKapil/icmptunnel
|
|
|
|
|
|