防火墙基础
防火墙的基本功能
- 封ip和封端口:防火墙可以配置规则以封锁特定的网络端口和IP地址
- 实现NAT(网络地址转换)功能:NAT允许多个设备通过一个公共IP地址共享互联网连接,常用于节省IP地址资源和增加网络安全
- 共享上网:通过NAT功能,多个内部设备可以共享一个外部IP地址
- 地址隐匿:增加网络安全性,保护内部网络结构不暴露给外部
- 端口映射(端口转发):将外部请求转发到内部网络中指定的服务或设备上,允许外部访问内部服务器
- IP映射:将特定的内部IP地址映射到外部IP地址,常见于VPN和远程访问
防火墙的种类及其使用
硬件防火墙:整个企业的路口
- 三层路由器(提供防火墙功能):如H3C、华为、Cisco(思科)
- 专业的防火墙设备:如深信服、绿盟、奇安信、Juniper
软件防火墙
- 开源软件:在互联网中可以找到多种开源防火墙解决方案
- Linux内核中的iptables:iptables用于配置Linux内核中的Netfilter子系统,管理流量和数据包过滤
- firewalld(CentOS 7及以上):提供动态管理防火墙规则的方式
- nftables(CentOS 8及以上):是iptables的替代品,提供更多功能和更好的性能
- UFW (Uncomplicated Firewall):Ubuntu系统中提供的用户友好的防火墙工具,简化iptables配置
云防火墙
- 阿里云安全组:容许用户配置入口与出口流量的安全规则,可以封锁特定的IP地址和端口
- NAT网关:在云环境中实现共享上网及端口映射功能
- WAF(Web应用防火墙):专门针对HTTP/HTTPS流量的防火墙,用于保护应用程序免受各种攻击(如SQL注入、跨站脚本等)
- SQL注入攻击:需要阻挡包含“SELECT”、“UNION”等关键字的请求
- 跨站脚本(XSS):需要检测并阻断包含可能的脚本标签的请求
防火墙有关名词
容器(Container)
- 定义:逻辑单元,用于存放和管理网络流量和规则。
- 功能:将流量和规则进行分组,便于管理
表(Table)
- 定义:存放不同类型链的基本结构。
- 主要类型:
- filter:用于包过滤。
- nat:处理网络地址转换。
- mangle:修改数据包特性。
- raw:原始数据包处理。
链(Chain)
- 定义:存储具体访问控制规则的序列。
- 主要类型:
- INPUT:处理进入设备的数据包。
- OUTPUT:处理离开设备的数据包。
- FORWARD:处理转发的数据包。
规则(policy)
- 定义:定义条件和动作,决定如何处理数据包。
- 组成:
- 匹配条件:源IP、目标IP、协议、端口等。
- 动作:如ACCEPT(允许)、REJECT(拒绝)、DROP(丢弃)
iptables执行过程

# 1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的 # 2. 如果匹配成功规则,即明确表示是拒绝(DROP)还是接收(ACCEPT),数据包就不再向下匹配新的规则 # 3. 则均未匹配时,最终由默认规则决定数据包的处理方式 # 4. 防火墙的默认规则是所有规则都匹配完才会匹配
四表五链条⭐⭐⭐⭐⭐
链
PREROUTING:在数据包进行路径选择之前所要应用的链(防火墙刚刚接收到数据包的时候)
FORWARD:将数据包从一个网络转发到另一个网络的过程中所需要使用的链
POSTROUTING:在数据包进行路径选择之后所要应用的链(防火墙在即将将数据包转发出去前的时候)
INPUT:数据包进入防火墙所要应用的链
OUTPUT:数据包离开防火墙所要应用的链
表
- 优先级:raw > mangle > nat > filter
- filter表:过滤数据包
- INPUT
- OUTPUT
- FORWARD
- nat表:修改数据包中的ip和端口
- PREROUTING
- POSTROUTING
- OUTPUT
- mangle表:修改数据包的报文( ttl TOS )
- PREROUTING
- FORWARD
- POSTROUTING
- INPUT
- OUTPUT
- raw表:确定是否对数据包进行状态跟踪
- OUTPUT
- PREROUTING

https://blog.csdn.net/Axic123/article/details/130717675#2_25
防火墙的使用
环境准备
安装iptables防火墙
[root@m01 ~]# yum install -y iptables-services [root@m01 ~]# rpm -ql iptables-services # 防火墙配置文件 /etc/sysconfig/ip6tables /etc/sysconfig/iptables # 防火墙服务配置文件(命令) systemctl start iptables /usr/lib/systemd/system/ip6tables.service /usr/lib/systemd/system/iptables.service [root@m01 ~]# rpm -ql iptables # iptables主命令行工具,通常用于创建、修改、删除和查看防火墙规则 /usr/sbin/iptables # 用于将当前的 iptables 规则保存到标准输出,通常用于备份或将规则导出到文件 /usr/sbin/iptables-save # 从文件中读取 iptables 规则并加载到内核中,恢复先前保存的防火墙配置 /usr/sbin/iptables-restore
防火墙模块加载到内核中
# 需要永久生效,写入开机自启动文件/etc/rc.local modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state [root@m01 ~]# systemctl start iptables.service [root@m01 ~]# systemctl enable iptables.service
lsmod:显示当前加载的内核模块的信息
输出格式
- Module:模块的名称。
- Size:模块占用的内存大小(以字节为单位)。
- Used by:显示正在使用此模块的其他模块或驱动程序的数量,及其名称
[root@m01 ~]# lsmod |egrep 'filter|nat|ipt' nf_nat_ftp 12809 0 nf_conntrack_ftp 18478 1 nf_nat_ftp iptable_nat 12875 0 nf_nat_ipv4 14115 1 iptable_nat nf_nat 26583 2 nf_nat_ftp,nf_nat_ipv4 nf_conntrack 139264 6 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4 iptable_filter 12810 0 ip_tables 27126 2 iptable_filter,iptable_nat libcrc32c 12644 3 xfs,nf_nat,nf_conntrack
iptables命令参数⭐⭐⭐⭐⭐

语法:iptables [-t table] command [链名] [条件匹配] [-j 处理动作]
- -t table:用来指明要操作的表是哪个,不指定时默认为filter表
- command参数:增删改查规则的操作,针对规则有以下参数
- -A:追加一条规则,默认放到该链的最后
- -I:在指定的位置插入规则,不指定位置默认在链的最上面插入。比如
iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT,在INPU链的第二个位置插入规则 - -L:显示表中的所有规则
- n:只显示 IP 地址和端口号码,不显示域名和服务名称(静止反向解析)
- v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
- x:在 v 的基础上,禁止自动单位换算(K、M)
- --line-number:可以查看到规则序列号,在结合 -D 删除具体第几条规则时很有用
- -D:从规则列表中删除规则
- -P:设置某条链的默认规则
- -F:清空规则
- -X:删除用户自定义链
- -Z:将指定链的所有计数器归零
- 条件匹配参数
- -i:匹配数据进入的网络接口,主要应用于nat表,如:
-i eth0,匹配从网卡eth0流入的数据包 - -o:匹配数据流出的网络接口,如:
-o eth0匹配从网卡eth0流出的数据包 - -m:指定模块(multiport)
- -s:匹配源地址,可以是IP、网段、域名、也可以为空表示任何地址
- -d:匹配目标地址
- -p:匹配协议类型,如TCP、UDP、ICMP等
- --sport:匹配源端口;可以是单个端口,也可以是端口范围,当指定端口时,需要使用-p指定协议,否则会出错
- --dport:匹配目的端口
- -i:匹配数据进入的网络接口,主要应用于nat表,如:
- 处理动作
- -j ACCEPT:允许数据包通过本链而不拦截它
- -j DROP:丢弃数据包;阻止数据包通过改链,并且没有消息返回给客户端
- -j DNAT:目的地址转换,支持转换为单IP,也支持转换到IP地址池
- -j REJECT:拒绝数据包,会给客户端发送一个数据包被丢弃的响应信息
配置filter表规则⭐⭐⭐⭐⭐
禁止访问22端口
# 拒绝用户访问22端口 [root@m01 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP # 测试 [root@web01 ~]# nmap -p 22 10.0.0.61 22 PORT STATE SERVICE 22/tcp filtered ssh [root@web01 ~]# telnet 10.0.0.61 22 telnet: connect to address 10.0.0.61: Connection refused # 查看规则并加上序号 [root@m01 ~]# iptables -nL -t filter --line-number # 删除规则 [root@m01 ~]# iptables -t filter -D INPUT 6 # 根据序号删除
封ip,屏蔽某个ip⭐⭐⭐
[root@m01 ~]# iptables -A INPUT -s 10.0.0.7 -j DROP [root@web02 ~]# ping 10.0.0.61 # 可以ping通 [root@web01 ~]# ping 10.0.0.61 # 不可以ping通
禁止网段连入(禁止10.0.0.0/24网段访问8888端口)⭐⭐⭐
[root@m01 ~]# iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8888 -j DROP [root@web01 ~]# nmap -p 22 10.0.0.61 PORT STATE SERVICE 22/tcp open ssh [root@web01 ~]# nmap -p 8888 10.0.0.61 PORT STATE SERVICE 8888/tcp filtered sun-answerbook
只允许指定的网段连入(允许10.0.0.0/24)⭐⭐⭐
# 方法1:利用 ! 进行排除 [root@m01 ~]# iptables -I INPUT ! -s 10.0.0.0/24 -j DROP # 方法2:修改链默认规则 [root@m01 ~]# iptables -I INPUT -s 10.0.0.0/24 -j ACCEPT [root@m01 ~]# iptables -P INPUT DROP
指定多个端口⭐
[root@m01 ~]# iptables -I INPUT -m multiport -p tcp --dport 80,443 -j DROP [root@m01 ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 [root@web01 ~]# nmap -p 80 10.0.0.61 PORT STATE SERVICE 80/tcp filtered http [root@web01 ~]# nmap -p 88 10.0.0.61 PORT STATE SERVICE 88/tcp closed kerberos-sec # 如果是连续的端口,可以不加上-m multiport(1024:65535) [root@m01 ~]# iptables -I INPUT -p tcp --dport 1024:65535 -j DROP
匹配ICMP类型⭐
ICMP(Internet Control Message Protocol):Internet控制报文协议 ping
# 精简写法 [root@m01 ~]# iptables -t filter -I INPUT -p icmp -j DROP # 精确写法 [root@m01 ~]# iptables -t filter -I INPUT -p icmp --icmp-type 8 -j DROP # 通过内核参数控制禁止被ping [root@m01 ~]# cat /etc/sysctl.conf #/proc/sys/net/ipv4/icmp_echo_ignore_all #net网络 ipv4协议 icmp协议忽略所有 net.ipv4.icmp_echo_ignore_all = 1 [root@m01 ~]#sysctl -p # 生效
匹配网络状态(TCP/IP连接状态)⭐
- -m state --state 状态模块
- NEW:尚未建立的新的连接
- ESTABLISHED:已建立的连接
- RELATED:正在启动的新连接
- INVALID:非法或无法识别的
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
限制并发及速率⭐
-m limit 限制模块
# -m limit --limit n/{second/minute/hour} -m limit --limit 10/minute # 每分钟只能有10个数据包(每6秒生成一个) # --limit-burst [n] 在同一时间允许通过的请求数 -m limit --limit 10/minute --limit-burst 5
测试
[root@m01 ~]# iptables -F [root@m01 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT [root@m01 ~]# iptables -t filter -I INPUT -p tcp -j ACCEPT # 没有这行则断开xshell的ssh连接 [root@m01 ~]# iptables -P INPUT DROP
[root@web01 ~]# ping 10.0.0.61 PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data. 64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.190 ms 64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=0.355 ms 64 bytes from 10.0.0.61: icmp_seq=3 ttl=64 time=0.408 ms 64 bytes from 10.0.0.61: icmp_seq=4 ttl=64 time=0.388 ms 64 bytes from 10.0.0.61: icmp_seq=5 ttl=64 time=0.628 ms 64 bytes from 10.0.0.61: icmp_seq=7 ttl=64 time=0.407 ms # 7比1 间隔为6秒 64 bytes from 10.0.0.61: icmp_seq=13 ttl=64 time=0.377 ms # 7比13 间隔为6秒 64 bytes from 10.0.0.61: icmp_seq=19 ttl=64 time=0.374 ms # 13比19 间隔为6秒 64 bytes from 10.0.0.61: icmp_seq=25 ttl=64 time=0.410 ms # 19比25 间隔为6秒
防火墙规则的保护与恢复⭐⭐⭐⭐⭐
iptables-save 进行备份,默认输出到屏幕
iptables-restore 进行恢复,加上文件
写入到/etc/sysconfig/iptables
[root@m01 ~]# iptables-save # Generated by iptables-save v1.4.21 on Tue Apr 8 15:36:40 2025 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [98:10373] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT # Completed on Tue Apr 8 15:36:40 2025 [root@m01 ~]# iptables-save >/etc/sysconfig/iptables [root@m01 ~]# iptables-restore </etc/sysconfig/iptables
实际生产用法
- iptables配置方式
- 默认规则是 ACCEPT
- 默认规则是 DROP
- 实际生产使用 DROP 配置方式
允许ssh远程连接
[root@m01 ~]# iptables -F [root@m01 ~]# iptables -X [root@m01 ~]# iptables -Z [root@m01 ~]# iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT [root@m01 ~]# iptables -P INPUT DROP [root@m01 ~]# iptables -nL Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
设置本地回环接口通信规则
- lo:本地回环接口(localhost),是计算机网络中用于处理本地通信的一个虚拟接口
- 允许本地回环接口进出系统的数据流量的流入与流出
- 本地应用程序通信:应用程序通过回环接口通信,缺少规则会导致无法互通。
- 提高系统稳定性:确保本地服务正常接收和响应请求,增强系统稳定性。
[root@m01 ~]# iptables -t filter -A INPUT -i lo -j ACCEPT [root@m01 ~]# iptables -t filter -A OUTPUT -o lo -j ACCEPT
配置默认规则及放行80,443端口
[root@m01 ~]# iptables -t filter -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT [root@m01 ~]# iptables -t filter -A INPUT -s 10.0.0.0/24 -j ACCEPT [root@m01 ~]# iptables -t filter -A INPUT -s 172.16.1.0/24 -j ACCEPT [root@m01 ~]# iptables -t filter -P INPUT DROP [root@m01 ~]# iptables -t filter -P FORWARD ACCEPT [root@m01 ~]# iptables -t filter -P OUTPUT ACCEPT [root@m01 ~]# iptables-save >/yuan/iptables [root@m01 ~]# iptables -nL -t filter Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 ACCEPT all -- 10.0.0.0/24 0.0.0.0/0 ACCEPT all -- 172.16.1.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
NAT(网络地址转换)
- 共享上网
- 隐匿地址
- 端口映射
- IP映射
实现共享上网⭐⭐⭐⭐⭐

# 清除现有规则 iptables -F iptables -t nat -F # 设置NAT iptables -t nat -A POSTROUTING -s 172.16.1.24/24 -j MASQUERADE # 允许局域网内的机器访问互联网 iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -t nat -A POSTROUTING -s 172.16.1.7 -j SNAT --to-source 10.0.0.61 1. 指定nat表,配置POSTROUTING链 2. 源ip是172.16.1.7这台主机进行共享上网,如果是多台(-s 172.16.1.0/24) 3. 指定使用SNAT功能,源地址转换. 4. 通过SNAT功能把数据包中的源ip地址改为防火墙公网的ip地址. (10.0.0.61) 温馨提示: 如果公网ip不固定, -j SNAT --to-source 10.0.0.61 可以写为 -j MASQUERADE 伪装成公网ip
- 环境准备
| m01 | 配置共享上网规则 |
| web01 |
只保留eth1网卡,添加网关172.16.1.61(需要配置DNS) eth0网卡(ONBOOT=no) |
| web02 |
只保留eth1网卡,添加网关172.16.1.61(需要配置DNS) eth0网卡(ONBOOT=no) |
- 配置防火墙
- 配置防火墙规则,默认规则是准许
- 清空其它规则
- 配置防火墙共享上网规则
[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61 [root@m01 ~]# echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf [root@m01 ~]# sysctl -p net.ipv4.ip_forward = 1
实现端口转发⭐⭐⭐⭐⭐
端口映射(端口转发):将外部请求转发到内部网络中指定的服务或设备上,允许外部访问内部服务器

[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22 [root@m01 ~]# iptables -nL -t nat Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- 0.0.0.0/0 10.0.0.61 tcp dpt:9000 to:172.16.1.7:22 Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61

实现ip映射⭐
[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7
浙公网安备 33010602011771号