Skip to content

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
  • 内核模块加载
    • 加载必要模块:
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(默认拒绝、先放行白名单):
    1. 先添加允许规则:
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,白名单方式允许特定流量进入(更安全)。
  • 典型配置步骤:
    1. 允许本机回环接口(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。

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 表用于地址转换;两者结合可以构建安全的网络防护和网络转换方案。
  • 面试题示例
    1. 查看当前所有规则的命令
      答:iptables -L -niptables -nL
    2. 禁止来自10.0.0.188访问80端口的请求
      答:iptables -A INPUT -s 10.0.0.188 -p tcp --dport 80 -j DROP
    3. 如何使命令行执行的iptables规则永久生效?
      答:保存规则到 /etc/sysconfig/iptables(使用 iptables-save),并确保iptables服务在启动时加载。
    4. 实现把访问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
    5. 实现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

感谢阅读,欢迎交流!