2.5.4 访问控制列表与端口放行实践
访问控制列表与端口放行实践#
访问控制列表(ACL)用于细粒度控制“谁可以访问什么端口/服务”,通常落在 iptables/firewalld 规则层,实现“默认拒绝、按需放行”。本节通过原理草图、完整命令流程、验证与排错、练习进行实践。
1. 原理草图与设计流程#
设计流程:
1) 梳理业务访问矩阵(源/目的/端口/协议)
2) 设定默认策略为拒绝
3) 逐条放行并记录变更
4) 连通性验证与回滚预案
5) 持久化并纳入审计
2. 安装与基础检查(iptables/firewalld)#
安装(以 RHEL/CentOS 为例):
# firewalld 安装与启动
sudo yum install -y firewalld
sudo systemctl enable --now firewalld
# iptables 工具
sudo yum install -y iptables-services
检查系统当前使用的防火墙:
# firewalld 状态
sudo systemctl status firewalld
# iptables 规则查看
sudo iptables -L -n -v
3. iptables 放行实践(完整步骤)#
场景:仅允许办公网段访问 SSH;应用网段访问 MySQL;对外开放 80/443;其余拒绝并记录。
1) 备份现有规则:
sudo iptables-save > /root/iptables.backup
2) 清理旧规则并设置默认策略:
sudo iptables -F
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
3) 放行必要端口与网段:
# 允许已建立连接
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 仅允许办公网段 SSH
sudo iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 22 -j ACCEPT
# 对外开放 Web 80/443
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 仅允许应用网段访问 MySQL
sudo iptables -A INPUT -p tcp -s 10.0.2.0/24 --dport 3306 -j ACCEPT
4) 记录与拒绝:
# 记录(注意控制日志量)
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "DROP_INPUT "
# 默认拒绝
sudo iptables -A INPUT -j DROP
5) 持久化规则(RHEL/CentOS):
sudo service iptables save
sudo systemctl enable iptables
命令解释:
- -m conntrack --ctstate ESTABLISHED,RELATED:放行已建立连接,避免回包被阻断
- -s 192.168.10.0/24:限制来源网段
- --dport 3306:限制目标端口
- -m limit --limit 5/min:限制日志频率,避免日志风暴
4. firewalld 放行实践(完整步骤)#
场景:public 区仅开放 80/443;内网网段访问 SSH 和 MySQL。
1) 查看当前区域与网卡绑定:
sudo firewall-cmd --get-active-zones
2) 配置 public 区对外服务:
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
3) 配置 internal 区并绑定内网网段:
sudo firewall-cmd --zone=internal --add-source=10.0.2.0/24 --permanent
sudo firewall-cmd --zone=internal --add-service=ssh --permanent
sudo firewall-cmd --zone=internal --add-port=3306/tcp --permanent
4) 仅允许办公网段访问 SSH(rich rule):
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" service name="ssh" accept' --permanent
5) 重载并验证:
sudo firewall-cmd --reload
sudo firewall-cmd --list-all --zone=public
sudo firewall-cmd --list-all --zone=internal
5. 验证与排错(含示例)#
连通性测试:
# 从客户端测试端口
nc -zv 目标IP 22
nc -zv 目标IP 3306
nc -zv 目标IP 443
本机监听检查:
ss -lntp | egrep ':22|:80|:443|:3306'
日志确认:
# iptables 日志
sudo journalctl -k | tail -n 50
常见问题与定位:
- 规则顺序错误导致放行失效 → iptables -S 查看顺序
- 忘记持久化 → 重启后规则丢失
- firewalld 区域未绑定网卡/源地址 → firewall-cmd --get-active-zones
- 只开放端口未限制源 → 加 --add-rich-rule 或 -s 限源
6. 练习与实操任务#
1) 将 SSH 只允许 192.168.10.0/24,并验证其他网段被拒绝
2) 在 firewalld 中将 8080/tcp 对外开放,但仅允许 10.0.2.0/24 访问
3) 对 iptables 加入日志限频规则,并观察 journalctl -k 输出
4) 模拟误配置后回滚:使用 /root/iptables.backup 还原
回滚示例:
sudo iptables-restore < /root/iptables.backup
通过规范的 ACL 规划、端口放行与验证流程,可在保障业务可用的同时显著降低攻击面。