1. Netfileter
-
Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间中,集成在linux内核中
-
Netfilter是Linux2.4.x之后新一代的Linux防火墙机制,是Linux内核的一个子系统,Netfilter采用模块化设计,具有良好的可扩展性,提供扩展各种网络服务的结构化底层框架。Netfilter与IP协议栈是无缝契合,并允许对数据报进行过滤、地址转换、处理等操作。
-
命令过滤查看
root@ubuntu:~# grep -m 10 NETFILTER /boot/config-5.15.0-47-generic
CONFIG_NETFILTER=y
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=m
CONFIG_NETFILTER_INGRESS=y
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_FAMILY_BRIDGE=y
CONFIG_NETFILTER_FAMILY_ARP=y
CONFIG_NETFILTER_NETLINK_HOOK=m
CONFIG_NETFILTER_NETLINK_ACCT=m
CONFIG_NETFILTER_NETLINK_QUEUE=m
y 集成在内核
m 独立文件,一个模块
2. 防火墙工具介绍
2.1 iptables
- 由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好规则被送往netfilter,告诉内核如何处理信息包
# 查看版本
dpkg --list iptables
# 查看文件
dpkg --listfiles iptables
- 安装iptables的service包
- 只能决定是否启用定义好的iptables规则,并不代表没有netfileter功能。
- 启动关闭不影响服务,只影响自定义的防火墙规则
2.2 nftables
dpkg --list nftables
systemctl status nftables
2.3 netfilter中五个勾子函数和报文流向
- Netfilter在内核中选取五个hook(钩子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则
- PREROUTING:预路由
- INPUT:直到协议栈,进入到服务协议关卡,也就是服务,如http
- FORWARD:与 INPUT 相反,不经过服务,负责转发,NAT
- OUTPUT:出协议栈,出去服务协议关卡
- POSTROUTING:总出口
- 由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组在链(chain)上
- 三种报文流向
- 流入本机:PREROUTING ---> INPUT ---> 用户空间进程
- 流出本机:用户空间进程 ---> OUTPUT ---> POSTROUTING
- 转发:PREROUTING ---> FORWARD ---> POSTROUTING
3. iptables的组成
-
iptables由五个表table和五个链chain以及一些规则组成
-
链chain
- 内置链:每个内置链对应于一个钩子函数
- 自定义链:用于对内置链进行扩展或补充,可以实现更灵活的规则组织管理机制;只有Hook钩子调用自定义链时,才生效
-
五个内置链chain
INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
- 五个表table:filter、nat、mangle、raw、security
- filter:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表(访问控制)
- nat:network address translation 地址转换规则表
- mangle:修改数据标记规则表
- raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
- security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
- 优先级由高到底的顺序为:
security ---> raw ---> mangle ---> nat ---> filter
3.1 黑名单范例
- 表示没有明确拒绝的也接受
# 默认是 -t FILTER
# 拒绝一个地址
iptables -A INPUT -s 10.0.0.10 -j DROP
# 拒绝一段地址,可能会导致自身服务器也会连接不上服务器
iptables -A INPUT -s 10.0.0.0/24 -j REJECT
# 删除第二条规则
iptables -D INPUT 2
# 在第一条插入允许某一个地址可以访问
iptables -I INPUT -s 10.0.0.1 -j ACCEPT
# 先插入允许后再拒绝物理机也不会断开服务器连接
iptables -A INPUT -s 10.0.0.0/24 -j REJECT
# 删除多余规则
iptables -D INPUT 2
3.2 白名单范例
- 没有被明确允许的通通都拒绝
# 没有被明确允许的通通都拒绝,更改的这个参数为DROP就为白名单
iptables -P INPUT DROP
- 白名单全部拒绝后后面想要开放一些接口,则如下操作
-s --source 源IP地址或不连接连续的IP地址
-d --destination 目标IP地址或者不连接的IP地址
-p --protocol 指定协议,可使用数字加0(all)
protocol: tcp,udp,icmp,icmpv6,udplite,ah,sctp,mh or"all"
-i --in-interface 报文接入的"网卡设备"接口,只能应用于数据报文流入环节,只应用于INPUT、FORWARD、OREROUTING链
-o --out-interface 报文流出的接口,只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
- 允许网卡设备 lo 通过访问
iptables -I INPUT 2 -i lo -j ACCEPT
- 如果执行如下清空防火墙规则,则会导致全部断开连接,拒绝所有地址,因为白名单只允许添加ACCEPT的规则才允许通过。
# 清空所有规则
iptables -F
- 改回黑名单模式,原本DROP(白名单,拒绝所有),黑名单(ACCEPT,允许所有)
iptables -P INPUT ACCEPT
3.3 白名单推荐的创建方式
- 先允许,后全拒绝
# 允许本地Windows主机
iptables -A INPUT -s 10.0.0.1 -j ACCEPT
# 允许自身服务器
iptables -A INPUT -i lo -j ACCEPT
# 中间没有 -s -i 规则,表示全拒绝。全部拒绝
iptables -A INPUT -j REJECT
# 在第三条添加允许一个段可以访问,全部拒绝的规则变成第四条
iptables -I INPUT 3 -s 10.0.0.0/24 -j ACCEPT
# 控制icmp协议
iptables -I INPUT 3 -s 10.0.0.10 -p icmp -j REJECT
- 删除规则
- 删除INPUT表下的第三条记录规则
iptables -D INPUT 3
4. iptables扩展匹配条件
- 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效
- 扩展模块的查看帮助:man iptables-extensions
- 扩展匹配条件
- 隐式扩展
- 显示扩展
4.1 隐式扩展
4.1.2 tcp扩展
- tcp协议的扩展选项
--source-port, --sport port[:port],匹配报文源端口,可为端口选项连接范围
--destnation--port, --dport portp[:port],匹配报文目标端口,可为连接范围
--tcp-flags mask comp
mask: 需检查的标志位列表,用 , 分割,例如 SYN,ACK,FIN,RST
comp: 在mask列表中必须为的标志为列表,无指定则必须为0,用 , 分割tcp协议的扩展选项
- 范例
# 在第三条规则插入一条拒绝目标服务器80端口
iptables -I INPUT 3 -s 10.0.0.100 -p tcp --dport 80 -j REJECT
iptables -I INPUT 3 -s 10.0.0.100 -p tcp --dport 3306 -j REJECT
- udp 协议扩展选项
--source-port, --sport port[:port],匹配报文源端口,可为端口选项连接范围
--destnation--port, --dport portp[:port],匹配报文目标端口,可为连接范围
4.1.3 icmp协议的扩展选项
--icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp应答
8/0 echo-request icmp请求
- 实现一边通,一边拒绝的效果
- 拒绝请求包
- 应答包可以,添加规则这边可以通,没有添加的不能通
# 8 是请求允许,方法一,推荐
iptables -A INPUT -s 10.0.0.100 -p icmp --icmp-type 8 -j REJECT
# 方法二
iptables -A OUTPUT -d 10.0.0.100 -p icmp --icmp-type 0 -j REJECT
# 删除这条规则,测试请求允许
iptables -D INPUT 3
iptables -D OUTPUT 3
# 0 是应答请求
iptables -A INPUT -s 10.0.0.100 -p icmp --icmp-type 0 -j REJECT
4.2 显示扩展
4.2.1 multiport扩展
- 以离散方式定义多端口匹配最多指定15个端口
# 指定多个源端口
--source-ports, --sports port[,port|,port:port]
# 指定多个目标端口
--destination-ports,--dports port[,port|,port:port]
# 多个源目标端
--ports port[,port|,port:port]
- 范例
# 清空之前的规则
iptables -F
# 拒绝 10.0.0.100 目标机器的 80 6379端口
iptables -A INPUT -s 10.0.0.100 -p tcp -m multiport --dports 80,6379 -j REJECT
4.2.2 iprange扩展
- 指明连续性的(但一般不是整个网络)IP地址范围
--src-range fromp[-to] 源IP地址范围
--dst-range frpmp[-to] 目标IP地址范围
- 范例
iptables -A INPUT -m iprange --src-range 10.0.0.1-10.0.0.7 -j DROP
4.2.3 mac扩展
- mac模块可以指明源MAC地址,适用于: PREROUTING, FORWARD, INPUT
- 属于链路层
--mac-source xx:xx:xx:xx:xx
- 范例
iptables -A INPUT -m mac --mac-source 00:0c:29:8c:32:61 -j REJECT
4.2.4 string扩展
- 对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp} 字符串匹配检测算法
bm: Boyer-Moore
kmp: Knuth-Pratt-Morris
--form offset 开始偏移
--to offset 结束偏移
--string pattern 要检测的字符串模式
--hex-string pattern 要检测字符串模式,16进制格式
- 范例
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "google" -j REJECT
4.2.5 time扩展
- PS: CentOS8 此模块有问题,而且是按照UTC时间来算的,也就是世界标准时间(date -u)
- 根据将报文到达的时间与指定的时间范围进行匹配
--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 内核时区(当地时间),不建议使用CentOS7版本以上系统默认UTC
注意: centos6不支持kerneltz,--localtz指定本地时区(默认)
- 范例
iptables -A INPUT -m time --timestart 6:00 --timestop 8:00 -j REJECT
4.2.6 connlimit扩展
- 根据客户端IP做并发连接数量匹配
- 可防止Dos(Denial if Service,拒绝服务)攻击
--connlimit-upto N 连接的数量小于等于N时匹配
--connlimit-above N 连接的数量大于N时匹配
- 范例
- 并发连接数量大于2个时全部拒绝
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT
4.2.7 limit扩展
- 基于收发报文的速率做匹配,令牌通过过滤器
- 作用于限流
--limit-burst number 前多少个包不限制
--limit [/second/minute/hourl/day]
- 范例
- 前五个包不限制,后面每十分钟不限制一次
iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -p icmp -j REJECT
4.2.8 state扩展
-
state扩展模块,可以根据 "连接追踪机制" 去检查连接的状态,较耗资源
-
conntrack机制:追踪本机上的请求和响应之间的关系
-
状态类型
- NEW:新发出请求,连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别第一次发出的请求。新请求,“新用户”
- ESTABLISHED:NEW状态之后,连接追踪信息中为其建立的条目失效之前期间内所进行的通信状态。老请求,”老用户“
- ELATED:新发起的但与已有连接相关的连接,如:ftp协议中的数据连接与命令连接之间的关系
- INVALID:无效的连接,如flag标记不正确
- UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
-
范例
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state NEW -j REJECT
cat /proc/net/nf_conntrack
# 连接跟踪能记录多少条,决定了这个state的最大值是多少。
cat /proc/sys/net/netfilter/nf_conntrack_max
# 这样能达到新的连接不能访问,但是本机没有影响,可以ping其它机器,我能连你,你不能连我
iptables -A INPUT -m state --state NEW -s 10.0.0.100 -j REJECT
标签:iptables,10.0,--,REJECT,INPUT,port
From: https://www.cnblogs.com/wsxier/p/17096950.html