运维

PacketFence 添加额外防火墙策略

PacketFence 通过自定义规则文件 iptables-custom.conf.inc 添加额外防火墙策略,以放行 192.168.9.188 访问 TCP 10050(Zabbix Agent)为例。

方式:使用 iptables-custom.conf.inc

PacketFence 支持通过自定义规则文件定制 iptables 规则,文件位于:

/usr/local/pf/conf/iptables-custom.conf.inc

该文件中的规则会在 PacketFence 自身的防火墙规则之前生效。

步骤 1:编辑自定义规则文件

vi /usr/local/pf/conf/iptables-custom.conf.inc

写入内容:

{
   "filter" : {
      "FORWARD" : [],
      "INPUT" :   ["-s 192.168.9.188/32 -p tcp -m tcp --dport 10050 -j ACCEPT"],
      "OUTPUT" :  []
   },
   "mangle" : {
      "PREROUTING" : [],
      "INPUT" : [],
      "FORWARD" : [],
      "OUTPUT" : [],
      "POSTROUTING" : []
   },
   "nat" : {
      "POSTROUTING" : [],
      "OUTPUT" : [],
      "PREROUTING" : []
   }
}

保存退出。

Netmiko:Python多厂商网络设备SSH自动化库

Netmiko 是一个基于 Paramiko 的 Python 库,专门用于简化网络设备的 SSH 管理。它支持 Cisco、Juniper、Arista、HP、华为、Fortinet 等 100+ 平台,提供统一的 API 接口,让网络工程师可以用一套代码管理不同厂商的设备。

安装

pip install netmiko

基本用法

建立 SSH 连接

from netmiko import ConnectHandler

device = {
    'device_type': 'cisco_xe',
    'host': '192.168.1.1',
    'username': 'admin',
    'password': 'password',
}

net_connect = ConnectHandler(**device)
print(net_connect.find_prompt())  # 输出: cisco5#

device_type 指定设备厂商和型号,常见值包括:

device_type 厂商/平台
cisco_ios Cisco IOS
cisco_xe Cisco IOS XE
cisco_nxos Cisco NX-OS
juniper_junos Juniper JunOS
arista_eos Arista EOS
huawei 华为
hp_comware H3C Comware
fortinet Fortinet

执行 show 命令

output = net_connect.send_command('show ip arp')
print(output)

Netmiko 会自动处理输出分页(terminal length 0),并去除命令回显和提示符,只返回纯净的命令输出。

对于耗时较长的命令,可以指定超时时间:

output = net_connect.send_command('show tech-support', delay_factor=5, max_loops=500)

执行配置命令

config_commands = [
    'interface GigabitEthernet0/1',
    'description Uplink-to-Core',
    'ip address 10.0.0.1 255.255.255.0',
    'no shutdown',
]

output = net_connect.send_config_set(config_commands)
print(output)

# 保存配置
net_connect.save_config()

send_config_set() 会自动进入配置模式、逐条执行命令、退出配置模式。

批量管理多台设备

from netmiko import ConnectHandler

devices = [
    {'device_type': 'cisco_xe', 'host': '192.168.1.1', 'username': 'admin', 'password': 'pass1'},
    {'device_type': 'cisco_xe', 'host': '192.168.1.2', 'username': 'admin', 'password': 'pass2'},
    {'device_type': 'cisco_xe', 'host': '192.168.1.3', 'username': 'admin', 'password': 'pass3'},
]

for device in devices:
    try:
        conn = ConnectHandler(**device)
        output = conn.send_command('show version')
        print(f'{device["host"]}: {output[:100]}...')
        conn.disconnect()
    except Exception as e:
        print(f'{device["host"]}: 连接失败 - {e}')

unattended-upgrades:Debian/Ubuntu 自动安全更新

unattended-upgrades 是 Debian 和 Ubuntu 系统上用于自动安装安全更新的工具。对于没有专人日常维护的服务器,它能确保已知漏洞及时被修补,减少被攻击的风险。

安装

首先更新软件包列表并安装:

sudo apt update
sudo apt upgrade
sudo apt install unattended-upgrades

安装完成后,系统会自动创建一个 cron 任务和 systemd 计时器,用于周期性检查并安装更新。

配置

主要配置文件有两个:

启用 / 禁用自动更新

/etc/apt/apt.conf.d/20auto-upgrades

内容格式:

# 禁用
//APT::Periodic::Update-Package-Lists "0";
//APT::Periodic::Unattended-Upgrade "0";

# 启用:每天检查并自动安装
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

控制哪些包会被更新

/etc/apt/apt.conf.d/50unattended-upgrades

默认配置大致如下(// 开头的行被忽略):

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}";
    "${distro_id}:${distro_codename}-security";
    "${distro_id}ESMApps:${distro_codename}-infra-security";
    "${distro_id}ESM:${distro_codename}-infra-security";
};

Unattended-Upgrade::Package-Blacklist {
    # 在此列出不需要自动更新的包
};

几个常用配置:

  • 只更新安全包:在 Allowed-Origins 中仅保留带 -security 后缀的行
  • 排除特定包:在 Package-Blacklist 中添加包名,每行一个
  • 自动重启:需要时(如内核更新),取消注释 Unattended-Upgrade::Automatic-Reboot "true"; 并设置 Unattended-Upgrade::Automatic-Reboot-Time "02:00";

如何查看 Red Hat 和 Debian 服务器的 crontab 日志

定时任务跑没跑、有没有报错,第一件事就是翻日志。但 Red Hat 和 Debian 两家的 cron 日志不在同一个位置,刚接触服务器的人很容易找不到。这篇文章把两边的查看方法、日志格式、和日志为空时的排查步骤都列出来。

Red Hat 系列(RHEL / CentOS / Fedora)

Red Hat 系的 cron 守护进程叫 crond(来自 cronie 包),日志默认写在 /var/log/cron。

直接看:

tail -f /var/log/cron

每条记录长这样:

Mar 21 10:00:01 hostname CRON[12345]: (alice) CMD (/home/alice/backup.sh)

CRON[12345] 是 cron 分配的进程 PID,(alice) 是执行任务的用户,CMD (...) 后面就是 crontab 里写的命令。命令执行成功、失败,都会原样记在这里,输出也会一并追加。

如果 /var/log/cron 看不到内容,去系统日志里找:

grep CRON /var/log/messages

Red Hat 系的 rsyslog 会把 cron 消息同时写到 /var/log/messages,两个文件内容基本一致。

systemd 发行版(RHEL 7+、CentOS 7+、Fedora)还可以用 journalctl:

journalctl -u crond --since "1 hour ago"

Debian 系列(Debian / Ubuntu)

Debian 系的 cron 守护进程叫 cron,日志默认写在 /var/log/syslog,不单独存一个 cron 文件。

看 cron 相关的记录:

grep CRON /var/log/syslog

条目格式和 Red Hat 一样,只是容器换成了 syslog:

Mar 21 10:00:01 hostname CRON[12345]: (alice) CMD (/home/alice/backup.sh)

有些 Debian/Ubuntu 系统会把 cron 单独写到 /var/log/cron,取决于 /etc/rsyslog.d/50-default.conf 里 #cron.* /var/log/cron 这行有没有被注释掉。如果注释掉了,cron 消息就只走 syslog;取消注释并重启 rsyslog,就会多出一个独立的 cron 日志文件。

journalctl 同样可用:

journalctl -u cron --since "1 hour ago"