└── README.md /README.md: -------------------------------------------------------------------------------- 1 | # VPN traffic redirect to another VPN tunnel 2 | VPN的隧道转接技术,实现一个隧道里面的流量直接重定向到另一个隧道。 3 | 实验环境:CentOS 6.5 x86_64 4 |

5 | **拓扑如下** 6 | 7 | ![](https://i.imgur.com/KscYo1A.png) 8 | 9 | 其他发行版的Linux可以把命令翻译下,原理是一模一样的。 10 | 11 | **需要工具:** 12 | * OpenVPN (UDP封装速度快,效率高。) 13 | * ShadowVPN 14 | * IP rule 15 | * iptables 16 | 17 | ##环境配置步骤: 18 | 19 | ###------先做好基本环境配置------ 20 | 21 | **0、更新生产环境(因为我是在纯净的系统上做的)** 22 | ``` 23 | sudo yum -y groupinstall "Development Tools" 24 | yum -y install openssl* 25 | ``` 26 | **1、打开ipv4转发功能。** 27 | ``` 28 | vim /etc/sysctl.conf 29 | net.ipv4.ip_forward = 0 修改成 net.ipv4.ip_forward = 1 30 | sysctl -p 31 | ``` 32 | **2、添加epel源,直接从源安装openvpn,让用户通过openvpn接入国内中转服务器。** 33 | ``` 34 | wget http://mirrors.ustc.edu.cn/epel/6/x86_64/epel-release-6-8.noarch.rpm 35 | rpm -ivh epel-release-6-8.noarch.rpm 36 | yum makecache 37 | yum -y install openvpn 38 | ``` 39 | **签发证书的教程:** 40 | 41 | http://blog.chinaunix.net/uid-29746173-id-4351133.html 42 | 43 | **做完后记得打开openvpn使用的端口。 ** 44 | 45 | **3、安装ShadowVPN,使用ShadowVPN将国内中转服务器和国外服务器对接起来** 46 | 47 | 项目地址: https://github.com/clowwindy/ShadowVPN/ 48 | ``` 49 | wget https://github.com/clowwindy/ShadowVPN/releases/download/0.1.6/shadowvpn-0.1.6.tar.gz 50 | tar zxvf shadowvpn-0.1.6.tar.gz 51 | ./configure --enable-static --sysconfdir=/etc 52 | make && sudo make install 53 | ``` 54 | 记得打开ShadowVPN用的端口,不然隧道起不来。 55 | 56 | 记得清除掉ShadowVPN client_up.sh中的一段命令: 57 | ``` 58 | echo changing default route 59 | if [ pppoe-wan = "$old_gw_intf" ]; then 60 | route add $server $old_gw_intf 61 | else 62 | route add $server gw $old_gw_ip 63 | fi 64 | route del default 65 | route add default gw 10.7.0.1 66 | echo default route changed to 10.7.0.1 67 | ``` 68 | 不然ShadowVPN up后,你所有的流量都从ShadowVPN隧道走了。 69 | 70 | **测试隧道通信是否成功:** 71 | ``` 72 | sudo route add -host 8.8.8.8 dev tunX (tunX是你ShadowVPN的interface) 73 | nslookup twitter.com 8.8.8.8 74 | ``` 75 | 如果返回的地址是无污染的IP,说明隧道已经UP了。 76 | 77 | OpenVPN这块,如果签发证书后接入成功,且能ping通网关地址,就没问题。 78 | 79 | ###------再开始做流量的对接------ 80 | 81 | 我这里的ShadowVPN interface IP使用的是10.20.0.1(境外服务器),10.20.0.2(境内服务器) 82 | OpenVPN使用的IP段是10.200.0.0/24,请各位写iptables规则的时候替换成你们正在使用的IP段。 83 | 84 | **1、首先先定义自定义的路由表,不然写路由条目的时候会写到主路由表,那就会导致选路错乱了。** 85 | 86 | ``` 87 | echo "200 netgamesg" >> /etc/iproute2/rt_tables 88 | ``` 89 | 90 | 然后保存,退出。 91 | 编号是可以自己自定义的,名字也是可以自定义的,我这里为了好记所以写了这个。 92 | (编号不可以和系统路由表编号重复) 93 | 94 | **2、添加静态默认路由** 95 | ``` 96 | ip route add default dev tunX (你的ShadowVPN interface) table netgamesg 97 | ``` 98 | 这里是在netgamesg这张路由表里面添加一个默认路由,默认网关出口是shadowvpn的接口。 99 | 100 | **3、使用ip rule来根据源地址来使用路由表。** 101 | ``` 102 | ip rule add from 10.200.0.0/24 table netgamesg 103 | ``` 104 | 这里是规定源地址为10.200.0.0/24的IP数据包使用netgamesg这张路由表。 105 | 106 | **4、最后一步,设置iptables转发。** 107 | ``` 108 | iptables -t nat -A POSTROUTING -s [你的openvpn源地址段] -j SNAT --to-source [你的ShadowVPN interface IP] 109 | ``` 110 | **5、刷新路由表。** 111 | ``` 112 | ip route flush cache 113 | ``` 114 | **6、添加脚本,让它开机启动自动执行即可。** 115 | ``` 116 | vim route.sh 117 | 118 | shadowvpn -c /etc/shadowvpn/client.conf -s start 119 | ip route add default dev tun10 table netgamesg 120 | ip rule add fwmark 3 table netgamesg 121 | ip rule add from 10.200.0.0/24 table netgamesg 122 | ``` 123 | 这样就大功告成了。拨入中国的服务器,你访问ip.cn会显示的是外国的IP,原理就是中国服务器无条件将你的数据转发到国外服务器了。 124 | 125 | 这个模型里面不需要考虑MTU的问题,至少我这边做了3次是没出现因为MTU问题导致的数据不通。如果数据不通的话看看哪一步没做对。 126 | 127 | 如果有什么地方写的不对,敬请批评指正。 128 | --------------------------------------------------------------------------------