Linux 防火墙:iptables 与 firewalld
概述:防火墙管理工具的演变
自 RHEL 7 系统开始,firewalld防火墙正式取代了 iptables防火墙。
- 对于熟悉 RHEL 5/6 及更早版本的用户,需要重新学习
firewalld的相关知识。 - 本质:无论是
iptables还是firewalld,它们本身都不是真正的防火墙,而是用于定义防火墙策略的管理工具或服务。 - 底层实现:
iptables服务将配置好的策略交由内核层面的 netfilter 网络过滤器处理。firewalld服务则将配置好的策略交由内核层面的 nftables 包过滤框架处理。
简言之,Linux 系统中存在多个防火墙管理工具,目的是方便运维管理;通常只需选择并配置其中之一即可。
防火墙策略的基本原理
策略匹配流程
防火墙会按照从上到下的顺序读取策略规则:
- 找到匹配项后,立即执行对应的操作(放行或阻止)。
- 如果读取完所有规则均无匹配,则执行默认策略。
策略设置逻辑
防火墙策略主要分为两种行为:“通”(放行)和“堵”(阻止)。默认策略的选择决定了规则设置的重点:
| 默认策略 | 规则设置重点 | 目的 |
|---|---|---|
| 拒绝 | 设置允许规则 (“通”) | 确保必要的流量能够进入,否则所有连接将被阻断。 |
| 允许 | 设置拒绝规则 (“堵”) | 阻止恶意或不需要的流量,否则防火墙将失去安全屏障作用。 |
iptables 详解
规则与规则链
- 规则:处理或过滤流量的具体策略条目。
- 规则链:由多条规则组成,并根据数据包处理位置的不同进行分类。
五链及其作用
| 规则链 | 处理时机 | 常见应用场景 |
|---|---|---|
| PREROUTING | 在进行路由选择前处理数据包。 | 通常用于修改目标地址(DNAT)。 |
| INPUT | 处理流入本机的数据包。 | 最常用,用于保护本机安全,过滤入站流量。 |
| FORWARD | 处理转发的数据包。 | 当本机作为网关或路由器时使用。 |
| OUTPUT | 处理流出本机的数据包。 | 过滤本机发出的流量。 |
| POSTROUTING | 在进行路由选择后处理数据包。 | 通常用于修改源地址(SNAT)。 |
INPUT链是关键:来自外部的入侵尝试主要针对流入的流量,因此精心配置
INPUT链能有效增加黑客从外网入侵的难度。
技术特性与注意事项
- 工作层级:
iptables属于 数据链路层 的服务。 - 匹配条件:可以根据流量的源/目的地址、传输协议、服务类型(端口)等信息进行匹配。
- 匹配顺序:策略规则具有严格的顺序性。必须将更严格、优先级更高的规则放在前面,否则可能导致后续规则失效或产生安全漏洞。
2.iptables常用参数
| 参数 | 作用 |
| —————- | —————————————————————— |
| -P | 设置默认策略 |
| -F | 清空规则链 |
| -L | 查看规则链 |
| -A | 在规则链的末尾加入新规则 |
| -I num | 在规则链的头部加入新规则 |
| -D num | 删除某一条规则 |
| -s | 匹配来源地址IP/MASK,加叹号“!”表示除这个IP外 |
| -d | 匹配目标地址 |
| -i 网卡名称 | 匹配从这块网卡流入的数据 |
| -o 网卡名称 | 匹配从这块网卡流出的数据 |
| -p | 匹配协议,如TCP、UDP、ICMP |
| —dport num | 匹配目标端口号 |
| —sport num | 匹配来源端口号 |
3.防火墙配置
# 清空已有的防火墙规则链
iptables -F
# 查看已有的防火墙规则链
iptables -L
# ping客户端 -c [次数]
ping -c 4 192.168.1.3
iptables -P INPUT DROP
iptables -I INPUT -p icmp -j ACCEPT
iptables -D INPUI 1
iptables -P INPUT ACCEPT
iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j REJECT
4.防火墙部署与管理
检查防火墙状态
firewall-cmd --state
iptables --version
配置服务器
#!/bin/sh
iptables -F
#允许调用localhost的应用访问
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
#允许接收任意IP地址发送的ICMP的echo类型的报文
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#允许任意IP地址访问TCP的80、443端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#只允许IP地址为192.168.0.7的主机连接TCP的22端口
iptables -A INPUT -p tcp -s 192.168.0.7 --dport 22 -j ACCEPT
#只允许IP地址为192.168.0.7的主机连接UDP的161端口
iptables -A INPUT -p udp -s 192.168.0.7 --dport 161 -j ACCEPT
iptables -A INPUT -j DROP
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP
iptables -L -n --line-numbers
touch localsafe.sh
ls
vim localsafe.sh
ls -l
chmod u+x localsafe.sh
sudo ./localsafe.sh
#!/bin/sh
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
#允许来自为192.168.1.0/24网段内的IP地址通过防火墙访问Web服务器、FTP服务器和E-mail服务器
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 220.128.15.10 --dport 80 -j
ACCEPT
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 220.128.15.11 --dport 21 -j
ACCEPT
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 220.128.15.11 --dport 20 -j
ACCEPT
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 220.128.15.12 --dport 25 -j
ACCEPT
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 220.128.15.12 --dport 110 -j
ACCEPT
iptables -A INPUT -i eth0 -p icmp -j DROP
echo 1 > /proc/sys/net/ipv4/ip_forward
touch networksafe.sh
ls
vim networksafe.sh
ls -l
chmod u+x networksafe.sh
sudo ./networksafe.sh