linux-内网回拨方案

  记录本篇内容实际上是希望有人能知道有badvpn_tun2socks 这个东西可以将socks转化为vpn, 或者只有我不知道这个东西了。

  需求:公司有台服务器在国外,需要拨号到公司处理一些数据,现在用的是pptp,拨号也成功了,而且很稳定,但就是延迟130ms上下,上级要求降低延迟,经过多方面查询,在ucloud上找到了一个线路加速的方案,但该线路加速并不支持vpn的加速,其实应该就是限制了gre包的通信,于是找到了另一种方案,用该线路加速ssh,在服务器上通过ssh动态端口转发建立socks,然后将socks转化为vpn来实现加速.

此方案理论上可替换pptp

如果有人处理过以上需求的,希望能交流下你们的解决方案。万分感谢!

参考资料:

https://github.com/ambrop72/badvpn.git

https://github.com/yangchuansheng/love-gfw

1. badvpn_tun2socks 编译

$> git clone https://github.com/ambrop72/badvpn.git $> # 因为只需要vpn的,因此加上这些参数(其实我也先把全部功能加上看下有些什么东西,但是我编译不过去!),详细文档可以参看github的文档 $> cmake .. -DBUILD_NOTHING_BY_DEFAULT=1 -DBUILD_TUN2SOCKS=1 -DBUILD_UDPGW=1 $> make && make install

2. badvpn_tun2socks 使用

# 创建tun接口 $> ip tuntap add dev tun0 mode tun # 为其分配ip $> ip addr add 10.0.0.1/24 dev tun0 # 启动接口 $> ip link set tun0 up # 启动 badvpn_tun2socks socks 转化为 vpn $> badvpn-tun2socks --tundev tun0 --netif-ipaddr 10.0.0.2 --netif-netmask 255.255.255.0 --socks-server-addr "127.0.0.1:1080" # 下面操作就和vpn拨号成功后一样了 # 添加默认路由 serverA 主机同网段的其他主机 $> ip route add 10.172.11.13 via 10.0.0.2

成功运行后就可以直接通过路由连接socks通往段的其他主机。

3. 完成过程

3.1. 通过ssh动态端口转发,在远程主机上生成socks通道端口

$> ssh -4 -N -C -D 1080 <user>@<remote_ip>

3.2. 创建tun接口并添加ip(注意ip子网不要冲突)

$> ip tuntap add dev tun0 mode tun $> ip addr add 10.0.0.1/24 dev tun0 $> ip link set tun0 up

3.2.1. 启动 badvpn_tun2socks socks 转化为 vpn

$> badvpn-tun2socks --tundev tun0 --netif-ipaddr 10.0.0.2 --netif-netmask 255.255.255.0 --socks-server-addr "127.0.0.1:1080"

3.3. 设置路由

$> ip route add <other_ip> via 10.0.0.2

3.4. 以下是整理出来的完成脚本和服务配置

3.4.1. badvpn-control

$> vim /usr/local/bin/badvpn-control # 注意执行权限 #!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH # SOCKS server IP SOCKS_SERVER="127.0.0.1" # SOCKS port SOCKS_PORT="1081" # tun 设备名称(唯一) TUN_NETWORK_DEV="tun0" # tun ip 前缀(唯一) TUN_NETWORK_PREFIX="12.0.0" # 需要设置路由的ip,多个空格隔开 TUN_ROUTE_IP=("") badvpn_start(){ ip tuntap add dev "${TUN_NETWORK_DEV}" mode tun ip addr add "${TUN_NETWORK_PREFIX}.1/24" dev "${TUN_NETWORK_DEV}" ip link set "${TUN_NETWORK_DEV}" up # add route for _ip in ${TUN_ROUTE_IP[@]}; do ip route add "${_ip}" via "${TUN_NETWORK_PREFIX}.2" done # start badvpn_tun2socks (https://github.com/ambrop72/badvpn.git) badvpn-tun2socks --tundev "${TUN_NETWORK_DEV}" --netif-ipaddr "${TUN_NETWORK_PREFIX}.2" --netif-netmask 255.255.255.0 --socks-server-addr "${SOCKS_SERVER}:${SOCKS_PORT}" } badvpn_stop(){ # delete route for _ip in ${TUN_ROUTE_IP[@]}; do ip route del "${_ip}" via "${TUN_NETWORK_PREFIX}.2" done # delete network dev ip link set "${TUN_NETWORK_DEV}" down ip addr del "${TUN_NETWORK_PREFIX}.1/24" dev "${TUN_NETWORK_DEV}" ip tuntap del dev "${TUN_NETWORK_DEV}" mode tun } main(){ case "$1" in "start") badvpn_start ;; "stop") badvpn_stop ;; *) echo "$0 start|stop" ;; esac } main $@

3.4.2. socketssh-tun.service

用于管理ssh动态转发的systemd,其他方式请忽略此类

$> vim /usr/lib/systemd/system/socketssh-tun.service [Unit] Description=socketssh tun After=network.target [Service] Type=simple PIDFile=/run/socketssh-tun.pid ExecStart=/usr/bin/ssh -4 -N -C -D 1080 <user>@<remote_ip> [Install] WantedBy=multi-user.target $> systemctl daemon-reload $> systemctl status socketssh-tun.service

3.4.3. badvpn-tun2socks.service

用于管理badvpn-tun2socks启动关闭的systemd

$> vim /usr/lib/systemd/system/badvpn-tun2socks.service [Unit] Description=badvpn-tun2socks After=network.target # 若采用的是其他方式建设的socket 请删除此节点 Requires=socketssh-tun.service [Service] Type=simple PIDFile=/run/badvpn-tun2socks.pid ExecStart=/usr/local/bin/badvpn-control start ExecStopPost=/usr/local/bin/badvpn-control stop [Install] WantedBy=multi-user.target $> systemctl daemon-reload $> systemctl status badvpn-tun2socks.service

至此,搞完了 !