最近在用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了。
-
« 上一篇:
PXE实现Windows和Linux的双系统引导