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
1# 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="${SOCKS_HOST}"
# SOCKS port
SOCKS_PORT="${SOCKS_PORT}"
# tun dev
TUN_NETWORK_DEV="tun0"
# tun ip prefix
TUN_NETWORK_PREFIX="12.0.0"
# route ip
TUN_ROUTE_IP=(${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 $@
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 /etc/sysconfig/badvpn
SOCKS_HOST="127.0.0.1"
SOCKS_PORT="1080"
SOCKS_ROUTE="172.16.10.10 172.16.10.11"
$> vim /usr/lib/systemd/system/badvpn-tun2socks.service
[Unit]
Description=badvpn-tun2socks
After=network.target
# Requires=socketssh-tun.service
[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
至此,搞完了 !