设为首页 收藏本站
查看: 1583|回复: 0

[经验分享] Ubuntu Server 18.04 下 iptables 的备份与还原

[复制链接]

尚未签到

发表于 2019-4-19 08:30:39 | 显示全部楼层 |阅读模式
  【备份】

  •   目标:每晚一点,将 iptables 规则导出到本地,并备份到 FTP 服务器。
  •   config.ini
[config]
;本地备份目录
LocalBakFile=/home/walker/iptables_rules_bak/iptables.rules
;FTP 主机
FtpHost=192.168.30.xx
;FTP 目录
FtpBakRoot=iptables_bak
;FTP 用户名  
FtpUser=ftpadmin
;FTP 密码
FtpPwd=ftppwd

  •   iptablesbak2ftp.py
# encoding: utf-8
# author: walker
# date: 2019-02-22
# summary: Python3 备份 iptables 规则(本地+FTP)
import os
import sys
import time
import pprint
import psutil
from configparser import ConfigParser
from ftplib import FTP
cur_dir_fullpath = os.path.dirname(os.path.abspath(__file__))
LocalBakFile = ''   # 本地备份文件
LocalIP = ''
FtpHost = ''        # FTP 主机
FtpBakRoot = ''     # FTP 目录
FtpUser = ''
FtpPwd = ''
def ReadConfig():
    r""" 读取配置文件 """
    global LocalBakFile
    global FtpHost, FtpBakRoot, FtpUser, FtpPwd
    cfg = ConfigParser()
    # cfg.optionxform = str   # 保持键的大小写
    cfgFile = os.path.join(cur_dir_fullpath, 'config.ini')
    if not os.path.exists(cfgFile):
        input(cfgFile + ' not found')
        sys.exit(-1)
    with open(cfgFile, mode='rb') as f:
        content = f.read()
    if content.startswith(b'\xef\xbb\xbf'):     # 去掉 utf8 bom 头
        content = content[3:]
    cfg.read_string(content.decode('utf8'))
    if not cfg.sections():
        input('Read config.ini failed...')
        sys.exit(-1)         
    LocalBakFile = cfg.get('config', 'LocalBakFile').strip()
    if not os.path.exists(LocalBakFile):
        print('Error: not exists %s' % LocalBakFile)
        sys.exit(-1)
    FtpHost = cfg.get('config', 'FtpHost').strip()
    FtpBakRoot = cfg.get('config', 'FtpBakRoot').strip()
    FtpUser = cfg.get('config', 'FtpUser').strip()
    FtpPwd = cfg.get('config', 'FtpPwd').strip()
    print('LocalBakFile: %s' % LocalBakFile)
    print('FtpHost: %s' % FtpHost)
    print('FtpBakRoot: %s' % FtpBakRoot)
    print('FtpUser: %s' % FtpUser)
    print('FtpPwd: %s' % FtpPwd)
    print('Read config.ini successed!')
def GetLocalIPByPrefix(prefix):
    r""" 根据前缀获取IP """
    localIP = ''
    dic = psutil.net_if_addrs()
    for adapter in dic:
        snicList = dic[adapter]
        for snic in snicList:
            if not snic.family.name.startswith('AF_INET'):
                continue
            ip = snic.address
            if ip.startswith(prefix):
                localIP = ip
    return localIP
def Main():
    filename = '%s_%s.iptables_rules' % (time.strftime('%Y%m%d', time.localtime()), LocalIP)
    cmd = '/sbin/iptables-save > %s' % LocalBakFile
    print('cmd: %s' % cmd)
    rtn = os.system(cmd)
    if 0 != rtn:
        print('Error: 0 != rtn')
        return False
    ftp = FTP()
    ftp.encoding = 'gb18030'
    ftp.set_pasv(False)
    ftp.connect(FtpHost, port=21, timeout=10)
    ftp.login(user=FtpUser, passwd=FtpPwd)
    print(ftp.getwelcome())
    ftp.cwd(FtpBakRoot)
    # 以 sql 服务器 ip 作为子目录名
    if LocalIP not in ftp.nlst():
        ftp.mkd(LocalIP)       # 创建子目录
    ftp.cwd(LocalIP)
    with open(LocalBakFile, mode='rb') as f:
        ftp.storbinary('STOR ' + filename, f)
    return True   
if __name__ == '__main__':
    ReadConfig()
    LocalIP = GetLocalIPByPrefix('192.168.30.')
    Main()

  •   iptables_bak.sh
python3 -u /home/walker/Python3Project/iptablesbak2ftp/iptablesbak2ftp.py > /home/walker/Python3Project/iptablesbak2ftp/log.log 2>&1

  •   定时任务
# m h  dom mon dow   command
# 每晚一点执行
0  1  *  *  *  /home/walker/Python3Project/iptablesbak2ftp/iptables_bak.sh  【还原】

  •   目标:开机自动还原备份的 iptables 规则
  •   创建文件:/etc/systemd/system/rc-local.service
  •   在 rc-local.service 里面添加如下内容
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target

  • 创建文件:/etc/rc.local 并添加如下内容
#!/bin/bash
/sbin/iptables-restore < /home/walker/iptables_rules_bak/iptables.rules
exit 0

  •   给 rc.local 添加可执行权限
sudo chmod 754 /etc/rc.local

  •   启用服务(开机自启动)
sudo systemctl enable rc-local
# 等价于
ln -s /etc/systemd/system/rc-local.service /etc/systemd/system/multi-user.target.wants/

  •   启动服务并检查状态
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service

  •   重启服务器检查是否能够开机启动

  【相关链接】

  •   iptables tips
  •   ubuntu-18.04 设置开机启动脚本

  *** walker ***




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-829112-1-1.html 上篇帖子: 安装Ubuntu18.04 Server 下篇帖子: VMware Workstation如何安装ubuntu 16.04?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表