diff --git a/README.md b/README.md index d65eea9..3776ad5 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Udp2raw-tunnel ![image0](images/image0.PNG) -An Encrpyted,Anti-Replay,Multiplexed Udp Tunnel,tunnels udp traffic through raw socket +An Encrpyted,Anti-Replay,Multiplexed Udp Tunnel,tunnels udp traffic through fake-tcp or icmp by using raw socket [简体中文](/doc/README.zh-cn.md) ### Send/Recv Udp Packet as Raw Packet with TCP header,ICMP header @@ -26,7 +26,7 @@ Openwrt Supported,no dependence package,easy to compile,ar71xx binary included i bypass udp qos,bypass udp blocking,openvpn tcp over tcp problem,openvpn over icmp,udp to icmp tunnel,udp to tcp tunnel,udp via icmp,udp via tcp # Getting Started ### Prerequisites -linux host,root access. if you want to use it on window,you can use VMware in bridged mode. +linux host,root access. if you want to use it on window,you can use VMware(both bridged mode and nat mode are supported). ### Installing download binary release from https://github.com/wangyu-/udp2raw-tunnel/releases ### Running diff --git a/doc/README.zh-cn.md b/doc/README.zh-cn.md index d1ef499..310a8f8 100644 --- a/doc/README.zh-cn.md +++ b/doc/README.zh-cn.md @@ -22,15 +22,13 @@ https://github.com/wangyu-/UDPspeeder ### 模拟TCP3次握手 模拟TCP3次握手,模拟seq ack过程。另外还模拟了一些tcp option:MSS,sackOk,TS,TS_ack,wscale,用来使流量看起来更像是由普通的linux tcp协议栈发送的。 -### 连接保持,连接快速恢复,单向链路失效检测 -心跳机制检查连接是否中断,一旦心跳超时。client会立即换raw socket的端口重连,重连成功后会恢复之前中断的连接。虽然raw端的端口变了,但是udp端的所有连接都会继续有效。udp这边感觉不到raw端的重连,只会感觉到短暂断流,这跟普通的短暂丢包是类似的,不会导致上层应用重连。 +### 心跳保活、自动重连,连接快速恢复,单向链路失效检测 +心跳保活、自动重连,udp2raw重连可以恢复上次的连接,重连后上层连接继续有效,底层掉线上层不掉线。有效解决上层连接断开的问题。 (功能借鉴自[kcptun-raw](https://github.com/Chion82/kcptun-raw)) -Client能用单倍的超时时间检测到单向链路的失效,不管是上行还是下行,只要有一端失效就能被client检测到。重连只需要client发起,就可以立即被server处理,不需要等到server端的连接超时后。 +Client能用单倍的超时时间检测到单向链路的失效,不管是上行还是下行,只要有一个方向失效就能被client检测到。重连只需要client发起,就可以立即被server处理,不需要等到server端的连接超时后。 对于有大量client的情况,对于不同client,server发送的心跳是错开时间发送的,不会因为短时间发送大量的心跳而造成拥塞和延迟抖动。 - - ### 其他特性 信道复用,client的udp端支持多个连接。 @@ -40,9 +38,9 @@ NAT 穿透 ,tcp icmp udp模式都支持nat穿透。 支持Openvz,配合finalspeed使用,可以在openvz上用tcp模式的finalspeed -支持Openwrt,没有编译依赖,容易编译到任何平台上。release中提供了ar71xx版本的binary +支持Openwrt,没有编译依赖,容易编译到任何平台上。release中提供了ar71xx版本的binary -epoll纯异步,高并发,除了回收过期连接外,所有操作的时间复杂度都跟连接数无关。回收过期连接的操做也是一点一点进行的,不会因为消耗太多cpu时间造成延迟抖动。 +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 @@ -50,7 +48,7 @@ epoll纯异步,高并发,除了回收过期连接外,所有操作的时间 # 简明操作说明 ### 环境要求 -Linux主机,有root权限。主机上最好安装了iptables命令(apt/yum很容易安装)。在windows和mac上可以开虚拟机(桥接模式测试可用)。 +Linux主机,有root权限。主机上最好安装了iptables命令(apt/yum很容易安装)。在windows和mac上可以开虚拟机(桥接模式和NAT模式经测试都可用)。 ### 安装 下载编译好的二进制文件,解压到任意目录。 @@ -110,7 +108,7 @@ other options: -h,--help print this help message ``` ### iptables 规则 -用raw收发tcp包本质上绕过了linux内核的tcp协议栈。linux碰到raw socket发来的包会不认识,如果一直收到不认识的包,会回复大量RST,造成不稳定或性能问题。所以强烈建议添加iptables规则屏蔽Linux内核的对指定端口的处理。用-a选项,udp2raw会在启动的时候自动帮你加上Iptables规则,退出的时候再自动删掉。如果你不信任-a选项的可靠性,可以用-g选项来生成相应的Ip规则再自己手动添加。 +用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 @@ -154,6 +152,8 @@ raw_mode: faketcp cipher_mode: aes128cbc  auth_mode: md5 [udp2raw+kcptun step_by_step教程](kcptun_step_by_step.md) ### 中转 finalspeed [udp2raw+finalspeed step_by_step教程](finalspeed_step_by_step.md) +# 如何自己编译 +[编译教程](build_guide.zh-cn.md) # 相关repo ### kcptun-raw this project was inspired by kcptun-raw,which modified kcptun to support tcp mode. diff --git a/doc/build_guide.zh-cn.md b/doc/build_guide.zh-cn.md new file mode 100644 index 0000000..699c819 --- /dev/null +++ b/doc/build_guide.zh-cn.md @@ -0,0 +1,72 @@ +# udp2raw编译方法 +本文演示怎么把udp2raw编译到自己所需的平台。 + +## 可以本地编译的linux平台 +比如电脑、树莓派 + +##### 首先安装git +debian/ubuntun执行: +``` +sudo apt-get install git +``` +redhat/centos执行: +``` +sudo yum install git +``` +##### 用git把源码clone至本地 + +在任意目录执行: + +``` +git clone https://github.com/wangyu-/udp2raw-tunnel.git +cd udp2raw-tunnel +``` + +##### 安装g++ make 等工具 +debian/ubuntun执行: +``` +sudo apt-get install build-essential +``` + +redhat/centos执行: +``` +sudo yum groupinstall 'Development Tools' +``` + +然后运行make,编译完成。 生成的udp2raw就是编译好的bianry。 + +## 需要交叉编译的平台 +比如各种openwrt路由器 + +##### 首先安装git +debian/ubuntun执行: +``` +sudo apt-get install git +``` +redhat/centos执行: +``` +sudo yum install git +``` + +##### 下载安装交叉编译工具包 +去downloads.openwrt.org上找到自己的openwrt版本和cpu型号对应的SDK。通常openwrt版本号不一样也问题不大,最主要是cpu型号。 + +比如我的tplink wdr4310运行的是chaos_calmer 15.05,ar71xx cpu,应该下载这个包: + +``` +http://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/generic/OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2 +``` +解压到本地任意目录,比如:/home/wangyu/OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2 + +让后依次进入,staging_dir ,toolchain-xxxxx ,bin 目录,找到后缀是g++的软链,比如我的是mips-openwrt-linux-g++ ,记下这个文件的完整路径: + +``` +/home/wangyu/Desktop/OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-g++ +``` +##### 编译 +把makefile的第一行 cross_cc=后面的内容改成你刚才记下的完整路径: +``` +cc_cross=/home/wangyu/Desktop/OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-g++ +``` + +执行make cross,目录下生成udp2raw文件。编译完成。 diff --git a/doc/openvpn_guide.md b/doc/openvpn_guide.md index cd68c51..23ca627 100644 --- a/doc/openvpn_guide.md +++ b/doc/openvpn_guide.md @@ -18,6 +18,9 @@ assume server ip is 45.66.77.88 #### client side config ``` +client +dev tun100 +proto udp remote 127.0.0.1 3333 resolv-retry infinite