netfiler(linux内核)
管理防火墙工具:
iptables firewalld nft ufw
三种报文流向
流入本机:PREROUTING --> INPUT-->用户空间进程
流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING
iptables
五个表 (Tables)
Filter 表
功能: 处理数据包的过滤,是默认的表。
常用链: INPUT, FORWARD, OUTPUT
描述: 主要用于允许或拒绝数据包。所有默认情况下没有指定表的规则都存储在此表中。
NAT 表
功能: 处理网络地址转换(NAT)。
常用链: PREROUTING, POSTROUTING, OUTPUT
描述: 主要用于修改数据包的源地址或目的地址,常用于端口转发和 IP 伪装(如 Source NAT 和 Destination NAT)。
Mangle 表
功能: 修改数据包内容。
常用链: PREROUTING, OUTPUT, INPUT, FORWARD, POSTROUTING
描述: 用于特定类型的数据包修改,如修改 TOS(Type of Service)和 TTL(Time to Live)等字段。
Raw 表
功能: 数据包跟踪状态的设置。
常用链: PREROUTING, OUTPUT
描述: 用于处理数据包跟踪,主要用于标记数据包不被跟踪(NOTRACK)。
Security 表
功能: 实现安全相关的包过滤。
常用链: INPUT, OUTPUT, FORWARD
描述: 提供安全上下文的过滤规则,如 SELinux 的相关规则。
五个链 (Chains)
INPUT 链
作用: 处理所有进入本地系统的数据包。
典型使用: 控制哪些入站流量被允许访问系统。
FORWARD 链
作用: 处理所有转发的数据包,即那些目标地址不是本地系统的数据包。
典型使用: 用于路由和网关配置,决定数据包是否被允许通过系统转发。
OUTPUT 链
作用: 处理本地系统生成并发送的数据包。
典型使用: 控制出站流量。
PREROUTING 链
作用: 处理所有在路由决策前到达的数据包。
典型使用: 通常用于 NAT 表,用于修改数据包的目的地址。
POSTROUTING 链
作用: 处理所有在路由决策后准备发送的数据包。
典型使用: 通常用于 NAT 表,用于修改数据包的源地址。
优先级
security -->raw-->mangle-->nat-->filter
iptables-save > /PATH/TO/SOME_RULES_FILE #保存规则
iptables-restore < /PATH/FROM/SOME_RULES_FILE 加载规则
选项
-A, --append:在指定链(chain)的末尾添加一个规则。-D, --delete:从指定链中删除一个规则。-I, --insert:在指定链的特定位置插入一个规则。-L, --list:列出指定链的所有规则。-F, --flush:清空指定链中的所有规则。-P, --policy:设置指定链的默认策略。-N, --new-chain:创建一个新的自定义链。-X, --delete-chain:删除一个自定义链。-E, --rename-chain:重命名一个自定义链。-P, --protocol:指定规则适用的协议。-s, --source:指定源 IP 地址或地址范围。-d, --destination:指定目标 IP 地址或地址范围。-p, --port:指定源或目标端口。-j, --jump:指定要执行的动作(跳转到另一个链或执行特定动作)。-i, --in-interface:指定数据包进入的网络接口。-o, --out-interface:指定数据包离开的网络接口。-m, --match:指定使用的匹配模块。-t, --table:指定要操作的表(filter、nat、mangle 等)。-v, --verbose:显示更详细的信息。-h, --help:显示帮助信息。
例子:
iptables -A INPUT -s 10.0.0.1 -j DROP #删除来自10.0.0.1的包
iptables -A INPUT -s 10.0.0.1 -j REJECT #拒绝来自10.0.0.1的包
iptables -A INPUT -s 10.0.0.1 -j ACCEPT #拒绝来自10.0.0.1的包
iptables -D INPUT 1 #删除第一条
iptables -R INPUT -d 10.0.0.1 -P icmp -j REJECT #不能使用icmp协议连接
规则管理
-A:append,追加
-I:insert, 插入,要指明插入至的规则编号,默认为第一条
-D:delete,删除
(1) 指明规则序号
(2) 指明规则本身
-R:replace,替换指定链上的指定规则编号
-F:flush,清空指定的规则链
-Z:zero,置零
iptables的每条规则都有两个计数器
(1) 匹配到的报文的个数
(2) 匹配到的所有报文的大小之和
动作
ACCEPT
DROP
REJECT:--reject-with:icmp-port-unreachable默认
RETURN:返回调用链
REDIRECT:端口重定向
LOG:记录日志,dmesg
MARK:做防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE:地址伪装
自定义链
优化:
1.优先放行已建立连接
#在规则链的开头,放行所有状态为 ESTABLISHED 的入站和出站连接,提高效率。
2.谨慎放行新入站请求
3.限制特殊目的的访问
#在放行规则之前,添加拒绝规则以限制特定访问
4.特定规则放在前面
#同类规则中,匹配范围小的规则(如特定 IP)放在前面。
5.不同类规则中匹配范围大的放前面
#对不同类规则,匹配范围大的规则放在前面。
6.合并相似规则
#将多个可以用一条规则描述的规则合并,减少规则数量。
7.设置默认策略为白名单方式
#通过在规则链最后设置默认策略为白名单方式,仅放行特定连接。
规则保存
sudo iptables-save > /etc/iptables/ruules_1
规则恢复
cento6
规则覆盖保存至/etc/sysconfig/iptables文件中
cento7及以上
iptables-restore < /etc/iptables/ruules_1
扩展模块
隐式扩展(不需要写模块而是选项)
tcp 协议的扩展选项
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口连续范围
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为连续范围
[!] --tcp-flags mask comp
mask 需检查的标志位列表,用,分隔 , 例如 SYN,ACK,FIN,RST
comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔tcp协议的扩展选项
例子:
--tcp-flags SYN,ACK,FIN,RST SYN #表示要检查的标志位为SYN,ACK,FIN,RST四个,其中
SYN必须为1,余下的必须为0,第一次握手
--tcp-flags SYN,ACK,FIN,RST SYN,ACK #第二次握手
udp 协议的扩展选项
[!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围
[!] --destination-port,--dport port[:port]:匹配报文的目标端口或端口范围
**icmp扩展 **
[!] --icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp应答
8/0 echo-request icmp请求
显示扩展
multiport扩展
多端口号
例子:
iptables -R INPUT 1 -p tcp -m multiport --dports 22,80 -j ACCEPT
iprange扩展
ip范围
例子:
iptables -A INPUT -m iprange --src-range 10.0.0.6-10.0.0.10 -j ACCEPT
mac扩展
mac地址(不需要目标地址,因为目标不是自己则抛弃)
例子:
iptables -A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT
string扩展
字符串匹配
--algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset 开始偏移
--to offset 结束偏移
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern 要检测字符串模式,16进制格式
例子:
iptables -A OUTPUT -p tcp --sport 80 -m string --algo kmp --from 62 --string "google" -j REJECT #出去带有google拒绝
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 分别表示星期一到星期日
--kerneltz:内核时区(当地时间),不建议使用,CentOS 7版本以上系统默认为 UTC
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
connlimit扩展
连接数
--connlimit-upto N #连接的数量小于等于N时匹配
--connlimit-above N #连接的数量大于N时匹配
例子:
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT
limit扩展
报文控制(比如限制能接收多少个包)
例子:
iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
state扩展
/proc/net/nf_conntrack
根据状态匹配
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发
出的请求
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信
状态
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关
系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
例子:
jiptables -A INPUT -m state --state ESTABLISHED -J ACCEPT
iptables -A INPUT -m state --state NEW -J REJECT
#先将所以用户都可以进入,然后拒绝新用户
Target
自定义链, ACCEPT, DROP, REJECT,RETURN,LOG,SNAT,DNAT,REDIRECT,MASQUERADE
LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则前,并将日志记录在/var/log/messages系
统日志中
--log-level level 级别: debug,info,notice, warning, error, crit, alert,emerg
--log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符
例子:
iptables -I INPUT -s 10.0.0.0/24 -p tcp -m multiport --dports
80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections:"
#直接记录再日志上
NAT 的类型
NAT 有多个类型,最常见的包括:
SNAT(Source NAT):
修改数据包的源地址。通常用于内部网络的设备访问外部网络时,将私有 IP 地址转换为公共 IP 地址。
主要用于出站流量。
DNAT(Destination NAT):
修改数据包的目标地址。通常用于外部网络的设备访问内部网络时,将公共 IP 地址转换为内部私有 IP 地址。
主要用于入站流量。
MASQUERADE:
是 SNAT 的一种特殊形式,主要用于动态分配的公共 IP 地址(如通过 DHCP 获取的 IP 地址)。
适合于那些 IP 地址可能变化的场景。
PAT(Port Address Translation),也叫 Overloading:
一种特殊的 SNAT,它不仅转换源地址,还转换源端口。多个内部设备可以通过一个公共 IP 地址访问外部网络,每个连接使用不同的源端口。
SNAT+DNAT
公网访问内网:NAT通过将自己的端口映射到内网主机的端口,当公网ip访问NAT端口时,则NAT转换到内网ip地址的方式通信
内网访问公网:内网通过端口通过NAT,NAT转换其他端口和自己的ip,让自己的ip和端口去访问公网
自定义链
iptables --N ssh_chain
iptables -A ssh_chain -p tcp --dport 22 -j ACCEPT
引用:
iptables -A INPUT -s 10.0.0.111 -j ssh_chain
#!/bin/bash# 清空所有内置链的规则
sudo iptables -F# 删除所有用户定义的链
sudo iptables -X# 清除所有链的计数器(可选)
sudo iptables -Z# 将所有内置链的默认策略设置为 ACCEPT
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPTecho "iptables 规则已清空并重置"