Linux防火墙-Netfilter和iptables
文章目录
一: 防火墙概述
防火墙(FireWall ) :隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则做检查,并在匹配某规则时由规则定义的行为进行处理的一组功能组件,基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略,会将希望外网访问的主机放在DMZ(demilitarized zone)网络中.

二:Netfilter

Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在linux内核中。
Netfilter是Linux2.4.x之后新一代的Linux防火墙机制,是linux内核的一个子系统。Netfilter采用模块化设计,具有良好的可扩充性,提供扩展各种网络服务的结构化底层框架。Netfilter与IP协议栈是无缝契合,并允许对数据报进行过滤、地址转换、处理等操作。
官方帮助文档:https://netfilter.org/documentation/
netfilter五个勾子函数
Netfilter在内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则,规则由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上。
三种报文流向
三种报文流向
1.流入本机: PREROUTING --> INPUT --> 用户空间进程
2.流出本机: 用户空间进程 --> OUTPUT --> POSTROUTING
3.转发: PREROUTING --> FORWARD --> POSTROUTING
三:iptables的组成
前面提到用户可以通过一个命令工具(iptables)向Netfilter写入规则, 也就是说iptables是一个提供命令行的工具,它工作在用户空间,用来编写规则,写好的规则被送到netfilter,告诉内核如何去处理信息包。
[root@centos8 ~]# rpm -qi iptables
Name : iptables
Version : 1.8.4
Release : 17.el8
Architecture: x86_64
Install Date: Sun 12 Nov 2023 10:28:15 AM CST
Group : Unspecified
Size : 1989969
License : GPLv2 and Artistic 2.0 and ISC
Signature : RSA/SHA256, Fri 29 Jan 2021 06:10:36 AM CST, Key ID 05b555b38483c65d
Source RPM : iptables-1.8.4-17.el8.src.rpm
Build Date : Fri 29 Jan 2021 01:05:26 AM CST
Build Host : x86-01.mbox.centos.org
Relocations : (not relocatable)
Packager : CentOS Buildsys <bugs@centos.org>
Vendor : CentOS
URL : http://www.netfilter.org/projects/iptables
Summary : Tools for managing Linux kernel packet filtering capabilities
Description :
The iptables utility controls the network packet filtering code in the
Linux kernel. If you need to set up firewalls and/or IP masquerading,
you should either install nftables or this package.
Note: This package contains the nftables-based variants of iptables and
ip6tables, which are drop-in replacements of the legacy tools.

iptables由五个表table和五个链chain以及一些规则组成
五表table
五个表table: filter、nat、mangle、raw、security
filter: 过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表
nat: network address translation地址转换规则表
mangle: 修改数据标记位规则表
raw: 关闭启用的连接跟踪机制,加快封包穿越防火墙速度
security: 用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现优
man iptables
优先级由高到低的顺序为:
security --> raw --> mangle --> nat --> filter
1. filter
filter 表:
- 功能: 过滤数据包,是最常用的表。决定是放行(ACCEPT)还是丢弃(DROP)数据包。
- 优先级: 主要在处理流量的最后阶段。
- 可用链: INPUT, FORWARD, OUTPUT
2. nat
nat 表:
功能: 网络地址转换(Network Address Translation),如 SNAT, DNAT, MASQUERADE。
优先级: 在 mangle 之后,但路由决策之前。
可用链: PREROUTING(DNAT), OUTPUT(DNAT), POSTROUTING(SNAT)注意:INPUT 链上很少用于 nat,FORWARD 链上不能做 nat。
3. mangle
mangle 表:
- 功能: 拆解、修改数据包(TOS/TTL等)或给数据包打标记(–set-mark)。
- 优先级: 很高,用于特殊的数据包修改。
- 可用链: 所有五链(PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING)
4. raw
raw 表:
- 功能: connection tracking(连接跟踪),决定是否对数据包进行状态跟踪。
- 优先级:最高,在其他表之前处理。
- 可用链: PREROUTING, OUTPUT
5. security
security 表:
- 功能: 用于强制访问控制(MAC)网络规则,例如 SELinux。
- 优先级: 在 filter 表之后。
- 可用链: INPUT, FORWARD, OUTPUT
注意:这个表日常使用较少。
iptables -vnL -t filter
root@zabbix-server:~# iptables -vnL -t filter
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
iptables -vnL -t nat
[root@centos8 ~]# iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
iptables -vnL -t mangle
[root@centos8 ~]# iptables -vnL -t mangle
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
iptables -vnL -t raw
[root@centos8 ~]# iptables -vnL -t raw
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
iptables -vnL -t security
[root@centos8 ~]# iptables -vnL -t security
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
五链chain
链chain
内置链:每个内置链对应于一个钩子函数
自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有Hook钩子调用自定义链时,才生效
五个内置链chain: INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING
1.PREROUTING: 用于在数据包刚进入网络接口时处理,主要用于修改数据包的目标地址。
2.INPUT: 用于处理进入本机的流量。
3.FORWARD: 用于处理经过本机但不进入本机的流量(转发流量)。
4.OUTPUT: 用于处理从本机发送出去的流量。
5.POSTROUTING: 用于在数据包即将离开本机网络接口时处理,主要用于修改数据包的源地址。
表和链的对应关系
数据包过滤匹配流程
内核中数据包的传输过程
1.当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
2.如果数据包是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。
本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出
3.如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出
城堡的五表五链
为了更直观地理解 iptables 的五表(Tables)和五链(Chains),我们可以将 iptables 规则管理系统比作一座城堡的安保系统。城堡代表你的Linux服务器,而外部的网络世界则是各种访客和数据流。
城堡的五表
五表(Tables)—— 城堡中的不同安保部门
每一个表都可以看作是城堡安保系统中的一个特定部门,每个部门负责不同的安全任务:
filter表:门口安保部
这个部门负责审查所有进入城堡的人,决定他们是否允许进入。这是最常用的表,是城堡的主要入口检查点,是城堡的大门。
nat表:前台问询部
这个部门负责处理访客的导向和转发,比如重新指引访客到不同的入口。
它负责改变“目的地”,就像当一个访客到达错误的入口时被重定向到正确的入口。
mangle表:包装部
这个部门负责修改访客的随身物品(数据包头部),确保它们符合城堡的规章制度。比如,某些物品可能需要重新打包或标记。
raw表:直通部门
这个部门有权决定某些访客是否应该绕过某些检查点(连接跟踪),以便更快速地进入城堡。
security表:安全标签部
这个部门为进入城堡的访客贴上特定的安全标签,以便在城堡内部进行进一步的处理和访问控制。
城堡的五链
五链(Chains)—— 安保部门的检查点
每个链可以看作是城堡安保系统中某个部门内的一个具体检查点,检查的具体执行人,处理特定的情况或流程:
INPUT链:
城堡入口——这个检查点负责检查所有进入城堡的访客。任何进入城堡的访客都必须通过这个检查点。
OUTPUT链:
城堡出口——这个检查点负责检查所有离开城堡的访客。任何离开的访客都要经过这里的安检。
FORWARD链:
内部通道——这个检查点负责处理那些并不直接访问城堡内部,而是通过城堡作为中转站的访客。
它决定是否允许他们通过城堡转发到其他地方。
PREROUTING链:
门口的导引牌——这个检查点位于所有入口之前,负责对访客进行初步的引导或重定向,
比如将访客指向正确的入口(用在NAT中)。
POSTROUTING链:
出口的导引牌——这个检查点在访客即将离开城堡时进行最终的引导或修改,确保他们走的是正确的路(用在NAT中)。
游客参观城堡流程
想象一位游客(数据包),试图进入你的城堡(服务器)参观:
城堡参观流程
PREROUTING(门口的导引牌):
访客一到达城堡外围,就看到导引牌,它就会提示访客去另一个入口(NAT重定向),或者直接放行到主入口。
INPUT(主入口):
访客到达城堡的大门,这里是主要的安检点,安保人员检查访客的身份(IP地址、端口等),决定是否允许他们进入。
如果通过,他们进入城堡内部(服务器)。
FORWARD(内部通道):
有些访客只是想穿过城堡到另一个地方(转发的流量),而不是访问城堡本身。
这些访客会经过内部通道检查点,确保他们是合法的并且被允许转发。
OUTPUT(城堡出口):
访客完成了在城堡中的任务,现在他们准备离开。出口的安保人员检查他们是否符合离开条件,并允许他们通过。
POSTROUTING(出口的导引牌):
访客快要离开城堡时,最后的导引牌会确保他们被正确地引导到目的地。
四:iptables规则
iptables 规则结构基础
一个典型的 iptables 规则结构如下 👇
iptables -t <表名> -A <链名> [匹配条件] -j <动作>
参数说明:
| 参数 | 说明 |
|---|---|
-t <表名> |
指定表(如 filter、nat、mangle 等),默认是 filter |
-A <链名> |
在链(chain)末尾追加规则(也可以用 -I 插入到开头) |
[匹配条件] |
对数据包的匹配条件(如协议、端口、IP等) |
-j <动作> |
匹配后执行的动作(如 ACCEPT、DROP、REJECT、LOG、SNAT、DNAT 等) |
规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理,规则在链接上的次序即为其检查时的生效次序。
匹配条件: 默认为与条件,同时满足
基本匹配: IP,端口,TCP的Flags (SYN,ACK等)
扩展匹配: 通过复杂高级功能匹配
处理动作: 称为target,跳转目标
·内建处理动作: ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG...
·自定义处理动作:自定义chain,利用分类管理复杂情形
规则要添加在链上,才生效;添加在自定义链上不会自动生效
白名单: 只有指定的特定主机可以访问,其它全拒绝
黑名单: 只有指定的特定主机拒绝访问,其它全允许,默认方式
iptables规则添加时考量点
iptables规则添加时考量点
1.要实现哪种功能:判断添加在哪张表上
2.报文流经的路径:判断添加在哪个链上
3.报文的流向:判断源和目的
4.匹配规则:业务需要
实验:控制一些主机,谁可以访问谁不能访问
1.实验环境准备
[root@centos8 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
关闭firewalld,并不是就此关闭掉了linux的防火墙,而是关掉系统默认的防火墙规则,系统默认的防火墙规则不能满足我们自己的需求,于是我们自定义防火墙规则。
2.iptables命令格式详解:
iptables -t filter -A INPUT -s 192.169.10.1 -j DROP
# -t 表示使用的那个表 默认使用的filter,可以不加
# -A 表示append,追加规则,有前后次序
# INPUT 表示INPUT链
# -s 表示source源地址,哪个源地址的请求
# -j 表示jump,跳跃
# DROP 表示删除或抛弃
3.拒绝某个服务器ping
当前152可以ping通148
配置148拒绝152的ping
iptables -A INPUT -s 192.168.10.152 -j DROP


此时可以在148上抓包看看
tcpdump -i ens33 -nn icmp
# ubuntu安装tcpdump
apt install -y tcpdump

可以查看148上配置的规则
iptables -vnL

当我删除iptables的配置规则后,152和148就有去有回了
iptables -D INPUT -s 192.168.10.152 -j DROP

iptables用法说明

iptables命令格式详解
iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table
-t table:指定表
raw, mangle, nat, [filter]默认
SUBCOMMAND 子命令
链管理类:
链管理类:
-N: new,自定义一条新的规则链
-E: 重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除-x: delete,删除自定义的空的规则链
-P: Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受,DROP:丢弃
查看类
-L: list,列出指定上的所有规则,本选项须置后
-n: numberic,以数字格式显示地址和端口号
-v: verbose,详细信息
-vv更详细
-x: exactly,显示计数器结果的精确值,而非单位转换后的易读值
--line-numbers: 显示规则的序号
-s selected,以iptables-save命令格式显示链上规则
常用组合:
-vnL
-vvnxL --line-numbers
规则管理类
-A: append,追加
-I: insert,插入,要指明插入至的规则编号,默认为第一条
-D: delete,删除
(1)指明规则序号
(2)指明规则本身
-R: replace,替换指定链上的指定规则编号
-F: flush,清空指定的规则链
-Z: zero,置零
iptables的每条规则都有两个计数器
(1)匹配到的报文的个数
(2)匹配到的所有报文的大小之和
chain
PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
匹配条件
匹配条件
基本:通用的,PARAMETERS
扩展:需加载模块,MATCH EXTENTIONS
处理动作
-j targetname [per-target-options]
简单动作:
ACCEPT
DROP
扩展动作:
REJECT: --reject-with:icmp-port-unreachab1e默认
RETURN: 返回调用链
REDIRECT: 端口重定向
LOG:记录日志,dmesg
MARK: 做防火墙标记
DNAT: 目标地址转换
SNAT: 源地址转换
MASQUERADE: 地址伪装自定义链
五: iptables匹配条件
基本匹配
基本匹配条件,无需加载模块,由iptables/netfilter自行提供
-s,--source address[/mask][,...]: 源IP地址或者不连续的IP地址
-d,--destination address[/mask][,...]: 目标工P地址或者不连续的IP地址
-p,--protocol protocol: 指定协议,可使用数字如0 (all)
protocol: tcp,udp,icmp,icmpv6,udplite,esp,ah,sctp,mh
or "all"参看:/etc/protocols
-i,--in-interface name: 报文流入的接口;
只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
-o,--out-interface name: 报文流出的接口;
只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、 POSTROUTING链
扩展匹配
扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效扩展模块的
查看帮助: man iptables-extensions
扩展匹配条件:
隐式扩展
显式扩展
隐式扩展
iptables在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块。
tcp协议的扩展选项
[! ] --source-port,--sport port[:port]: 匹配报文源端口,可为端口连续范围
[! ] --destination-port,--dport port[: port]: 匹配报文目标端口,可为连续范围
[! ] --tcp-flags maskcomp
mask 需检查的标志位列表,用,分隔,例如SYN ,ACK,FIN ,RST
comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔tcp协议的扩展选项
udp协议的扩展选项
[! ] --source-port,--sport port[: port]:匹配报文的源端口或端口范围
[! ] --destination-port, --dport port[: port]:匹配报文的目标端口或端口范围
显示扩展
显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块。
[-m matchname [per-match-options]]
multiport扩展
指定多个源端口
[!] --source-ports, --sports port[, port|, port:port] ...
指定多个目标端口
[!] --destination-ports ,--dports port[, port|,port:port] ...
多个源或目标端
[!] --ports port[, port|, port: port]...
time扩展
根据将报文到达的时间与指定的时间范围进行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm [:ss] 时间
--timestop hh:mm[:ss]
[! ]--monthdays day[, day . . .] 每个月的几号
[! ]--weekdays day[, day. . .] 星期几,1-7分别表示星期一到星期日
--kerne1tz:内核时区(当地时间),不建议使用,centos 7版本以上系统默认为 UTC
注意:centos6不支持kerneltz , --loca1tz指定本地时区(默认)
[root@centos8 ~]#rpm -ql iptables |grep time
/usr/lib64/xtables/libxt_time.so
[root@centos8 ~]#iptables -A INPUT -m time --timestart 12:30 --timestop 13:30 -j ACCEPT
iptables v1.8.4 (nf_tables): couldn 't load match 'time': No such file ordi rectory
[root@centos7 ~]#iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays sat, sun --kerneltz -j DROP
limit扩展
基于收发报文的速率做匹配,令牌桶过滤器
--limit-burst number 前多少个包不限制
--limit [/second|/minute|/hour|/day]
iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit10/minute --limit-burst 5 -j ACCEPT
iptables -I INPUT 2 -p icmp -j REJECT
state扩展
state扩展模块,可以根据"连接追踪机制“去检查连接的状态,较耗资源
conntrack机制: 追踪本机上的请求和响应之间的关系
状态类型:
NEW: 新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED: NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED: 新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
INVALID: 无效的连接,如flag标记不正确
UNTRACKED: 未进行追踪的连接,如: raw表中关闭追踪
六:iptables 常用参数整理
1. 基本结构
iptables [表选择] [命令] [链名] [匹配条件] [动作]
基本结构
- 表选择:-t filter、-t nat、-t mangle、-t raw 👉 不写时默认 filter 表。
- 命令:操作规则的指令(见下面)。
- 链名:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING 等。
- 匹配条件:如 -s、-p、–dport。
- 动作:ACCEPT、DROP、REJECT、SNAT、DNAT、LOG 等。
2. 常用命令参数
| 参数 | 释义 | 示例 |
|---|---|---|
-A |
append,追加规则到链尾 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
-I |
insert,插入到链头(或指定序号) | iptables -I INPUT 1 -p icmp -j ACCEPT |
-D |
delete,删除规则(可用序号或完整规则) | iptables -D INPUT 2 |
-R |
replace,替换某条规则 | iptables -R INPUT 3 -p tcp --dport 22 -j DROP |
-L |
list,列出规则 | iptables -L -n -v |
-F |
flush,清空链 | iptables -F INPUT |
-Z |
zero,清零计数器 | iptables -Z |
-P |
policy,设置链的默认策略 | iptables -P INPUT DROP |
-N |
new,新建用户自定义链 | iptables -N LOG_DROP |
-X |
delete chain,删除自定义链 | iptables -X LOG_DROP |
-E |
rename chain,重命名自定义链 | iptables -E OLD NEW |
3. 匹配条件参数
3.1 IP地址相关
| 参数 | 释义 | 示例 |
|---|---|---|
-s |
源地址(source) | iptables -A INPUT -s 192.168.1.10 -j DROP |
-d |
目标地址(destination) | iptables -A OUTPUT -d 8.8.8.8 -j ACCEPT |
-i |
输入接口(in-interface) | iptables -A INPUT -i eth0 -j ACCEPT |
-o |
输出接口(out-interface) | iptables -A OUTPUT -o eth1 -j ACCEPT |
3.2 协议与端口
| 参数 | 释义 | 示例 |
|---|---|---|
-p |
指定协议(tcp/udp/icmp/…) | iptables -A INPUT -p icmp -j ACCEPT |
--sport |
源端口 | iptables -A INPUT -p tcp --sport 80 -j ACCEPT |
--dport |
目标端口 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
-m multiport --dports |
多端口匹配 | iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT |
3.3 连接状态(需要 -m conntrack 或 -m state)
| 参数 | 释义 | 示例 |
|---|---|---|
--ctstate |
匹配连接状态(NEW/ESTABLISHED/RELATED/INVALID) | iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
3.4 其他常用模块
| 参数 | 释义 | 示例 |
|---|---|---|
-m limit --limit 5/min |
限制日志或规则触发频率 | iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "DROP:" |
-m mac --mac-source |
按 MAC 地址匹配 | iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j ACCEPT |
-m set --match-set |
使用 ipset 匹配 IP 集合 | iptables -A INPUT -m set --match-set blacklist src -j DROP |
4. 动作
| 动作 | 释义 | 示例 |
|---|---|---|
ACCEPT |
允许通过 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
DROP |
丢弃(无响应) | iptables -A INPUT -s 1.2.3.4 -j DROP |
REJECT |
拒绝(发 ICMP/错误信息) | iptables -A INPUT -p tcp --dport 23 -j REJECT |
LOG |
记录日志 | iptables -A INPUT -j LOG --log-prefix "DROP:" |
SNAT |
源地址转换(需在 nat 表) | iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.5 |
MASQUERADE |
动态源地址转换(适合动态 IP) | iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE |
DNAT |
目标地址转换 | iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 |
REDIRECT |
重定向到本机 | iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 |
MARK |
给数据包打标记(mangle 表) | iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1 |
组合示例
1. 场景 1:限制 SSH 登录,只允许特定 IP
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.10 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
2. 场景 2:Web 服务器常规规则
iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
3. 场景 3:NAT 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
七:写规则思路
-
1.先想链,再定表: 先问自己“我想在哪个环节(链)处理数据包?”,再决定“我想实现什么功能(用哪个表)?”。
-
想过滤包? -> 用 filter 表 -> 作用于 INPUT/FORWARD/OUTPUT 链。
-
想做端口转发或IP映射? -> 用 nat 表 -> PREROUTING (DNAT) 或 POSTROUTING (SNAT)。
-
想修改包内容或打标记? -> 用 mangle 表 -> 几乎所有链都可以。
-
-
2.常用组合
- 保护服务器本身: 主要在 filter 表的 INPUT 链上写规则。
- 配置路由器: 主要在 filter 表的 FORWARD 链和 nat 表的 POSTROUTING 链上写规则。
- 做端口映射: 在 nat 表的 PREROUTING 链上写 DNAT 规则。
-
3.查看命令: 使用 sudo iptables -t [表名] -L -v -n 来查看特定表的规则。不加 -t 参数默认查看 filter 表。
写规则口诀:
写规则口诀:
表定功能链定向;
匹配条件有范围;
动作才会有结果。
执行顺序口诀:
raw → mangle → nat → filter
PREROUTING → INPUT/FORWARD → OUTPUT → POSTROUTING
八:iptables常见面试题
1.什么是 iptables?它的主要用途是什么?
iptables 是一个用户空间的命令行工具,用于配置Linux内核的防火墙规则。它允许管理员定义网络流量的处理方式,包括允许、拒绝、重定向、记录等。
iptables主要用于以下几个目的:
1.数据包过滤:控制进入、离开和通过系统的网络数据包。
2.网络地址转换(NAT):修改网络数据包的源地址或目标地址。
3.连接跟踪:跟踪每个连接的状态,以便可以应用基于状态的规则。
2.描述 iptables 的表和链的概念?
iptables 使用表和链来组织防火墙规则:
表是规则的集合,用于不同目的(如 filter 表用于包过滤,nat 表用于网络地址转换)。
链是规则的有序列表(如 INPUT、OUTPUT、FORWARD)。
表(Table):表是规则的集合,用于不同的用途。iptables 主要有五个表:
filter:默认表,用于定义基本的包过滤规则。
nat:用于网络地址转换(如源地址或目标地址的转换)。
mangle:用于修改数据包头部的信息。
raw:用于配置连接跟踪相关的规则。
security:
链(Chain):链是规则的有序列表。当数据包到达时,会按照链中的规则依次检查。每个表有多个预定义的链:
INPUT:处理入站流量。
OUTPUT:处理出站流量。
FORWARD:处理转发的流量(通常用于路由)。
PREROUTING:在数据包路由前处理(常用于NAT)。
POSTROUTING:在数据包路由后处理(常用于NAT)。
3.如何查看当前系统中配置的 iptables 规则?
iptables -vnL
#-vnL是一个组合命令选项,单独执行-v或-n会报错
--list -L [chain [rulenum]] List the rules in a chain or all chains
--numeric -n numeric output of addresses and ports
--verbose -v verbose mode
这个命令显示所有链中的规则,包括每个规则匹配的数据包数和字节数。-v 选项显示详细信息,-n 选项避免DNS解析以提高显示速度。

4.如何配置一个规则来拒绝特定IP地址的所有入站流量?
可以使用以下命令拒绝来自特定IP地址(例如 192.168.1.100)的所有入站流量:
iptables -A INPUT -s 192.168.1.100 -j DROP
-A INPUT: 在 INPUT 链的末尾添加规则。
-s 192.168.1.100: 指定源IP地址。
-j DROP: 表示拒绝数据包。
5.什么是 iptables 中的状态匹配?如何使用它来仅允许已建立的连接?
iptables 支持基于连接状态的匹配,这些状态包括
NEW(新连接)、
ESTABLISHED(已建立连接)、
RELATED(相关连接)、
INVALID(无效连接)。
可以使用 -m state 匹配模块和 --state 选项来指定连接状态。
例如,仅允许已建立的连接通过:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-m state: 使用状态匹配模块。
--state ESTABLISHED,RELATED: 匹配已建立或相关的连接。
-j ACCEPT: 接受这些数据包。
6.如何使用 iptables 实现端口转发?
例如,将所有到达端口80的请求转发到端口8080。
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
-t nat: 指定使用 nat 表。
-A PREROUTING: 在PREROUTING 链中添加规则。
-p tcp: 匹配TCP协议。
--dport 80: 匹配目标端口80。
-j REDIRECT: 重定向数据包。
--to-port 8080: 重定向到端口8080。
8. 如何删除 iptables 中的特定规则?
可以使用 -D 选项删除规则。规则可以通过规则号或者精确匹配来删除。
通过规则号删除:
使用 iptables -L --line-numbers 命令查看规则号。
sudo iptables -D INPUT <rule_number>
通过精确匹配删除:
sudo iptables -D INPUT -s 192.168.1.100 -j DROP
9.如何清空所有 iptables 规则?
sudo iptables -F
此外,还可以使用 -X 删除自定义链,使用 -Z 重置计数器。
10.如何在 iptables 中限制每秒连接请求的速率?
可以使用 iptables 的 limit 模块来限制连接请求的速率。
例如,限制到达端口22(SSH)的连接请求为每秒5个:
sudo iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/sec -j ACCEPT
-m limit: 使用限制匹配模块。
--limit 5/sec: 限制速率为每秒5个。
-j ACCEPT: 接受这些数据包。
更多推荐
所有评论(0)