Appearance
1. 防火墙概述
- 目标与功能
- 主要目标是“封端口”和“封IP”,即通过规则控制数据包的进出。
- 除了基本的流量过滤,还能实现 NAT(网络地址转换)功能,如共享上网、端口映射和IP映射。
- 常见应用场景
- 安全防护: 过滤不合法流量、封禁恶意IP和网段、禁止Ping探测等。
- 网络转换: 利用 NAT 功能,实现局域网内主机共享公网IP访问外部网络,或者实现端口转发,把外部访问请求转发到内部服务器。
2. 防火墙分类及基本名词
- 防火墙分类
- 硬件防火墙: 位于企业入口,如三层路由器(H3C、华为、Cisco、Juniper等),适合处理大流量。
- 软件防火墙: 在操作系统内核中运行,常见的有iptables、firewalld(CentOS7)、nftables(CentOS8)、ufw(Ubuntu)。
- 云防火墙: 如阿里云安全组、NAT网关和WAF,针对云环境定制,主要封IP/封端口及处理7层应用攻击。
- 必须熟悉的名词
- 表(Table): 类似一个容器,用来存放同一类功能的链。常见的有 filter 表(负责流量过滤)、nat 表(负责地址转换)、raw 表和 mangle 表。
- 链(Chain): 在表中存放规则的有序列表,每个链处理特定方向的数据流,例如 INPUT(进站流量)、OUTPUT(出站流量)、FORWARD(路由转发)、PREROUTING 和 POSTROUTING。
- 规则(Policy): 每条规则定义了满足条件后的处理动作,如 ACCEPT(允许)、DROP(丢弃)或 REJECT(拒绝并反馈)。
- 状态匹配(State): 利用连接状态(NEW、ESTABLISHED、RELATED、INVALID)来做进一步过滤。
3. iptables 执行流程
- 逐条匹配原则
- 数据包进入防火墙后,从上到下、从前到后依次匹配规则。
- 一旦匹配到明确的动作(例如DROP或ACCEPT),就不会继续匹配后面的规则。
- 默认规则
- 如果没有规则匹配,最终会走到链的默认策略,这个默认策略通常由系统预先设置(例如默认ACCEPT或DROP)。
4. 表与链的结构
- iptables 四个表
- filter 表: 默认表,用于数据包的过滤。主要用于主机自身防护,含有 INPUT、OUTPUT、FORWARD 三个链。
- nat 表: 和主机本身无关 一般用于局 域网共享上网或者特殊的端口转换服 务相关。 用于网络地址转换。常见应用包括共享上网、端口转发、IP映射。常用链有 PREROUTING、POSTROUTING 和 OUTPUT。
- raw 表 & mangle 表: 分别用于连接追踪前的处理和修改数据包内容(如TTL、TOS等),在本次笔记中侧重前两者。
- iptables 主要链说明
- INPUT: 处理进入本机的数据包(是否允许外部数据包进入服务器)。
- OUTPUT: 处理由本机发出的数据包。
- FORWARD: 处理经过本机转发的数据包(主要与路由和NAT有关)。
- PREROUTING: 数据包在路由前的处理,通常用于 DNAT(目的地址转换)。
- POSTROUTING: 数据包离开防火墙前的处理,常用于 SNAT(源地址转换)。
5. 环境准备及常用命令
- 安装与服务管理
- 使用 yum 安装 iptables-services,例如:
yum install -y iptables-services
- 启动并设为开机自启:
systemctl start iptables.service
systemctl enable iptables.service
- 使用 yum 安装 iptables-services,例如:
- 内核模块加载
- 加载必要模块:
shell
[root@m01 ~]# cat >>/etc/rc.local<<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF
#检查是否加载防火墙iptables 模块
[root@m01 ~]# lsmod | egrep 'filter|nat|ipt'
#清空 filter 表中的所有规则。
[root@m01 ~]# iptables -t filter -F
[root@m01 ~]# iptables -t filter -X
[root@m01 ~]# iptables -t filter -Z
[root@m01 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -jDROP
#查看指定表中的规则
[root@m01 ~]# iptables -t nat -nL
- 为保证永久加载,可将命令写入 `/etc/rc.local` 并赋予执行权限。
- 规则保存与恢复
- 保存规则:
iptables-save > /etc/sysconfig/iptables
- 恢复规则:
iptables-restore < /etc/sysconfig/iptables
- 保存规则:
6. iptables 命令参数详解
- 规则操作命令
-A
:追加规则到链末尾。-I
:插入规则到链的第一条(对于拒绝类规则,常放在最前面)。-D
:删除规则(可用序号删除,结合--line-number
查看规则序号)。
- 显示与调试选项
-L
:列出规则;加-n
可避免反向解析IP和端口。-v
:显示数据包和字节计数。
- 指定匹配条件
-p
:指定协议(tcp、udp、icmp、all)。--dport
与--sport
:指定目标端口与源端口(使用时须同时指定协议)。-s
与-d
:指定源IP与目标IP。-m multiport
:匹配多个端口,示例:--dport 80,443
。-m state --state
:匹配连接状态,如 NEW、ESTABLISHED、RELATED、INVALID。
- 跳转动作
-j
:指定匹配后的动作,如 ACCEPT、DROP、REJECT。
- 限速及并发控制
-m limit
:限制单位时间内的数据包数量,常用参数如--limit 10/minute
和--limit-burst 5
。
7. 配置 filter 表规则(详细案例)
7.1 禁止访问22端口
- 命令示例:
shell
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
- 解释:
将所有访问本机22端口(SSH)的TCP数据包丢弃。
7.2 封IP/屏蔽某个IP
- 命令示例:
shell
iptables -I INPUT -s 10.0.0.7 -j DROP
iptables -I INPUT -s 172.16.1.7 -j DROP
- 解释:
直接插入规则,屏蔽特定IP地址的数据包,防止该IP访问本机服务。
7.3 禁止网段访问指定端口
- 命令示例:
shell
iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8888 -j DROP
- 解释:
拒绝来自整个10.0.0.0/24网段访问8888端口的TCP请求。
7.4 只允许指定网段连入(白名单)
- 方法1(排除法):
shell
iptables -I INPUT ! -s 172.16.1.0/24 -j DROP
表示非172.16.1.0/24网段的全部流量直接丢弃。
- 方法2(默认拒绝、先放行白名单):
- 先添加允许规则:
shell
iptables -A INPUT -s 10.0.0.1 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
2. 修改默认策略:
plain
iptables -P INPUT DROP
- 解释:
先明确允许某些网段,再将默认规则改为拒绝,达到只允许特定网段访问的目的。
7.5 匹配 ICMP 类型(禁止 Ping)
- 命令示例:
plain
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
- 解释:
拒绝 ICMP 回显请求(ping),防止被网络探测;也可通过内核参数禁ping。
7.6 指定多个端口
- 命令示例:
plain
iptables -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT
- 解释:
允许同时访问多个端口(例如 Web 服务的80和443端口)。
7.7 匹配网络状态
- 命令示例:
plain
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
- 解释:
根据TCP/IP连接状态来做判断,只允许合法的新连接以及已经建立和相关联的连接通过。
7.8 限制并发及速率
- 命令示例:
plain
iptables -A INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
- 解释:
限制单位时间内通过的ICMP数据包数,防止因过多请求导致拒绝服务攻击(DDOS)。
7.9 防火墙规则的保存与恢复
- 保存规则:
plain
iptables-save > /etc/sysconfig/iptables
- 恢复规则:
plain
iptables-restore < /etc/sysconfig/iptables
- 解释:
将当前iptables配置备份到配置文件中,确保重启后规则能自动加载。
8. 生产环境应用实践
- 常见模式:
- “逛公园模式”:默认规则为 ACCEPT(开放所有流量)。
- “看电影模式”:默认规则为 DROP,白名单方式允许特定流量进入(更安全)。
- 典型配置步骤:
- 允许本机回环接口(lo)流量:
plain
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
2. **开放SSH和Web端口:**
plain
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT
3. **放行特定网段:**
plain
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
4. **修改默认策略为DROP:**
plain
iptables -P INPUT DROP
- 解释:
这种配置确保只有明确允许的流量可以进入,而其他流量都被拒绝,从而提高了系统安全性。
9. NAT 功能及共享上网、端口转发
9.1 实现共享上网
- 原理:
利用 NAT 的 SNAT 或 MASQUERADE 功能,把内网服务器的源IP转换成防火墙的公网IP,使内网服务器可以访问外部网络。 - 配置示例:
shell
[root@m01 /etc/sysconfig]# ssh -p 22 root@web01
[root@web01 ~]# vim /etc/sysconfig/network-scripts//ifcfg-ens33
#修改Onboot=no修改 ifcfg-ens33 关闭 ens33 网卡
root@web01 ~]# ifdown ens33
关闭ens33网卡
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens34
GATEWAY=172.16.1.61
DNS1=223.5.5.5
DNS2=223.6.6.6
#常看路由表
[root@web01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.16.1.61 0.0.0.0 UG 100 0 0 ens34
172.16.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens34
#
在 m01 服务器上启用 IP 转发
[root@m01 ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@m01 ~]# sysctl -p
#iptables 设置 NAT 规则
[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
-t nat:操作 NAT 表,负责地址转换。
-A POSTROUTING:在数据包离开 m01 服务器前修改它的源地址。
-s 172.16.1.0/24:匹配来自 172.16.1.0/24 网段的流量(即 web01)。
-j SNAT --to-source 10.0.0.61:
将 web01 的源 IP 修改为 m01 的外网 IP(10.0.0.61),
让外网服务器认为请求来自 m01,然后正常返回数据。
#查看 NAT 规则
[root@m01 ~]# iptables -t nat -L POSTROUTING -n --line-numbers
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 POSTROUTING_direct all -- 0.0.0.0/0 0.0.0.0/0
2 POSTROUTING_ZONES all -- 0.0.0.0/0 0.0.0.0/0
3 SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61
4 SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61
[root@m01 ~]#vim /etc/sysctl.conf #内核转发
net.ipv4.ip_forward = 1
[root@m01 ~]# sysctl -p
#在 web01 上测试外网连通性
[root@web01 ~]# ping 223.6.6.6
PING 223.6.6.6 (223.6.6.6) 56(84) bytes of data.
64 bytes from 223.6.6.6: icmp_seq=1 ttl=127 time=59.9 ms
64 bytes from 223.6.6.6: icmp_seq=2 ttl=127 time=45.6 ms
- 额外步骤:
- 开启内核IP转发:在
/etc/sysctl.conf
中添加net.ipv4.ip_forward = 1
并执行sysctl -p
- 后端主机配置网关指向防火墙的内网IP。
- 开启内核IP转发:在
9.2 实现端口转发
- 原理:
使用 DNAT 将访问防火墙上某个端口的请求转发到内网服务器上的对应端口。 - 配置示例:
plain
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22
shell
[root@web01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.16.1.61 0.0.0.0 UG 100 0 0 ens34
172.16.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens34
[root@m01 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9999 -j DNAT --to-destination 172.16.1.7:22
[root@m01 ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
PREROUTING_direct all -- 0.0.0.0/0 0.0.0.0/0
PREROUTING_ZONES all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 10.0.0.61 tcp dpt:9999 to:172.16.1.7:22
- 解释:
将访问10.0.0.61:9000的请求转发到内网服务器172.16.1.7的22端口。
9.3 实现 IP 映射
- 原理:
给服务器网卡添加一个别名IP,然后将指向这个IP的流量转发到内网指定服务器。 - 配置示例:
plain
ip a add 10.0.0.62/24 dev eth0 label eth0:0
iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7
10. Iptables 总结
- 核心概念回顾:
- iptables 主要有四个表(filter、nat、raw、mangle)和五个链(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING)。
- Filter 表用于流量过滤;nat 表用于地址转换;两者结合可以构建安全的网络防护和网络转换方案。
- 面试题示例
- 查看当前所有规则的命令
答:iptables -L -n
或iptables -nL
- 禁止来自10.0.0.188访问80端口的请求
答:iptables -A INPUT -s 10.0.0.188 -p tcp --dport 80 -j DROP
- 如何使命令行执行的iptables规则永久生效?
答:保存规则到/etc/sysconfig/iptables
(使用iptables-save
),并确保iptables服务在启动时加载。 - 实现把访问10.0.0.3:80的请求转到172.16.1.17:80
答:iptables -t nat -A PREROUTING -d 10.0.0.3 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.17:80
- 实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网
答:iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 124.32.54.26
- 查看当前所有规则的命令