自动放行nginx后台访问ip

由于公司外网地址是动态变化的,但又必须做到仅公司能访问,以下是实现方式

获取公司外网ip

#!/usr/local/bin/python3
# coding:utf-8


# ====================================================
# Author: chang - EMail:changbo@hmg100.com
# Last modified: 2017-04-28
# Filename: getoutip.py
# Description: get out ip,base requests ,json, time, pymysql, socket
# blog:http://www.cnblogs.com/changbo
# ====================================================

# import socket
# import requests
# import json
import time
import pymysql
import socket


port = xxxx
host = 'x.x.x.x'


def getOut():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))
    data = 'hi'
    s.send(str(data).encode('utf-8'))
    results = s.recv(1024)
    getip = str(results, 'utf-8')
    s.close()

    nowtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    db = pymysql.connect('x.x.x.x', 'root', 'xxxxx', 'yunwei')
    # print(nowtime)
    # url = "https://ipinfo.io"
    
    iplist = []
    # r = requests.get(url)
    # getip = json.loads(r.text)
    
    sql1 = 'select ip from wan_ip'
    sql2 = "INSERT INTO wan_ip(ip, time) VALUES('%s', '%s')" % (getip, nowtime)
    cursor = db.cursor()
    cursor.execute(sql1)
    datad = cursor.fetchall()
    for i in datad:
        iplist.append(i[0])
    
    if getip not in iplist:
        cursor.execute(sql2)
        db.commit()
        db.close()
      
def getOutwan():
    time.sleep(120)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))
    data = 'hi'
    s.send(str(data).encode('utf-8'))
    results = s.recv(1024)
    getip = str(results, 'utf-8')
    s.close()

    nowtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    db = pymysql.connect('x.x.x.x', 'xxxx', 'xxxx', 'yunwei')
    # print(nowtime)
    # url = "https://ipinfo.io"

    iplist = []
    # r = requests.get(url)
    # getip = json.loads(r.text)

    sql1 = 'select ip from wan_ip'
    sql2 = "INSERT INTO wan_ip(ip, time) VALUES('%s', '%s')" % (getip, nowtime)
    cursor = db.cursor()
    cursor.execute(sql1)
    datad = cursor.fetchall()
    for i in datad:
        iplist.append(i[0])

    if getip not in iplist:
        cursor.execute(sql2)
        db.commit()
        db.close()

if __name__ == '__main__':
    getOut()
    getOutwan()

发送公网外网ip

#!/usr/local/bin/python3

import socket
import threading

# ====================================================
# Author: chang - EMail:changbo@hmg100.com
# Last modified: 2017-04-28
# Filename: sendoutip.py
# Description: send u out ip ,base socket
# blog:http://www.cnblogs.com/changbo
# ====================================================

port = xxxx
host = 'x.x.x.x'


def sendOut():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((host, port))
    s.listen(5)

    while True:
        connection, address = s.accept()
        ip, _ = address
        ip = (str(ip)).encode('utf-8')
        while True:
            try:
                data = connection.recv(1024)
                if not data:
                    break
                connection.send(ip)
            except Exception as e:
                pass
            # s.close()
        connection.close()
        continue
    s.close()

if __name__ == '__main__':
   t = threading.Thread(target=sendOut)
   t.start()    

自动修改nginx可访问ip

#!/usr/local/bin/python3
# coding:utf-8

# ====================================================
# Author: chang - EMail:changbo@hmg100.com
# Last modified: 2017-04-28
# Filename: changehoutaiip.py
# Description: change nginx access web ip,base re ,pymysql, subprocess
# blog:http://www.cnblogs.com/changbo
# ====================================================

import re
import pymysql
import subprocess

def GetNginxAddr():
    with open('/var/openresty/nginx/conf/nginx.conf') as f:
        lines = f.readlines()
        for line in lines:
            temline = line.split(')')
            if '$remote_addr !~* ' in temline[0] and '#' not in temline[0]:
                ipadd = re.findall(r'\d+.\d+.\d+.\d+', temline[0])
                return ipadd[0]


# print(GetNginxAddr())


def GetNowWanAddr():
    db = pymysql.connect('x.x.x.x', 'xxxx', 'xxxx', 'yunwei')
    sql1 = 'select ip from wan_ip ORDER by id desc limit 1'

    cursor = db.cursor()
    cursor.execute(sql1)
    datad = cursor.fetchone()
    datad = '%s' % datad
    return datad


# print(GetNowWanAddr())

oldip = GetNginxAddr()
newip = GetNowWanAddr()


# print(oldip, newip)


def alter(file, oldstr, newstr):
    file_data = ""
    if oldstr != newstr:
        with open(file) as f:
            lines = f.readlines()
            for line in lines:
                temline = line.split(')')
                if '$remote_addr !~* ' in temline[0] and '#' not in temline[0]:
                    line = line.replace("if ($remote_addr !~* '" + oldip + "'){",
                                        "if ($remote_addr !~* '" + newip + "'){")
                file_data += line
        with open(file, "w") as f:
            f.write(file_data)
        subprocess.Popen("/var/openresty/nginx/sbin/nginx -s reload", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    else:
        pass

alter("/var/openresty/nginx/conf/nginx.conf", oldip, newip)

END!