内网回拨方案

注意
本文最后更新于 2022-06-23,文中内容可能已过时。
前言

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

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

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

参考资料:

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

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

1. badvpn_tun2socks 编译

1
2
3
4
$> 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 

1# 2. badvpn_tun2socks 使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 创建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.1.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.1.0.2

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

3. 完成过程

1
$> ssh -4 -N -C -D 1080 <user>@<remote_ip>
1
2
3
$> ip tuntap add dev tun0 mode tun
$> ip addr add 10.0.0.1/24 dev tun0
$> ip link set tun0 up
1
$> badvpn-tun2socks --tundev tun0 --netif-ipaddr 10.1.0.2 --netif-netmask 255.255.255.0 --socks-server-addr "127.0.0.1:1080"
1
$> ip route add <other_ip> via 10.1.0.2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
$> vim /usr/local/bin/badvpn-control # 注意执行权限 
#!/bin/bash
################################################# 
#   author      0x5c0f 
#   date        2019-08-13 
#   email       mail@0x5c0f.cc 
#   web         blog.0x5c0f.cc 
#   version     1.0.0
#   last update 2019-08-13
#   descript    Use : ./badvpn-control -h
################################################# 

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# SOCKS server IP 
SOCKS_SERVER="${SOCKS_HOST}"
# SOCKS port
SOCKS_PORT="${SOCKS_PORT}"
# tun dev 
TUN_NETWORK_DEV="tun0"
# tun ip prefix 
TUN_NETWORK_PREFIX="10.1.0"
# route ip
TUN_ROUTE_IP=($(eval echo ${SOCKS_ROUTE}))

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 $@ 

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$> 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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$> vim /etc/sysconfig/badvpn
SOCKS_HOST="127.0.0.1"
SOCKS_PORT="1090"

# 只支持ipv4 
GOLANG_HOST=""

# 支持配置多个 空格隔开   
SOCKS_ROUTE="${GOLANG_HOST}"

$> vim /usr/lib/systemd/system/badvpn-tun2socks.service
[Unit]
Description=badvpn-tun2socks
After=network.target

[Service]
Type=simple
EnvironmentFile=/etc/sysconfig/badvpn
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

至此,搞完了 !