udp2raw/doc
2017-08-14 03:44:56 -07:00
..
finalspeed_step_by_step Update README.zh-cn.md ,tcptun_step_by_step.md,finalspeed_step_by_step.md 2017-08-06 23:18:16 +08:00
kcptun_step_by_step Update README.zh-cn.md ,tcptun_step_by_step.md,finalspeed_step_by_step.md 2017-08-06 23:18:16 +08:00
build_guide.md english build_guide 2017-08-11 16:30:22 +08:00
build_guide.zh-cn.md Update build_guide.zh-cn.md 2017-08-10 07:15:10 -07:00
finalspeed_step_by_step.md Update finalspeed_step_by_step.md 2017-08-09 06:03:25 -07:00
kcptun_step_by_step.md Update kcptun_step_by_step.md 2017-08-10 08:46:05 -07:00
openvpn_guide.md Update openvpn_guide.md 2017-08-10 05:39:06 -07:00
README.zh-cn.md Update README.zh-cn.md 2017-08-14 03:44:56 -07:00

Udp2raw-tunnel image2 UDP tunnel通过raw socket给UDP包加上TCP或ICMP header进而绕过UDP屏蔽或QoS或在UDP支持不好的环境下提升UDP稳定性。支持心跳保活、自动重连重连后会恢复上次连接在底层掉线的情况下可以保持上层不掉线。同时有加密、防重放攻击、信道复用的功能。

欢迎任何形式的转载。

English

udp2raw+kcptun step_by_step教程

udp2raw+finalspeed step_by_step教程

如果你需要加速跨国网游、网页浏览解决方案在另一个repo

https://github.com/wangyu-/UDPspeeder

功能特性

把udp流量伪装成tcp /icmp

用raw socket给udp包加上tcp/icmp包头可以突破udp流量限制或Udp QOS。或者在udp nat有问题的环境下提升稳定性。  另外也支持用raw 发udp包这样流量不会被伪装只会被加密。

模拟TCP3次握手

模拟TCP3次握手模拟seq ack过程。另外还模拟了一些tcp optionMSS,sackOk,TS,TS_ack,wscale用来使流量看起来更像是由普通的linux tcp协议栈发送的。

心跳保活、自动重连,连接快速恢复,单向链路失效检测

心跳保活、自动重连udp2raw重连可以恢复上次的连接重连后上层连接继续有效底层掉线上层不掉线。有效解决上层连接断开的问题。 (功能借鉴自kcptun-raw就算你拔掉网线重插或者重新拨号获得新ip上层应用也不会断线

Client能用单倍的超时时间检测到单向链路的失效不管是上行还是下行只要有一个方向失效就能被client检测到。重连只需要client发起就可以立即被server处理不需要等到server端的连接超时后。

对于有大量client的情况对于不同client,server发送的心跳是错开时间发送的不会因为短时间发送大量的心跳而造成拥塞和延迟抖动。

加密 防重放攻击 防中间人攻击

用aes128cbc加密md5/crc32做数据完整校验。用类似ipsec/openvpn的 replay window机制来防止重放攻击。

设计目标是即使攻击者可以监听到tunnel的所有包可以选择性丢弃tunnel的任意包可以重放任意包攻击者也没办法获得tunnel承载的任何数据也没办法向tunnel的数据流中通过包构造/包重放插入任何数据。client和server互相认证对方无法被中间人攻击。

其他特性

信道复用client的udp端支持多个连接。

server支持多个client也能正确处理多个连接的重连和连接恢复。

NAT 穿透 tcp icmp udp模式都支持nat穿透。

支持Openvz配合finalspeed使用可以在openvz上用tcp模式的finalspeed

支持Openwrt没有编译依赖容易编译到任何平台上。release中提供了ar71xx版本的binary

epoll纯异步高并发除了回收过期连接外所有操作的时间复杂度都跟连接数无关。回收过期连接的操做也是柔和进行的不会因为消耗太多cpu时间造成延迟抖动。

关键词

突破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

简明操作说明

环境要求

Linux主机有root权限。主机上最好安装了iptables命令(apt/yum很容易安装)。在windows和mac上可以开虚拟机udp2raw跑在linux里其他应用照常跑在windows上桥接模式测试可用

安装

下载编译好的二进制文件,解压到任意目录。

https://github.com/wangyu-/udp2raw-tunnel/releases

运行

假设你有一个serverip为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 规则

用raw收发tcp包本质上绕过了linux内核的tcp协议栈。linux碰到raw socket发来的包会不认识如果一直收到不认识的包会回复大量RST造成不稳定或性能问题。所以强烈建议添加iptables规则屏蔽Linux内核的对指定端口的处理。用-a选项udp2raw会在启动的时候自动帮你加上Iptables规则退出的时候再自动删掉。如果长期使用可以用-g选项来生成相应的Iptables规则再自己手动添加这样规则不会在udp2raw退出时被删掉可以避免停掉udp2raw后内核向对端回复RST。

用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主机

vultr 2.5美元每月套餐(single core 2.4ghz cpu,512m ram,日本东京机房),

server主机

bandwagonhost 3.99美元每年套餐(single core 2.0ghz cpu,128m ram,美国洛杉矶机房)

测试1

raw_mode: faketcp cipher_mode: xor  auth_mode: simple

image4

(反向的速度几乎一样,所以只发正向测试的图)

测试中cpu被打满。其中有30%的cpu是被openvpn占的。 如果不用Openvpn中转实际达到100+Mb/S 应该没问题。

测试2

raw_mode: faketcp cipher_mode: aes128cbc  auth_mode: md5

image5

(反向的速度几乎一样,所以只发正向测试的图)

测试中cpu被打满。绝大多数cpu都是被udp2raw占用的主要消耗在aes加密。即使不用Openvpn速度也不会快很多了。

应用

中转 kcptun

udp2raw+kcptun step_by_step教程

中转 finalspeed

udp2raw+finalspeed step_by_step教程

如何自己编译

编译教程

相关repo

kcptun-raw

udp2raw was inspired by kcptun-raw,which modified kcptun to support tcp mode.

https://github.com/Chion82/kcptun-raw

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

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