这是我参与更文挑战的第 11 天,活动详情查看:更文挑战安全
一名致力于在技术道路上的终身学习者、实践者、分享者,一位忙起来又偶尔偷懒的原创博主,一个偶尔无聊又偶尔幽默的少年。服务器
微信搜索 【杰哥的IT之旅】 关注这个有一点点东西的少年。微信
原文连接:iptables 防火墙(一)- 四表/五链、数据包匹配流程、编写 iptables 规则markdown
Linux防火墙
主要工做在网络层,针对 TCP/IP
数据包实施过滤和限制,典型的包过滤防火墙,基于内核编码实现,具备很是稳定的性能和高效率。网络
iptables
:用来管理 Linux 防火墙的命令程序,位于/sbin/iptables
目录下,属于用户空间
的防火墙管理体系。ssh
netfilter:Linux
内核中实现包过滤防火墙的内部结构,通常不以程序
或文件
的形式存在,属于内核空间
的防火墙管理体系。tcp
iptables 的做用
:为包过滤机制的实现提供规则,经过各类不一样的规则,来告诉netfilter
对来自某些源以及前往某些目的或具备某些协议特征的数据包是如何进行处理的。oop
每一个规则表
,其实就至关于一个内核空间的容器,按照规则集
的不一样用途进行划分为默认的四个表,在每一个规则表
中包含不一样的规则链
,处理数据包的不一样时机分为五种链
,决定是否过滤或处理数据包的各类规则并按照前后顺序存放在各规则链
中。post
规则的做用:对数据包进行过滤或处理;性能
链的做用:容纳多种防火墙规则;
iptables
管理着四个不一样的规则表,分别由独立的内核模块实现。
filter 表
:用来对数据包进行过滤,具体的规则要求决定如何处理一个数据包。
对应的内核模块为:iptable_filter
,其表内包括三个链:input
、forward
、output
;
nat 表
:nat 全称:network address translation 网络地址转换,主要用来修改数据包的 IP 地址、端口号信息
。
对应的内核模块为:iptable_nat
,其表内包括三个链:prerouting
、postrouting
、output
;
mangle 表
:主要用来修改数据包的服务类型
,生存周期
,为数据包设置标记,实现流量整形、策略路由等。
对应的内核模块为:iptable_mangle
,其表内包括五个链:prerouting
、postrouting
、input
、output
、forward
;
raw 表
:主要用来决定是否对数据包进行状态跟踪。
对应的内核模块为:iptable_raw
,其表内包括两个链:output
、prerouting
;
input 链
:当收到访问防火墙本机地址的数据包时,将应用此链中的规则;
output 链
:当防火墙本机向外发送数据包时,将应用此链中的规则;
forward 链
:当收到须要经过防火中转发给其余地址的数据包时,将应用此链中的规则;
prerouting 链
:在对数据包作路由选择以前,将应用此链中的规则;
postrouting 链
:在对数据包作路由选择以后,将应用此链中的规则;
input 链 和 output 链主要用在主机型防火墙,是针对服务器本机进行保护的防火墙;
forward 链、prerouting 链、postrouting 链主要用在网络型防火墙,是针对公司内网与 Internet 之间进行安全控制。
当数据包到达防火墙时,若是对应的链内有规则存在,将按照顺序依次从raw 表
→mangle 表
→nat 表
→filter 表
。
入数据流向
:若是是外边的数据包到达防火墙后,要先经过prerouting 链
:对数据包作路由选择以后,将应用此链中的规则,而后将进行路由选择,确认数据包的目标地址是不是防火墙本机,结合内核传送给input
链作处理,确认经过以后,即可以交给服务器端来进行响应。
转发数据流向
:若是是外边的数据包到达防火墙后,要先经过prerouting 链
作相关处理,随后进行路由选择,数据包的目标地址是任何其余地址的话,则将经过内核传给forward
来进行处理是否须要经过或直接丢弃,最后将交给postrouting 链
来查看是否有须要修改的数据包信息来进行处理。
出数据流向
:出流量,其实就是防火墙本机向外的地址发送数据包,首先被output 链
处理,而后选择路由,而后在postrouting 链
查看是否修改数据包的信息来进行处理。
数据包通过每条规则链时,将按照第一条规则、第二条规则……的顺序进行匹配和处理。
将按照从匹配到中止
的方式,如找到一条匹配的规则,将再也不执行本链中后续的其余规则;
若是对比整个链也找不到与数据包相匹配的规则时,将按照该规则链的默认策略进行处理;
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
复制代码
表名
、链名
:指定iptables
命令所操做的表
和链
,未指定表名时将默认使用filter
表;
管理选项
:表示iptables
规则的操做方式,好比:插入
、增长
、删除
、查看
等;
匹配条件
:指定要处理的数据包的特征,不符合指定条件的数据包不在处理;
控制类型
:指数据包的处理方式,好比:容许
、拒绝
、丢弃
等;
accept
:容许数据包;
drop
:丢弃数据包,且不给任何回应信息;
reject
:拒绝数据包,必要时会给数据发送端一个响应信息;
log
:在/var/log/messages
文件中记录日志信息,而后将数据包传递给下一个地址;
iptables 命令的经常使用管理选项
-A:在指定链的末尾添加一条新的规则
-D:删除指定链中的某一条规则,可删除指定序号或具体内容
-I:在指定链中插入一条新规则,未指定序号时默认做为第一条规则
-R:修改、替换指定链中的某一条规则,可指定规则序号或具体内容
-L:列出指定链中全部的规则,未指定链名,则列出表中的全部链
-F:清空指定链中全部的规则,未指定链名,则清空表中的全部链
-P:设置指定链的默认策略
-n:使用数字形式显示输出结果
-v:查看规则列表时显示详细的信息
-h:查看命令帮助信息
--line-numbers:查看规则列表时,同时显示规则在链中的顺序好
复制代码
添加新的防火墙规则时,可以使用管理选项-A
:用来追加规则-l
:用来插入规则;
在filter 表 INPUT 链
的末尾添加一条规则,可以使用-p
协议名来作匹配条件;
# iptables -t filter -A INPUT -p tcp -j ACCEPT
复制代码
使用管理选项-I
,容许同时制定添加规则的顺序号,未指定序号时默认做为第一条规则;
添加两条规则分别位于filter
表的第一条、第二条,将使用默认的filter
表;
# iptables -I INPUT -p udp -j ACCEPT
# iptables -I INPUT 2 -p icmp -j ACCEPT
复制代码
查看防火墙规则时,需使用管理选项-L
并结合--line-numbers
选项显示各条规则在链内的顺序号;
查看filter 表 INPUT 链
中的全部规则,并显示规则序号;
# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
4 ACCEPT icmp -- anywhere anywhere
5 ACCEPT all -- anywhere anywhere
6 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
7 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
8 ACCEPT tcp -- anywhere anywhere
复制代码
防火墙规则多时,能够以数字形式显示地址和端口信息,减小地址解析的过程,加快命令的执行速度。
以数字形式查看默认表INPUT 链
中的全部规则,可结合参数-nL
或者拆分-n -L
的方式来操做;
# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
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
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
复制代码
删除filter 表 INPUT 链
中的第三条规则,可以使用管理选项-D
来删除一条防火墙规则;
# iptables -D INPUT 3
# iptables -n -L INPUT
复制代码
清空指定链或表中的全部防火墙规则,可以使用管理选项-F
;
# iptables -F INPUT
# iptables -n -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
复制代码
省略链名而清空指定表全部链的规则,可以使用管理选项-F
;
# iptables -F
# iptables -t nat -F
# iptables -t mangle -F
复制代码
默认策略的控制类型分为:accept
、drop
两种。
将filter 表
中的FORWARD 链
的默认策略设置为:丢弃,OUTPUT 链
的默认策略设置为:容许;
# iptables -t filter -P FROWARD DROP
# iptables -P OUTPUT ACCEPT
复制代码
通用匹配
:称为常规匹配,可独立使用,不依赖于其余条件或扩展模块。
编写规则时使用-p 协议名
的形式指定;
用来检查数据包所使用的网络协议,可用的协议类型文件位于:/etc/procotols
中。
# iptables -I INPUT -p icmp -j DROP
# iptables -A FORWARD ! -p icmp -j ACCEPT
复制代码
编写iptables
规则时使用-s 源地址
或-d 目标地址
的形式指定;
用来检查数据包的源地址或目标地址。(IP地址、网段地址)
比方说:若要拒绝转发源地址为 192.168.123.123 的数据,但容许转发源地址位于 192.168.1.0/24 网段的数据;
# iptables -A FORWARD -s 192.168.123.123 -j REJECT
# iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
复制代码
比方说:若要检测到来自某个网站的频繁扫描、登陆时,可添加防火墙规则进行封锁;
# iptables -I INPUT -s 192.168.123.0/24 -j DROP
# iptables -I FORWARD -s 192.168.123.0/24 -j DROP
复制代码
编写iptables
规则时使用-i 接口名
和-o 接口名
的形式指定;
用来检查数据包从防火墙的哪个接口进或出的,而且分别对应入站/出站网卡;
比方说:若要丢弃从外网接口访问防火墙本机且源地址为私有地址的数据包;
# iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
# iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
# iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
复制代码
隐含匹配
:以指定的协议匹配做为前提条件,对应的功能由iptables
在须要时自动隐含
载入内核。
常见的隐含匹配:端口匹配、TCP匹配、ICMP匹配;
编写iptables
规则时使用--sport 源端口
或者--dport 目标端口
的形式指定;
针对的协议类型为:TCP、UDP
用来检查数据包的源端口或目标端口。
单个端口号或者以冒号:
分隔的端口范围是能够接受的,但不连续的多个端口是不能够采用的。
比方说:容许为网段 192.168.123.0/24 转发 http 查询数据包;
# iptables -A FORWARD -s 192.168.123.0/24 -p udp --dport 80 -j ACCEPT
# iptables -A FORWARD -d 192.168.123.0/24 -p udp --dport 80 -j ACCEPT
复制代码
比方说:搭建 ftp 服务时,开放 20、21 端口,以及用于被动模式的端口范围为 24 100~25 200;
# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
# iptables -A INPUT -p tcp --dport 24100:25200 -j ACCEPT
复制代码
编写iptables
规则时使用--icmp-type ICMP 类型
的形式指定;
针对的协议:ICMP,用来检查 ICMP 数据包的类型。
ICMP 类型使用字符串或数字显示
echo-request
:8(ICMP 协议请求)
echo-reply
:0(ICMP 协议回显)
destination-unreachable
:3(ICMP 协议目标不可达)
比方说:若要禁止从其余主机 ping 本机,可是容许本机 ping 其余主机。
# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
# iptables -A INPUT -p icmp -j DROP
复制代码
更多可用的 ICMP 协议类型,可执行iptables -p icmp -h
进行查看;
该匹配方式须要有额外的内核模块提供支持,以-m 模块名称
的形式调用相应的模块,而后设置匹配条件。
常见的显示匹配:多端口匹配、IP 范围匹配、MAC 地址匹配、状态匹配;
编写iptables
规则时使用-m multiport --dports 端口列表
、-m multiport --sports 端口列表
的形式指定;
用来检查数据包的源端口、目标端口、多个端口之间以逗号进行分隔;
比方说:若要容许本机开放端口:80、44三、110 等等,提供相关服务;
# iptables -A INPUT -p tcp -m multiport --dport 80,443,110 -j ACCEPT
复制代码
编写iptables
规则时使用-m iprange --src-range IP 范围
、-m iprange --dst-range IP 范围
的形式指定;
用来检查数据包的源地址、目标地址;
IP 范围:起始地址-结束地址
的形式表示;
比方说:要禁止转发源 IP 地址位于 192.168.8.100 与 192.168.8.123 之间的 TCP 数据包;
# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.8.100-192.168.8.123 -j ACCEPT
复制代码
编写iptables
规则时使用-m mac --mac-source MAC 地址
的形式指定;
用来检查数据包的源 MAC 地址,只适用于内部网络;
比方说:要根据 MAC 地址封锁主机,禁止其访问本机的任何应用;
# iptables -A INPUT -m mac --mac-source MAC 地址 xxx -j DROP
复制代码
编写iptables
规则时使用-m state --state 链接状态
的形式指定;
基于iptables
的状态跟踪机制用来检查数据包的链接状态;
常见的链接状态包括:new(与任何链接无关)、established(响应请求或已创建链接)、related(与有链接相关性的);
比方说:要禁止转发与正常 TCP 链接无关的非 --syn 请求数据包;
# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
复制代码
只开放本机的 WEB 服务,但对发给本机的 TCP 数据包进行放行,其余入数据包丢弃;
# iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
# iptables -P INPUT DROP
复制代码
以上就是今天的所有内容了,从 Linux 防火墙基础、iptables 的表、链结构、数据包过滤的匹配流程、编写防火墙规则以及规则的匹配条件等内容;
原创不易,若是你以为这篇文章对你有点用的话,麻烦你为本文点个赞
、评论
或转发
一下,由于这将是我输出更多优质文章的动力,感谢!
咱们下期再见!