Linux防火墙配置实战_Linux iptables与firewalld设置教程

大哥大姐们有没有人讲详细点的我想教一下,Linux防火墙配置实战_Linux iptables与firewalld设置教程
最新回答
敗傢丶仔

2026-05-17 09:54:44

Linux防火墙配置主要使用iptables和firewalld工具,iptables直接操作内核netfilter框架,功能强大但复杂;firewalld提供更高层动态管理接口,通过区域简化配置。

iptables配置

iptables直接操作内核的Netfilter框架,规则链式排列,按顺序处理数据包,有INPUT、OUTPUT、FORWARD等链,分别对应流入、流出和转发的数据包。配置步骤如下:

  • 查看当前规则:
sudo iptables -L -n -v
  • 允许SSH(22端口)连接:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  • 允许HTTP/HTTPS(80/443端口)连接:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPTsudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  • 允许已建立的连接及相关连接通过:
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  • 拒绝所有其他传入连接(默认策略):
sudo iptables -P INPUT DROP

操作前务必确保允许了SSH,否则可能把自己锁在外面。

  • 保存规则:

    Debian/Ubuntu系统:

sudo apt-get install netfilter-persistentsudo systemctl enable netfilter-persistentsudo netfilter-persistent save- CentOS/RHEL 7+系统:sudo yum install iptables-servicessudo systemctl enable iptablessudo systemctl start iptablessudo iptables-save > /etc/sysconfig/iptablesfirewalld配置

firewalld是Red Hat系发行版(如CentOS 7+、Fedora)的默认防火墙管理工具,通过区域(zones)简化配置。配置步骤如下:

  • 启动和启用firewalld:
sudo systemctl start firewalldsudo systemctl enable firewalld
  • 查看当前状态和默认区域:
sudo firewall-cmd --statesudo firewall-cmd --get-default-zone
  • 查看特定区域(例如public)的规则:
sudo firewall-cmd --zone=public --list-all
  • 允许SSH服务(永久生效):
sudo firewall-cmd --zone=public --add-service=ssh --permanent
  • 允许HTTP服务(永久生效):
sudo firewall-cmd --zone=public --add-service=http --permanent
  • 允许HTTPS服务(永久生效):
sudo firewall-cmd --zone=public --add-service=https --permanent
  • 允许特定端口(例如8080/tcp):
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
  • 重新加载firewalld使永久规则生效:
sudo firewall-cmd --reload
  • 移除服务或端口:
sudo firewall-cmd --zone=public --remove-service=ssh --permanentsudo firewall-cmd --zone=public --remove-port=8080/tcp --permanentsudo firewall-cmd --reloadiptables和firewalld的选择
  • firewalld:适合现代Linux发行版,尤其是基于RHEL/CentOS的系统。它提供更抽象、动态的管理方式,“区域”概念使管理更清晰,支持运行时动态修改规则,不会中断现有连接。

  • iptables:是Linux防火墙的基石,firewalld基于其实现。若需要精细、底层控制,或在资源受限、追求极致性能的环境(如嵌入式设备),iptables的直接操作能力无可替代,语法复杂但能实现复杂过滤逻辑。
确保防火墙配置在系统重启后生效
  • iptables:

    Debian/Ubuntu系统:使用netfilter-persistent服务,安装后执行sudo netfilter-persistent save,规则会写入/etc/iptables/rules.v4和/etc/iptables/rules.v6文件,系统启动时自动加载。

    Red Hat/CentOS系统:使用iptables-services包,配置完规则后执行sudo iptables-save > /etc/sysconfig/iptables(IPv6为ip6tables-save > /etc/sysconfig/ip6tables),系统启动时iptables服务自动加载。

  • firewalld:使用--permanent参数使规则永久生效,如sudo firewall-cmd --zone=public --add-service=http --permanent,规则写入/etc/firewalld/zones/public.xml等文件。执行sudo firewall-cmd --reload使永久规则立即生效,且不会中断现有连接。
防火墙配置的最佳实践与安全考量
  • 默认拒绝(Default Deny)原则:除非明确允许,否则拒绝一切流量。iptables中通过iptables -P INPUT DROP设置链的默认策略为DROP,firewalld的区域默认拒绝未明确允许的服务。
  • 最小权限原则:只允许必要的服务从必要的源访问,缩小攻击面。例如,iptables中指定源IP允许SSH访问:
sudo iptables -A INPUT -s 203.0.113.42 -p tcp --dport 22 -j ACCEPT

firewalld中使用rich-rule指定源IP允许SSH访问:

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.42" port port="22" protocol="tcp" accept' --permanent
  • 启用日志记录:iptables通过LOG目标记录被拒绝的连接,如:
sudo iptables -A INPUT -j LOG --log-prefix "IPTABLES_DROP: " --log-level 7sudo iptables -A INPUT -j DROP

被拒绝的流量会记录到系统日志中(通常是/var/log/messages或syslog)。

  • 限制连接速率(Rate Limiting):对于SSH服务,限制一定时间内来自同一IP的连接尝试次数,缓解暴力破解攻击。iptables规则如下:
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --setsudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
  • 考虑IPv6:系统多为双栈,若防火墙只配置IPv4规则,IPv6流量可能畅通无阻。iptables对应的IPv6工具是ip6tables,firewalld会同时管理IPv4和IPv6规则。
  • 定期审查和更新:服务器环境和服务不断变化,防火墙规则也应随之更新。新增服务开放端口,不再使用的服务关闭端口,定期审查确保规则符合安全策略。