月度归档:2018年02月

EdgeRouter Lite 3 配置 OpenConnect

概览

EdgeOS 是基于 Vyatta 开发的 Debian 系软路由操作系统,具有极高的自由度。然而,由于 EdgeOS 所支持的 VPN 协议较为局限,我们需要手动配置路由的 OpenConnect VPN Client。

缺陷

本方法不具备策略路由等功能,为全局代理,对于国内应用的访问风控会有影响。
适用于需要全天候使用的用户,不适用于需要频繁切换线路的用户。

步骤

1.配置 APT 软件源

configure
set system package repository wheezy components 'main contrib non-free'
set system package repository wheezy distribution wheezy 
set system package repository wheezy url http://http.us.debian.org/debian
commit
save
exit

源也可以更换为 https://mirrors.tuna.tsinghua.edu.cn/debian/

bash
sudo apt-get update

2.安装 OpenConnect VPN Client

因为有数百个依赖需要安装,此时需要等待一段时间。结束后会产生一个缺少 psmisc 依赖的错误,根据官方解释是 Busybox 导致的冲突,忽略即可。

bash
sudo apt-get install openconnect -y

3.编写服务控制脚本

vi /etc/init.d/vpn.sh

完善下列脚本中的信息并写入。

#!/bin/bash
# Path variables
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# VPN Variables
IFACE="sslinterface"
VPN_USER="[[用户名]]"
VPN_HOST="[[服务器地址]]"
VPN_PASS='[[密码]]'
PID="/var/run/openconnect.pid"
TEMP_LOG="/tmp/status.txt"
INFO="

Usage: $(basename "$0") (start|stop|status|restart)

"

# Connect to Cisco SSL VPN using passwords from stdin (passed by VPN_PASS variable created prior)
function connect_vpn(){

if [ -f $PID ]
    then
        printf "\n\tOpenconnect is already running\n"
        exit 1
    else
        echo ${VPN_PASS} | openconnect -b --user=${VPN_USER} --no-dtls ${VPN_HOST} --passwd-on-stdin > $TEMP_LOG 2>&1
        if $(grep -i failed $TEMP_LOG)
            then
                printf "\n\tOpenconnect failed to start!\n"
                cat $TEMP_LOG
                exit 2
            else
                touch $PID
                iptables -I FORWARD -o tun0 -j ACCEPT
                iptables -t nat -A POSTROUTING -s [[本地局域网网段]] -j MASQUERADE
                printf "\n\tOpenconnect started!\n"
        fi
fi
}

# Check if openconnect is running through PID file
function check_openconnect(){

if [ -f $PID ]
    then
        printf "\n\tOpenconnect is running!\n"
    else
        printf "\n\tOpenconnect is stopped\n"
fi
}

# Confirm if PID file exists, then kill it immediately
function kill_openconnect(){

if [ -f $PID ]
    then
        rm -f $PID >/dev/null 2>&1
        kill -9 $(pgrep openconnect) >/dev/null 2>&1
        iptables -D FORWARD -o tun0 -j ACCEPT
        iptables -t nat -D POSTROUTING -s [[本地局域网网段]] -j MASQUERADE
    else
        printf "\n\tOpenconnect is not running!\n"
fi
}

case "$1" in

    start)
    
        connect_vpn
        ;;
    
    stop)
    
        kill_openconnect
        ;;
    
    status)
    
        check_openconnect
        ;;
    
    restart)
    
        $0 stop
        $0 start
        ;;
    
    *)
    
        echo "$INFO"
        exit 0
        ;;
esac

使脚本可被执行

chmod +x vpn.sh

4.设置服务监控与自动启动

实现的方式有很多种,这里采取最简单的定时任务方式。
编辑 root 用户的计划任务。

crontab -e -u root

添加一行内容,使得系统每分钟启动一次服务。由于控制脚本中存在冲突检测,所以配合 crontab 实现了看门狗功能。

* * * * * /etc/init.d/vpn.sh start

5.配置负载均衡[可选]

当前网络模式为 eth0 + eth1 双WAN负载均衡,因此将 tun0 添加到负载均衡组,分配权重为 100,其余各分配 0。这样全部流量会从 tun0 通过,当 tun0 故障时,其余两个端口会自动接管流量。

参考资料

jibla/ubuntu-openconnect-command: Bash script handling openconnect commands for ubuntu cli.
ubnt EdgeOS 下如何固化 iptables 规则,每次开机都生效。 – V2EX
EdgeRouter – Add other Debian packages to EdgeOS