参考博客:https://www.cnblogs.com/whych/p/9147900.html
Linux
防火墙通常包含两部分,分别为iptables
和netfilter
。iptables
是管理防火墙的命令行工具,处于用户空间。netfilter
执行报文过滤,处于内核空间。
路由:及路由表不直接参与数据包的传输,而是生成一个指向表。这个指向表仅包含路由算法选择的数据传输优先路径
PREROUTING
: 在进行路由判断之前所要进行的规则
INPUT
:处理入站的数据包
OUTPUT
:处理出站的数据包
FORWARD
:处理转发的数据包
POSTROUTING
: 在进行路由判断之后所要进行的规则
iptables
中的表iptables
将规则写入,内核netfilter
执行报文过滤规则。
filter、nat、mangle、raw、security
filter
(过滤表)INPUT
输入链,处理目标地址为本机IP
地址的报文OUTPUT
输出链,处理本机地址产生的报文FORWARD
转发链,处理经过本机路由的报文nat
(网络地址转换表)nat
修改数据包中的源、目标IP地址或端口。PREROUTING
:修改到来的报文,只用来做网络地址转换OUTPUT
:用来修改本机产生的并且在路由处理之前的报文POSTROUTING
:用于修改准备出去的报文mangle
(修改表)PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING
raw
(原始表)ip_conntrack
之前调用。提供两个内置规则链。PREROUTING、OUTPUT
security
(用于安全Linux
的防火墙规则)规则的处理目标可以是用户定义的自定义链名,也可以是系统内置的四种处理方式
ACCEPT
(接收)表示让这个报文通过DROP
(丢弃)表示这个报文丢弃QUEUE
(入队)表示把这个报文传递到用户空间的队列中RETURN
(返回)表示停止这条规则的匹配。返回到调用这个规则的上一条规则链的规则处执行REJECT
(拒绝)REJECT
和DROP
一样丢弃报文,但是REJECT
的不同之处在与同时还向发送者返回一个ICMP
错误消息禁止访问80端口 iptables -A IPNUT -p tcp --dport 80 -j REJECT
DROP
与REJECT
的区别
DROP
不会回包,暴露信息少REJECT
每一条信息都会回一条ICMP
不可到达的报文。当有大量访问和攻击时,会导致占用所有带宽,有用的报文不可用(DOS
)DNAT
(目的网络地址转换)IP
。nat
表中的PREROUTING
和OUTPUT
链。将访问路由器的80端口的流量重定向到192.168.6.100 iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.6.100
这样Web
服务器就可以搭建在局域网的主机(192.168.6.100
)上对外提供服务。对外仅有路由器的IP
保留给用户。
SNAT
(源网络地址转换)IP
。nat
表的POSTROUTING
和INPUT
链。iptables -t nat -A POSTROUTING -s 192.168.6.0/24 -o eth0 -j SNAT --to-source 10.0.2.15
MASQUERADE
(伪装)MASQUERADE
作用和SNAT
是一样的。两者的区别是MASQUERADE
是不需要指定源地址的。MASQUERADE
只用于nat
表的POSTROUTING
链LOG
(开启内核记录)Linux
会通过printk
函数打印一些匹配包的信息,然后通过syslog
记录在日志中。--log-level : 日志级别 --log-prefix : prefix在记录log信息前加上特定前缀;最多14个字母 --log-tcp-sequence : 记录TCP序列号 --log-tcp-options : 记录TCP报文头部的选项 --log-ip-options : 记录IP报文头部的选项
REDIIECT
(修改目的IP
到机器自身)nat
表的PREROUTING
和OUTPUT
链IP
地址来发送报文到机器自身(本地生成的报文被设置为地址127.0.0.1
)--to-ports []
TCP
和UDP
iptable
有5
个表,每个表中又有几个不同的链,不同的表中有相同名称的规则链。但这些规则链处理的任务是不同的。报文按照预定的流程来顺序进入到各个规则链中,报文处理流程如下图。进入顺序是raw->mangle->filter->nat
流程
处理流程
IP
报文raw
表的PREROUTING
链。此时在报文连接跟着生效之前对报文进行处理。mangle
表的PREROUTING
链。这里是报文进入网关之后,路由之前修改报文的地方nat
表的PREROUTING
。在这里我们做目的地址转换(DNET
)。这里不能用于报文过滤,因为每一个连接数据流仅第一个报文进入到这里。mangle
和nat
表可能修改了报文的IP
地址信息。如果目的地址为网关,则直接进入到INPUT
链中,如果和本机地址不同,则进入路由转发。跳到步骤9mangle
表的INPUT
链。这里是报文进入网关时修改报文的地方。在这里不做报文过滤。filter
表的INPUT
链,这里是对收到报文做过滤的地方,然后将报文转到应用程序。mangle
表的FORWARD
链。这里对报文进行修改filter
表中的FORWARD
链。对转发报文进行过滤。mangle
表的POSTROUTING
链。这条链可能被两种报文遍历,一种是转发报文,另外就是本机产生的报文nat
表的POSTROUTING
链。在这里我们做源地址转换(SNAT
)这里不能用于报文过滤,因为每一个数据流仅有第一个报文进入到这里MAC
地址过滤MAC
地址过滤只对源MAC
地址有效丢弃指定MAC的报文 iptables -I INPUT -m mac --mac-source 28:D2:44:15:D5:A4 -j DROP
IP
层过滤IP
层匹配常用的有协议,源IP
和目的IP
-p
用于匹配IP
层报文协议。常见有TCP、UDP、IGMP、ICMP
。也可以是一个数字,数字代表的协议在文件/etc/protocols
描述。数字零表示所有协议。禁止UDP 5060报文 iptables -A FORWARD -p UDP --m udp dport 5060 -j DROP
-s
和-d
用于匹配IP
报文的源IP
和目的IP
禁止192.168.1.0网段访问本机 iptables -A INPUT -s 192.168.1.0/24 -j DROP
iptables [-t table] {-A|-C|-D} chain rule-specification rule-specification = [matches...] [target] match = -m matchname [per-match-options] target = -j targetname [per-target-options]
A
将防火墙规则添加到规则链的末尾D
删除指定规则链中的规则。I
插入到规则链中的指定位置。如果不指定插入位置则插入规则链的第一个位置L
查看防火墙规则。如果没有指定规则链,则显示所有规则链R
修改、替换.指定链中的某一条规则,可以按规则序号和内容替换E
重命名用户定义的链,不改变链本身F
清空防火墙规则。如果没有指定规则链,则清空所有链。清空filter表中的INPUT链规则 iptables -t filter -F INPUT
N
新建一条用户自己定义的规则链X
删除指定表中用户自定义的规则链X
删除规则链D
删除规则链中的规则F
清空P
设置指定链的默认策略。如果一个报文没有被任何规则匹配,那么默认策略就会命中,执行默认策略输入链为默认拒绝 iptables -P INPUT DROP
Z
将所有表的所有链的字节和数据包计数器清零n
使用数字形式显示输出结果v
查看规则表详细信息的信息V
查看版本h
获取帮助对于iptables
命令如果没有指定防火墙表就默认使用filter
表,所以查看网络地址转换规则使用iptables -t nat -L
对于复杂规则,我们通常会创建自定义规则链来进行匹配,并把自定义规则链加入到已有的规则链中。
iptables -N UDP_FILTER
iptables-save
和iptables-restore
处理大规则集。把规则存入一个与标准脚本代码只有细微差别的特殊格式文件中,或者从中恢复规则。
iptables-save
iptables
规则到标准输出(屏幕
)中。我们使用shell
重定向到文件中。内容格式和iptables
类似但稍有不同。iptables-restore
shell
从重定向的文件中读取规则后向内核导入。