CentOS服务器要搭建内网监控并隔离外部访问,本质上是要解决两个问题:一是监控数据从哪里来、存到哪里、怎么展示;二是网络层面如何确保只有内网可信地址能访问这套监控系统,外部流量一律拒绝。很多运维直接把Zabbix或者Prometheus的Web端口暴露在公网,再靠弱密码或默认账号撑着,这等于把服务器健康状态、内网拓扑、服务端口全送给扫描器。正确的做法是在部署监控组件的同时,用firewalld和内核参数把监听地址、访问来源、转发行为一次性收紧。
先确定监控架构与监听范围CentOS 7和CentOS Stream 8/9在包管理和服务管理上有差异,但内网监控的核心思路一致。推荐使用Node Exporter加Prometheus加Grafana的组合,轻量、无外部依赖、数据格式通用。Node Exporter负责采集CPU、内存、磁盘、网络、系统负载等基础指标,Prometheus定时拉取并存储时序数据,Grafana负责展示和告警。三个组件都只需要监听内网地址,不需要对公网开放任何端口。
安装前先规划端口:Node Exporter默认9100,Prometheus默认9090,Grafana默认3000。假设内网网卡地址是192.168.10.20,那么所有服务都应绑定在这个地址上,而不是0.0.0.0。绑定0.0.0.0意味着服务监听所有网卡,包括可能存在的公网网卡,即使防火墙挡了端口,一旦规则被误删或重启失效,服务就直接暴露。
安装并配置Node Exporter只监听内网CentOS 7可以直接用yum安装epel源里的node_exporter,但版本较旧。建议从官方发布页下载二进制包,解压后放到/usr/local/bin。创建systemd服务文件时,在ExecStart里明确指定监听地址:
[Unit] Description=Node Exporter After=network.target [Service] User=node_exporter Group=node_exporter ExecStart=/usr/local/bin/node_exporter --web.listen-address=192.168.10.20:9100 --collector.systemd --collector.processes [Install] WantedBy=multi-user.target
这里的关键是--web.listen-address参数。很多教程省略这个参数,Node Exporter就会监听所有地址。加完参数后执行systemctl daemon-reload和systemctl enable --now node_exporter,再用ss -tlnp | grep 9100确认监听地址是192.168.10.20而不是0.0.0.0或:::。如果服务器有多块网卡,必须确认内网网卡名称和IP,避免绑定到错误的接口。
Prometheus配置内网抓取与本地存储Prometheus同样需要绑定内网地址。下载解压后,修改prometheus.yml,把scrape_configs里的targets指向Node Exporter的内网地址。同时设置external_labels标识服务器角色,方便多台机器汇总时区分。启动参数里加--web.listen-address=192.168.10.20:9090和--storage.tsdb.retention.time=30d控制数据保留时间。
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'centos-node'
static_configs:
- targets: ['192.168.10.20:9100']
labels:
instance: 'centos-internal-01'
Prometheus默认会尝试从本地时间序列数据库读取数据,如果存储目录权限不对会启动失败。创建/var/lib/prometheus目录并授权给prometheus用户。启动后访问http://192.168.10.20:9090/targets,确认Node Exporter状态为UP。如果显示DOWN,先检查内网连通性,再查看Prometheus日志,通常是端口不通或防火墙拦截。
Grafana只允许内网访问并设置强认证Grafana安装后默认监听0.0.0.0:3000,必须修改配置文件/etc/grafana/grafana.ini。找到http_addr和http_port字段,把http_addr改为192.168.10.20。同时修改admin密码,关闭匿名访问,开启登录失败锁定。配置文件里anonymous_auth下的enabled要设为false,security下的admin_password改成强密码,login_maximum_incorrect_attempts设为5。
[server] http_addr = 192.168.10.20 http_port = 3000 domain = 192.168.10.20 [security] admin_user = admin admin_password = 替换为强密码 login_maximum_incorrect_attempts = 5 [auth.anonymous] enabled = false
Grafana的默认数据源配置也要走内网地址。登录后添加Prometheus数据源,URL填http://192.168.10.20:9090,不要用localhost。虽然localhost也能通,但一旦Grafana迁移或Prometheus改地址,配置就会失效。保存后导入Node Exporter的官方仪表盘模板,ID是1860,就能看到完整的服务器监控面板。
用firewalld构建严格的访问控制服务层面绑定内网地址只是第一层,防火墙是第二层。CentOS 7和8都自带firewalld,默认public区域通常允许SSH和DHCPv6客户端。需要把内网网卡加入trusted区域或自定义区域,并明确只放行内网来源的监控端口。
先查看网卡所属区域:firewall-cmd --get-active-zones。如果内网网卡在public区域,需要把监控端口从public区域移除,并添加rich rule限制来源IP。更稳妥的做法是创建专用区域internal-mon,把内网网卡绑定到该区域,然后只开放给内网网段:
firewall-cmd --permanent --new-zone=internal-mon firewall-cmd --permanent --zone=internal-mon --add-interface=eth1 firewall-cmd --permanent --zone=internal-mon --add-source=192.168.10.0/24 firewall-cmd --permanent --zone=internal-mon --add-port=9100/tcp firewall-cmd --permanent --zone=internal-mon --add-port=9090/tcp firewall-cmd --permanent --zone=internal-mon --add-port=3000/tcp firewall-cmd --reload
注意add-source和add-interface同时使用时,来源规则优先于接口规则。如果内网还有多个网段需要访问监控,比如运维网段192.168.20.0/24,就再add-source。公网网卡保持在public区域,不添加任何监控端口。这样即使服务误绑定到0.0.0.0,外部流量到达公网网卡时也会被public区域默认拒绝。
关闭不必要的服务与端口内网监控服务器上除了SSH、Node Exporter、Prometheus、Grafana,不应该有其他监听服务。用ss -tlnp检查所有TCP监听端口,发现不认识的进程立即排查。常见的多余服务包括avahi-daemon、rpcbind、postfix。这些服务在CentOS默认安装时可能开启,监听在0.0.0.0上,虽然不直接暴露监控数据,但增加了攻击面。
systemctl stop avahi-daemon systemctl disable avahi-daemon systemctl stop rpcbind systemctl disable rpcbind systemctl stop postfix systemctl disable postfix
SSH服务也需要限制来源。如果运维人员固定从某个内网网段登录,可以在firewalld里添加rich rule只允许该网段访问22端口。同时修改/etc/ssh/sshd_config,设置PermitRootLogin no和PasswordAuthentication no,改用密钥登录。监控服务器通常不需要频繁登录,但一旦被入侵,攻击者可以篡改监控数据掩盖入侵痕迹。
内核参数与反向代理加固除了防火墙,还可以通过内核参数限制网络行为。编辑/etc/sysctl.conf,开启反向路径过滤和SYN Cookie保护,禁止ICMP重定向。这些参数能防止一些基于IP欺骗的攻击。
net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0
如果内网有反向代理需求,比如多个监控系统统一入口,可以在Nginx上配置只监听内网地址,并对Grafana和Prometheus做路径转发。但要注意,Prometheus本身没有认证,直接暴露给内网所有用户也不安全。可以在Nginx层加basic auth,或者使用Grafana的代理功能访问Prometheus,这样Prometheus的9090端口可以只对Grafana所在主机开放,进一步缩小暴露面。
验证隔离效果与日志审计配置完成后必须从外部和内部两个方向验证。从公网服务器尝试telnet监控服务器的公网IP 9090端口,应该超时或拒绝。从内网其他机器访问http://192.168.10.20:3000,应该能打开Grafana登录页。同时检查firewalld日志,确认没有异常连接尝试。开启firewalld的日志功能:firewall-cmd --set-log-denied=all,被拒绝的包会记录到/var/log/messages,便于发现扫描行为。
Grafana和Prometheus的访问日志也要开启。Grafana在配置文件里设置log_mode为console file,Prometheus启动参数加--log.level=info。定期检查日志中是否有非内网IP的访问记录,如果有,说明防火墙规则可能失效或存在其他入口。监控系统本身也需要被监控,可以再部署一个独立的Node Exporter实例采集监控服务器的系统指标,形成闭环。
内网监控隔离外部访问不是一次性配置,而是持续的状态管理。每次系统更新、服务重启、网络变更后,都要重新确认监听地址和防火墙规则。CentOS Stream 9的firewalld语法与CentOS 7基本一致,但服务管理用systemctl,包管理用dnf,部署时注意版本差异。把监控系统锁在内网,既保护了监控数据不被外部获取,也防止监控服务器成为攻击内网的跳板。
