Bash脚本实现OpenConnect 自动添加路由

天锦 发表于 码农也得有格调 分类,标签:

最近在用OpenConnect进行多点异地组建虚拟专网,有一个主节点做OpenConnect服务器端,其他节点做客户端。OpenConnect服务器端可以下发路由各客户端但是客户端不能将客户端本地的LAN段路由反馈给服务器端,要实现各节点下的LAN段互访就需要手动在服务器端添加路由条目才行,而客户端拨号获得的IP是从服务器IP池中动态获取的,无法静态绑定(目前暂时没研究出来)也就无法手动设置永久路由。最终思路是使用occtl查看当前已经连接到网关的用户以及其获得的ip地址:

root@gw:~# occtl show users
      id     user    vhost             ip         vpn-ip device   since    dtls-cipher    status
   16799       gw1  default     10.1.0.102 192.168.60.159  vpns0 16h:34m      (no-dtls) connected
   16821       gw2  default     10.3.6.56  192.168.60.191  vpns1 15h:42m      (no-dtls) connected

这样可以用awk剥离出user、vpn-ip和device字段,每一个节点用一个独立的用户名连接到服务器,这样就可以通过用户名找到对应的IP和dev,这样就可以整脚本动态更新路由了。脚本写的粗糙,还能再简化其实,具体如下

## For sub-lan1.lab.pypy.fun - 10.10.1.0/24  对应user为gw1
#检查到该网段路由是否存在,
ROUTE_TO_QS=$(route | grep "10.10.1.0")
if [[ -z "$ROUTE_TO_QS" ]];then
        #路由不存在,查对应OpenConnect用户信息
        OC_USERS=$(occtl show users)
        OC_USERS_COUNT=$(occtl show users | wc -l | awk '{print $1}')
        for i in $(seq 2 $OC_USERS_COUNT)
        do
                OC_USER=$(occtl show users|sed -n "$i"p)
                USER_NAME=$(echo $OC_USER | awk '{print $2}')
                USER_IP=$(echo $OC_USER | awk '{print $5}')
                USER_DEV=$(echo $OC_USER | awk '{print $6}')
                if [ $USER_NAME = 'gw1' ];then
                        route add -net 10.10.1.0 netmask 255.255.255.0 gateway $USER_IP dev $USER_DEV
                fi
        done
fi
## For sub-lan2.lab.pypy.fun - 10.10.2.0/24  对应user为gw2
#检查到该网段路由是否存在,
ROUTE_TO_QS=$(route | grep "10.10.2.0")
if [[ -z "$ROUTE_TO_QS" ]];then
        #路由不存在,查对应OpenConnect用户信息
        OC_USERS=$(occtl show users)
        OC_USERS_COUNT=$(occtl show users | wc -l | awk '{print $1}')
        for i in $(seq 2 $OC_USERS_COUNT)
        do
                OC_USER=$(occtl show users|sed -n "$i"p)
                USER_NAME=$(echo $OC_USER | awk '{print $2}')
                USER_IP=$(echo $OC_USER | awk '{print $5}')
                USER_DEV=$(echo $OC_USER | awk '{print $6}')
                if [ $USER_NAME = 'gw2' ];then
                        route add -net 10.10.2.0 netmask 255.255.255.0 gateway $USER_IP dev $USER_DEV
                fi
        done
fi

脚本写好后用crontab 写成一个定时任务,定时执行就OK了。

0 篇评论

发表我的评论