1. 程式人生 > >伺服器訪問控制——基於組網結構前端有防火牆,伺服器都在防火牆內,內部使用內網ip的架構

伺服器訪問控制——基於組網結構前端有防火牆,伺服器都在防火牆內,內部使用內網ip的架構

#!/usr/bin/env python#-*- coding: utf-8 -*-'''Create date: 2018-10-17Last update:Version: 1.0Description:登陸限制需求:             X.X網段不允許訪問外網             root使用者登陸可以訪問外網             root使用者登陸情況下普通使用者無法禁止訪問外網,除非root使用者也不訪問外網             普通使用者登陸不允許訪問外網             普通使用者可以申請一段時間訪問外網Usage method:放入crontab中自定義執行間隔,不給引數時,除非root使用者登陸,否則不允許自行訪問外網,              可以傳遞1個引數,必須是數字,可以是浮點數,表示普通使用者可以訪問外網的時間,單位為小時。Author: Yefei'''import psutilimport osimport sysimport datetime#閘道器ip地址設定GW_IP="10.0.3.1"#路由列表為list型別。routList = []#刪除閘道器函式def delGateWay():  CMD = 'route del default gw %s'%(GW_IP)  os.popen(CMD)#新增閘道器函式def addGateWay():  CMD = 'route add default gw %s'%(GW_IP)  os.popen(CMD)#檢查閘道器是否存在def gateWayCheck():  flag = False  for line in routList:    if GW_IP in line:      flag = True      return flag#檢查使用者是否是rootdef userCheck():  flag = False  for User in userList:    if User.name == "root":      print("使用者是root")      flag = True      return flag#閘道器新增def userOnline(flag):  print(flag)  if flag:    print("檢測閘道器已存在,退出程式")    sys.exit()  else:    print("新增閘道器")    addGateWay()#閘道器刪除def userOffline(flag):  if flag:    print("檢測閘道器已存在,刪除閘道器")    delGateWay()  else:    print("檢測閘道器不存在,退出程式")    sys.exit()#將普通使用者訪問外網的時間節點寫入檔案,當到達此事件後去掉閘道器def FileForTime(scheme,*args):  if scheme == "w":    with open("/root/controltime","w") as recordTime:      now = datetime.datetime.now()      endTime = now + datetime.timedelta(hours=args[0])      endStrTime = endTime.strftime('%Y-%m-%d %H:%M:%S')      recordTime.write(endStrTime)      if now < endTime:        return True      else:        return False  elif scheme == "r":    with open("/root/controltime","r") as recordTime:      endStrTime = recordTime.readline()      endStrTime = endStrTime.strip()      if len(endStrTime) > 10:        endTime = datetime.datetime.strptime(endStrTime,'%Y-%m-%d %H:%M:%S')        now = datetime.datetime.now()        if now < endTime:          return True        else:          return False      else:        return Falseif __name__ == '__main__':  routList = os.popen("route -n")  userList = psutil.users()  if len(sys.argv) == 2:    hoursLen = float(sys.argv[1])    print(hoursLen)    if FileForTime('w',hoursLen):        print("使用者可以上網")        userOnline(gateWayCheck())    else:        print("使用者不可以上網")        userOffline(gateWayCheck())  else:    if len(userList) > 0 and userCheck():      userOnline(gateWayCheck())    elif os.path.exists("/root/controltime"):      if FileForTime("r"):        userOnline(gateWayCheck())      else:        userOffline(gateWayCheck())    else:        userOffline(gateWayCheck())