官网:https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
防火墙种类及说明
网络防火墙(工作在 OSI 3-4 层)
技术原理:基于IP 地址、端口号、协议类型等网络层 / 传输层信息进行过滤,部分支持 “状态检测”(跟踪 TCP 连接状态)。例如,通过规则 “允许 192.168.1.0/24 网段访问 80 端口” 来控制流量。
典型产品:
硬件:H3C、华为、Cisco(思科)的传统防火墙,如 Cisco ASA、华为 USG 系列;
软件:Linux 的
iptables(底层工作在 4 层,通过内核规则过滤流量)、firewalld(基于iptables封装)。
防护能力:可拦截基于 IP / 端口的攻击(如端口扫描、SYN 洪水),但无法识别应用层内容,对 SQL 注入、XSS 等 Web 攻击无能为力。
七层应用防火墙(工作在 OSI 7 层)
技术原理:通过 深度包检测(DPI) 解析应用层协议(如 HTTP、FTP)的内容,识别并拦截恶意行为(如 SQL 注入语句、恶意文件上传)。例如,检测 HTTP 请求中是否包含
' OR 1=1等 SQL 注入特征。典型产品:
硬件 / 软件:深信服 AF 系列、奇安信 NGFW、阿里云 WAF(Web 应用防火墙);
云服务:阿里云 “安全组 + WAF”、AWS WAF 等。
防护能力:专注于应用层攻击防御,可拦截 SQL 注入、XSS、CC 攻击等,还能识别恶意文件、控制应用行为(如限制某款即时通讯软件的文件传输功能)。
两者对比
四表五链
表(table)是对功能的分类,如防火墙功能(filter 表)、共享上网和端口转发(nat 表)。
链是对数据流进行处理,需使用不同的链,如数据流入(INPUT)、数据流出(OUTPUT)。
iptables 是 4 表 5 链。
4 表:filter 表(默认)、nat 表、raw 表、mangle 表。
5 链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。
iptables 执行过程
顺序匹配:按照规则配置的顺序从上到下、从前到后层层过滤数据包。
匹配即止:若数据包匹配到某条明确指定 “拒绝(DROP)” 或 “接收(ACCEPT)” 的规则,就不再向下匹配其他规则。
默认兜底:若未匹配到任何明确规则,会继续向下匹配,直到匹配默认规则以确定是阻止还是通过。
默认规则最后匹配:默认规则在所有规则都匹配完后才会被匹配。
安装与使用:iptables [-t 表名] 命令选项 [链名] [匹配条件] [-j 动作]
表名:默认是 filter 表,可指定 nat、mangle、raw(如
-t nat)。命令选项:对规则的操作(增删改查等)。
链名:如 INPUT、FORWARD、PREROUTING 等。
匹配条件:指定数据包的特征(如协议、端口、IP 等)。
动作:如 ACCEPT、DROP、DNAT 等。
安装
#安装:
yum -y install iptables-services
rpm -ql iptables
/etc/sysconfig/iptables #配置文件
/etc/sysconfig/iptables-config
/usr/bin/iptables-xml
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service #服务配置文件(systemctl命令)
/usr/sbin/iptables #iptables命令
/usr/sbin/iptables-apply
/usr/sbin/iptables-restore #恢复
/usr/sbin/iptables-save #规则保存
#防火墙相关模块,加载到内核中(写入到开机自启动)
cat >>/etc/rc.d/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
赋予权限:chmod +x /etc/rc.d/rc.local
内核转发:vim /etc/sysctl.conf
net.ipv4.ip_forward=1
生效:sysctl -p
启动并开机自器:systemctl enable --now iptables.service
#检查是否加载防火墙iptables 模块
[root@m01 ~]# lsmod |egrep 'filter|nat|ipt'
nf_nat_ftp 12770 0
nf_conntrack_ftp 18638 1 nf_nat_ftp
iptable_nat 12875 0
nf_nat_ipv4 14115 1 iptable_nat
nf_nat 26787 2 nf_nat_ftp,nf_nat_ipv4
nf_conntrack 133053 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
重启后规则会丢失,规则持久化:service iptables save
使用
应用:
filter 表
#查看所有规则
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- !172.16.1.0/24 0.0.0.0/0 icmptype 8
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
#清空规则
iptables -F
#禁止访问22端口
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
#查看规则并加上序号
iptables -nL --line-num
#删除规则
iptables -t filter -D INPUT 1 #根据序号删除
#屏蔽某个ip
iptables -I INPUT -s 10.0.0.7 -j DROP
#禁止网段连入【拒绝10.0.0.0网段的22端口连入】
iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
#只允许指定网段【只允许172.16.1.0网段连入】
iptables -I INPUT !-s 172.16.1.0/24 -j DROP
#修改默认规则【默认拒绝所有】
iptables -t filter -P INPUT DROP
#允许指定网段【允许172.16.1.0网段连入】
iptables -t filter -I INPUT -s 172.16.1.0/24 -j ACCEPT
#禁ping【全面限制,丢弃所有来源的ICMP数据包】
iptables -t filter -I INPUT -p icmp -j DROP
#禁ping【精确限制:只阻止外部 ping 请求,不影响其他 ICMP 功能】
iptables -t filter -I INPUT -p icmp -icmp-type 8 -j DROP
#拒绝所有tcp连入8080端口
iptables -I INPUT -p tcp --dport 8080 -j DROP
#禁止所有tcp连入多个端口
iptables -I INPUT -m multiport -p tcp --dport 80,443 -j DROP
#在同一时间内允许通过的请求“n”
#场景:如果有人对你的服务器进行 “ping 洪水攻击”(短时间发大量 ping 包),
这条规则会生效 —— 前 5 个 ping 包会被允许通过,
之后每分钟只允许再通过 10 个,
多余的 ping 包会被后续规则(或链的默认策略)处理(比如丢弃),
从而避免服务器因 ping 攻击占用过多资源。
iptables -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 ACCEPT
#这条命令的作用是:在 INPUT 链开头插入一条规则,限制外部对本机的 ICMP 协议(主要是 ping 请求)访问 —— 每分钟最多允许 10 个包,且突发情况下最多一次性接收 5 个包,匹配的包直接允许通过
iptables-save >>/etc/sysconfig/iptables
systemctl restart iptables #重新生效
iptables-restore </etc/sysconfig/iptables
# 清空所有表的规则
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X # 删除自定义链
# 设置默认策略
iptables -P INPUT DROP # 入站默认拒绝
iptables -P FORWARD DROP # 转发默认拒绝
iptables -P OUTPUT ACCEPT # 出站默认允许
#本机内部进程间通信依赖回环接口,必须放行:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#确保已有连接的后续流量能正常通信(如 SSH 连接后的数据交互):
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许内网(指定网段)连入
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
#仅放行内网对特定业务端口的访问(更安全)
#允许内网访问SSH
iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 22 -j ACCEPT
#允许内网访问HTTP/HTTPS
iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 443 -j ACCEPT
保存规则(避免重启后丢失)
1.CentOS/RHEL:
service iptables save
2.Debian/Ubuntu(需安装 iptables-persistent):
apt install iptables-persistent
netfilter-persistent savenat 表
共享上网、端口转发/端口映射
m01:防火墙、做共享上网
db02:演示机、内网,利用防火墙做网关实现共享上网
#db02配置:
将ens33网卡禁掉,修改ens34网卡网关
[root@db02 ~]# ifdown ens33
[root@db02 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens34
DEVICE=ens34
ONBOOT=yes
IPADDR=172.16.1.52
PREFIX=24
GATEWAY=172.16.1.61
DNS1=223.5.5.5
DNS2=223.6.6.6
[root@db02 ~]# ifdown ens34 && ifup ens34
[root@db02 ~]# ping jd.com
卡住...
#m01配置:
iptables -t nat -A POSTROUTING -s 172.16.1.52 -j SNAT --to-source 10.0.0.61
1 指定 nat 表,配置 POSTROUTING 链 明确操作的表和链
2 -s 源ip:被共享网络的主机,172.16.1.7 单台主机或 172.16.1.0/24 网段多台主机进行共享上网 按需选择单台(-s 172.16.1.7)或网段(-s 172.16.1.0/24)
3 指定使用 SNAT 功能,进行源地址转换 确定地址转换的类型
4 通过 SNAT 功能把数据包中的源 ip 地址改为防火墙公网 ip 地址(10.0.0.61) 明确转换后的目标源 IP
如果m01公网IP不固定:iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
#此时db02:
[root@db02 ~]# ping jd.com
PING jd.com (111.13.149.108) 56(84) bytes of data.
64 bytes from 111.13.149.108 (111.13.149.108): icmp_seq=1 ttl=128 time=22.1 ms
64 bytes from 111.13.149.108 (111.13.149.108): icmp_seq=2 ttl=128 time=21.0 ms
#m01取消共享上网:
[root@m01 ~]# iptables -t nat -nL POSTROUTING --line-numbers
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 SNAT all -- 172.16.1.52 0.0.0.0/0 to:10.0.0.61
[root@m01 ~]# iptables -t nat -D POSTROUTING 1
[root@m01 ~]# iptables -t nat -nL POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
[root@m01 ~]# #端口转发-----------------------------------------------------------
#m01
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.52:22
[root@m01 ~]# iptables -t nat -nL --line-num
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 DNAT tcp -- 0.0.0.0/0 10.0.0.61 tcp dpt:9000 to:172.16.1.52:22
#用git连接测试
FAN@LAPTOP-DP0GUIH5 MINGW64 ~
$ ssh -p 9000 root@10.0.0.61
The authenticity of host '[10.0.0.61]:9000 ([10.0.0.61]:9000)' can't be established.
ED25519 key fingerprint is SHA256:PIY0T4bcMSXLVynQMHntpE+xbI1dxXAn/VWutoDl3S8.
This host key is known by the following other names/addresses:
~/.ssh/known_hosts:13: 10.0.0.7
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[10.0.0.61]:9000' (ED25519) to the list of known hosts.
Authorized users only. All activities may be monitored and reported.
root@10.0.0.61's password:
Authorized users only. All activities may be monitored and reported.
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Fri Nov 7 17:36:23 2025
[root@db02 ~]#
#后续删除:[root@m01 ~]# iptables -t nat -D PREROUTING 1
#IP映射-----------------------------------------------------------
#就是将端口转发的命令,去掉端口就是IP映射
#对所有协议、所有端口,将目标IP为10.0.0.61的流量转发到172.16.1.52
iptables -t nat -A PREROUTING -d 10.0.0.61 -j DNAT --to-destination 172.16.1.52
此时是单向IP映射,连接可以到达但是返回不了
#对从172.16.1.52发出的流量,将源IP改为10.0.0.61(公网IP)
iptables -t nat -A POSTROUTING -s 172.16.1.52 -j SNAT --to-source 10.0.0.61
#双向映射配置完毕,流量有去有回
#用git连接测试
[root@db02 ~]# telnet 10.0.0.61 22
Trying 10.0.0.61...
Connected to 10.0.0.61.
Escape character is '^]'.
SSH-2.0-OpenSSH_8.2
Invalid SSH identification string.
Connection closed by foreign host.
[root@db02 ~]#
#成功
iptables 企业面试题
1、详述iptales工作流程以及规则过滤顺序?
2、iptables有几个表以及每个表有几个链?
3、iptables的几个表以及每个表对应链的作用,对应企业应用场景?
4、画图讲解iptables包过滤经过不同表和链简易流程图并阐述。
5、请写出查看iptables当前所有规则的命令。
6、禁止来自10.0.0.188 ip地址访问80端口的请求
7、如何使在命令行执行的iptables规则永久生效?
8、实现把访问10.0.0.3:80的请求转到172.16.1.17:80
9、实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网。
10、描述tcp 3次握手及四次断开过程?
(课外参考:http://user.qzone.qq.com/49000448/blog/1426987479)
11.详细描述HTTP工作原理?
12.请描述iptables的常见生产应用场景。
13、请描述下面iptables命令的作用
iptables -N syn-flood
iptables -A INPUT -i eth0 -syn -j syn-flood
iptables -A syn-flood -m limit -limit 5000/s -limit-burst 200 -j RETURN
iptables -A syn-flood -j DROP14、企业WEB应用较大并发场景如何优化iptables?
15、写一个防火墙配置脚本,只允许远程主机访问本机的80端口(参考来源:奇虎360面试题http://user.qzone.qq.com/49000448/blog/1429755081)
16、请描述如何配置一个linux上网网关?
17、请描述如何配置一个专业的安全的WEB服务器主机防火墙?
18、企业实战题6:请用至少两种方法实现!
写一个脚本解决DOS攻击生产案例
提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。防火墙命令为:iptables -A INPUT -s 10.0.1.10 -j DROP。
19、/var/log/messages日志出现kernel: nf_conntrack: table full, dropping packet.请问是什么原因导致的?如何解决?
一、选择题
rule permit ip source 210.78.1.1 0.0.255.255 destination202.38.5.2 0.0.0.0 的含义是()
A. 允许主机210.78.1.1访问主机202.38.5.2
B. 允许210.78.0.0的网络访问202.38.0.0的网络
C. 允许主机202.38.5.2访问网络210.78.0.0
D. 允许210.78.0.0的网络访问主机202.38.5.2
在防火墙上允许tcp和udp端口21、23、25访问内网,下列那张协议包可以进来 (多选)
A. SMTP
B. STP
C. FTP
D. Telnet
E. HTTP
F. POP3
以下不属于防火墙能够实现的功能是( ).
A.网络地址转换
B.差错控制
C.数据包过滤
D.数据转发
1.1.1.4 哪个不属于iptables的表
A. filter
B. nat
C. mangle
D. INPUT
1.1.1.5 以下对防火墙的描述正确的是:()
A. 完全阻隔了网络
B. 能在物理层隔绝网络
C. 仅允许合法的通讯
D. 无法阻隔黑客的侵入
二、填空题
防火墙是设置在被保护网络和外部网络之间的一道屏障,以防止破坏性侵入()
1.1.2.2 在CentOS7下,我想关闭掉防火墙,应该用命令_______来关闭掉。如果以后开机都不想它启动起来,执行___________命令
1.1.2.3 在CentOS7配置ip转发需要在__________里加入__________执行___命令后生效
三、简答题
防火墙策略,开放服务器 80 端口,禁止来自 10.0.0.188 的地址访问服务器 80 端口的请求
防火墙策略,实现把访问 10.0.0.3:80 的请求转到 172.16.1.17:8080 上
防火墙策略配置说明。阐述 10.10.10.1 访问 192.168.1.1 所有端口策略需要的配置过程
iptables 知识考察,根据要求写出防火墙规则
屏蔽 192.168.1.5 访问本机 dns 服务端口
允许 10.1.1.0/24 访问本机的 udp 8888 9999 端口
iptables 禁止 10.10.10.1 访问本地 80 端口
如何利用 iptables 屏蔽某个 IP 对 80 端口的访问
写出 iptables 四表五链,按照优先级排序
如何通过 iptables 将本地 80 端口的请求转发到 8080 端口,当前主机 IP 为 192.168.2.1
写一条命令,只允许 80 端口,其他端口都拒绝,eth1 网卡 ip 为 192.168.1.12
限制连接到 192.168.100.100:8080 后端服务最大 1000
简述防火墙的基本功能和特点
内网环境中,A(10.0.0.1)机与 B(10.0.0.2)机互通,在 A 机建立安全策略禁止 B 机访问 A 机 SSH 服务(22 端口)的方法及操作
service iptables stop 与 iptables -F 有何区别
Iptables 封禁 eth0 网卡与 192.168.1.1 通讯的所有数据包
Iptables 禁止所有到本机(eth0:10.10.10.200)22 端口的 TCP 访问
禁止 192.168.500.2 访问本机 ssh 端口;解释规则:/sbin/iptables -t nat -A PREROUTING -d 192.168.20.99/32 -p udp -m udp --dport 99 -j DNAT --to-destination 192.168.20.11
主机内网 IP:10.4.82.200,公网 IP:118.186.111.121,使 10.4.82.0/24 网段以该主机为跳板机出网的配置方法
配置跳板机主机的某个内核参数,并使其生效
配置跳板机的 iptables 防火墙规则
把 10.10.0.0 网段流出的数据的原地址修改为 66.66.66.66
本机有 eth0 和 eth1 网卡,仅允许从 eth0 访问本机 80 端口,允许 eth1 所有访问的 iptables 规则
评论交流
欢迎留下你的想法