说到防火墙,我们先来搞搞防火墙是什么东西吧!相信大家日常生活中一定听过“”之类的词汇吧,墙到底是什么呢?
重点来了!!!防火墙技术 是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。。。
度娘总是这么善解人意,可是麻烦度娘下次说人话,Ok?
通俗的说法也就是自己家外面的墙,防止小偷之类的,以保证我们的安全,我们自己要出去,肯定从“门”走,而那些小偷、黑客就得夜半时分偷偷喽!计算机也就是我们的家,当然也有大“家”,比如公司内网,学校内网
防火墙分类:【逻辑上】
分类 | 说明 |
---|---|
主机防火墙 | 针对单个主机进行防护 |
网络防火墙 | 处于网络入口或者边缘,针对网络入口进行防护,服务于防火墙背后的本地局域网 |
iptables 并不是真正意义上的防火墙,我们可以理解为一个客户端工具,用户通过ipatbles这个客户端,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,这个框架的名字叫netfilter。 哦,也就是给门上面安装密码、指纹、人脸识别之类的,你符合我的要求,才能进去!!!
netfilter才是防火墙真正的安全框架,netfilter位于内核空间。
iptables是一个命令行工具,位于用户空间,通过这个命令行工具来操作netfilter。
netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
哦,废话真多,不过还没讲完,我们要想设置自己家的密码,首先还得知道,如果==“来者”符合这样的条件,就得这样处理这个数据包==
条件是什么呢?就是规则,也就是我们的接头暗号,哈哈哈。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等
==当然不管你是否符合暗号,我们的墙都得对你做出一些反应,比如说:滚!或者进来吧。也就是放行(accept)、拒绝(reject)和丢弃(drop)等。==我们配置防火墙的主要工作就是添加、修改和删除这些规则。
了解了这些,我们就来康康外面的人到底是怎么通过“墙”的。
报文的流向: 到本机某进程的报文:PREROUTING --> INPUT 由本机转发的报文:PREROUTING --> FORWARD–> POSTROUTING 由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING
上面这些讨厌的英文单词就是“链”,这个是很重要的规则集结地。当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链"
前面讲了链,我们在链上放了各种规则,那么这些规则是不是可以合并呢,比如A规则是限制ip地址访问,B规则也是限制ip地址访问,我们把相同功能的一些规则合并。这样来简化操作。
我们把具有相同功能的规则的集合叫做“表”,不同的规则放置于不同的表中工作,在iptables中定义了四种表,每种表对应不同的功能。
表 | 说明 |
---|---|
filter表 | 负责过滤功能,防火墙;内核模块:iptables_filter |
nat表 | network address translation,网络地址转换功能;内核模块:iptable_nat |
mangle表 | 拆解报文,做出修改,并重新封装 的功能;iptable_mangle |
raw表 | 关闭nat表上启用的连接追踪机制;iptable_raw |
表(功能) | 链(钩子) |
---|---|
raw | REROUTING,OUTPUT |
mangle | REROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING |
nat | REROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有) |
filter | INPUT,FORWARD,OUTPUT |
iptables为我们定义了4张"表",当他们处于同一条"链"时,执行的优先级如下。
优先级次序(由高而低):raw --> mangle --> nat --> filter
除了上面讲的规则外,我们还有一些常见的规则与处理方式:
基本匹配条件 | 扩展匹配条件 |
---|---|
源地址 Source IP | 源端口 Source Port |
目标地址 Destintion IP | m目标端口 Destination Port |
动作 | 含义 |
---|---|
ACCEPT | 允许数据包通过 |
DROP | 直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。 |
REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息 |
SNAT | 源地址转换,解决内网用户用同一个公网地址上网的问题 |
MASQUERADE | 是SNAT的一种特殊形式,适用于动态的、临时会变的ip上 |
DNAT | 目标地址转换 |
REDIRECT | 在本机做端口映射 |
LOG | 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配 |
常用选项 | 说明 |
---|---|
-A | 在指定链尾部添加规则 |
-D | 删除匹配的规则 |
-R | 替换匹配的规则 |
-I | 在指定位置插入规则(例:iptables -I INPUT 1 --dport 80 -j ACCEPT(将规则插入到filter表INPUT链中的第一位上) |
-L/S | 列出指定链或所有链的规则 |
-F | 删除指定链或所有链的规则 |
-N | 创建用户自定义链[例:iptables -N allowed] |
-X | 删除指定的用户自定义链 |
-P | 为指定链设置默认规则策略,对自定义链不起作用 |
-Z | 将指定链或所有链的计数器清零 |
-E | 更改自定义链的名称[例:iptables -E allowed disallowed] |
-n | ip地址和端口号以数字方式显示[例:iptables -nL] |
参数 | 作用 |
---|---|
–dport | 指定目标TCP/IP端口 如 –dport 80 |
–sport | 指定源TCP/IP端口 如 –sport 80 |
-p | tcp 指定协议为tcp |
-p | icmp 指定协议为ICMP |
-p | udp 指定协议为UDP |
-j | DROP 拒绝 |
-j | ACCEPT 允许 |
-j | REJECT 拒绝并向发出消息的计算机发一个消息 |
-j | LOG 在/var/log/messages中登记分组匹配的记录 |
-m | mac –mac 绑定MAC地址 |
-m | limit –limit 1/s 1/m 设置时间策列 |
-s | 192.168.1.153或192.168.1.0/24 指定源地址或地址段 |
-d | 192.168.1.153或192.168.1.0/24 指定目标地址或地址段 |
-s | ! 192.168.1.0 指定源地址以外的 |
OK,前面说了这么多,我都看的天花乱坠瞌睡的不行不行了,下面我们来讲实际操作,简单上手,走起!
(1)首先,我们先查看已有的规则:
[root@localhost ~]# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
#-t选项指定操作的表,默认不指定-t选项时默认就是filter表
#英文单词chain意思就是链
#前面我们讲了四表五链,在这里我们看到有三条链,分别是INPUT,FORWARD,OUTPUT,每条链都有自己的规则
(2)如何来清除已有规则?
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
#在这里,我们用-F选项清除了所有规则,若是只删除一条规则,我们可以用-D来删除,也可以用-R来替换规则
(3)增加一条简单的规则:
[root@localhost ~]# iptables -t filter -I INPUT -s 192.168.1.51 -j DROP #丢弃来自于192.168.1.51的数据包
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 192.168.1.51 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]# ping 192.168.1.151 #此时已ping不通了
PING 192.168.1.151 (192.168.1.151) 56(84) bytes of data.
^C #这里我用CTRL+c来强制退出
--- 192.168.1.151 ping statistics ---
13 packets transmitted, 0 received, 100% packet loss, time 12385ms
#选项说明
-t:指定操作的表
-I:指定插入规则到那个链中
-s:指定“匹配条件”中的源地址
-j:指定“匹配条件”中的动作
Chain INPUT (policy ACCEPT 7 packets, 613 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 192.168.1.51 0.0.0.0/0
1652 139K DROP all -- * * 192.168.1.51 0.0.0.0/0
#若是我们添加了这样的规则,就会发现又可以ping通了,这是什么原因呢?
#在这里有一个规则顺序问题,所有的匹配从第一条规则开始,如果前面已经drop了,也就不存在放行了。
怎么样,我们已经可以设置简单的规则了,哈哈哈!下面我们就来看看进阶用法:
使用iprange扩展模块可以指定"一段连续的IP地址范围",用于匹配报文的源地址或者目标地址。
iprange扩展模块中有两个扩展匹配条件可以使用:
–src-range:源地址范围
–dst-range:目标地址范围
示例:
[root@localhost ~]# iptables -t filter -I INPUT -m iprange --src-range 192.168.1.128-192.168.1.254 -j DROP
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 0.0.0.0/0 0.0.0.0/0 source IP range 192.168.1.128-192.168.1.254
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
使用string扩展模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件。
-m string:表示使用string扩展模块
–algo:用于指定匹配算法,可选的算法有bm与kmp,此选项为必须选项,我们不用纠结于选择哪个算法,但
是我们必须指定一个。
–string:用于指定需要匹配的字符串。
[root@localhost ~]# iptables -t filter -I INPUT -m string --algo kmp --string "bit" -j REJECT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 STRING match "bit" ALGO name kmp TO 65535 reject-with icmp-port-unreachable
...
#网站中有敏感字符串XXX时,用户访问不让响应
过time扩展模块,根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件。
-m time:表示使用time扩展模块
connlimit扩展模块,可以限制每个IP地址同时链接到server端的链接数量,注意:我们不用指定IP,其默认就是针对"每个客户端IP",即对单IP的并发连接数限制。一般和协议、端口配合使用
limit模块对"报文到达速率"进行限制,我们可以以秒为单位进行限制,也可以以分钟、小时、天作为单位进行限制。
–limit限制比较有意思,主要用来限制单位时间内可以流入的数据包的数量。
使用"–limit"选项时,可以选择的时间单位有多种,如下 /second /minute /hour /day
#对每分钟可以流入的包的数量做限制,下面例子可以看到每6秒允许有一个包流入,并且默认开始可以容纳5个包流入
#在这里使用到了令牌桶原理:大小固定的令牌桶可以以恒定的速率源源不断的产生新的令牌,如果令牌不被消耗,或者消耗速度小于产生速度,令牌就会不断增多,直到将令牌桶填满,后面再产生的令牌就会从桶中溢出。最后桶中可以保存的最大令牌数永远不会超过桶的大小。
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -m limit --limit 10/min -j ACCEPT
[root@nebulalinux03 ~]# iptables -t filter -A INPUT -p icmp -j REJECT
[root@nebulalinux03 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 5 packets, 344 bytes)
pkts bytes target prot opt in out source destination
11 680 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
limit: avg 10/min burst 5
0 0 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0
reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 5 packets, 472 bytes)
pkts bytes target prot opt in out source destination
[root@nebulalinux02 ~]# ping 192.168.1.151
PING 192.168.1.151 (192.168.1.151) 56(84) bytes of data.
64 bytes from 192.168.1.151: icmp_seq=1 ttl=64 time=0.779 ms
64 bytes from 192.168.1.151: icmp_seq=2 ttl=64 time=0.622 ms
64 bytes from 192.168.1.151: icmp_seq=3 ttl=64 time=0.448 ms
64 bytes from 192.168.1.151: icmp_seq=4 ttl=64 time=6.82 ms
64 bytes from 192.168.1.151: icmp_seq=5 ttl=64 time=0.831 ms
From 192.168.1.151 icmp_seq=6 Destination Port Unreachable
64 bytes from 192.168.1.151: icmp_seq=7 ttl=64 time=0.524 ms
From 192.168.1.151 icmp_seq=8 Destination Port Unreachable
From 192.168.1.151 icmp_seq=9 Destination Port Unreachable
From 192.168.1.151 icmp_seq=10 Destination Port Unreachable
From 192.168.1.151 icmp_seq=11 Destination Port Unreachable
From 192.168.1.151 icmp_seq=12 Destination Port Unreachable
64 bytes from 192.168.1.151: icmp_seq=13 ttl=64 time=0.680 ms
From 192.168.1.151 icmp_seq=14 Destination Port Unreachable
From 192.168.1.151 icmp_seq=15 Destination Port Unreachable
From 192.168.1.151 icmp_seq=16 Destination Port Unreachable
From 192.168.1.151 icmp_seq=17 Destination Port Unreachable
From 192.168.1.151 icmp_seq=18 Destination Port Unreachable
64 bytes from 192.168.1.151: icmp_seq=19 ttl=64 time=1.04 ms
From 192.168.1.151 icmp_seq=20 Destination Port Unreachable
From 192.168.1.151 icmp_seq=21 Destination Port Unreachable
^C
--- 192.168.1.151 ping statistics ---
21 packets transmitted, 8 received, +13 errors, 61% packet loss, time 20035ms
rtt min/avg/max/mdev = 0.448/1.468/6.825/2.032 ms
#在这里正是使用了令牌桶原理,上面的例子中,默认令牌桶数量是5个,每6秒产生一个令牌,在我们ping操作时,前五次没有任何影响,只是消耗了所有的令牌,从第6秒开始产生新的令牌,这时候我们可以ping通,再要ping通需要等6秒再产生一个新的令牌。
–limit-burst:显示令牌桶大小,默认是5
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit-burst 10 --limit 10/min -j ACCEPT
#令牌桶中最多10块,每6秒产生一块
–tcp-flags指的就是tcp头中的标志位,看来,在使用iptables时,我们可以通过此扩展匹配条件,去匹配tcp报文的头部的标识位,然后根据标识位的实际情况实现访问控制的功能。在网络部分我们讲了三次握手,四次挥手,讲了TCP的包头,这里主要指tcp包头中的标志位,SYN,ACK,FIN,RST,URG,PSH。
他的匹配规则是:“SYN,ACK,FIN,RST,URG,PSH SYN”,怎么来理解,我们可以把这串字符拆成两部分去理解,第一部分为"SYN,ACK,FIN,RST,URG,PSH",第二部分为"SYN"。
第一部分表示:我们需要匹配报文tcp头中的哪些标志位,那么上例的配置表示,我们需要匹配报文tcp头中的6个标志位,这6个标志位分别为为"SYN、ACK、FIN、RST、URG、PSH",我们可以把这一部分理解成需要匹配的标志位列表。
第二部分表示:第一部分的标志位列表中,哪些标志位必须为1,上例中,第二部分为SYN,则表示,第一部分需要匹配的标志位列表中,SYN标志位的值必须为1,其他标志位必须为0。
#匹配三次握手的时候的标志
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags
SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT #匹配第一次握手
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags
SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT #匹配第二次握手
#简写
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flagsALL SYN -j REJECT
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flagsALL SYN,ACK -j REJECT
#--syn也代表第一次握手
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -jREJECT
state是一个非常重要的扩展,可以基于连接追踪功能去查看每一报文当前所处的状态
不论什么协议,客户端第一次访问时,服务器会去内核内存中的追踪表查看他之前是否来过,查不到就证明是第一次来,记录入追踪表,如果查到以前来过就不检查规则,直接允许访问,这称为连接追踪机制。
在访问量特别大的场景下,比如负载均衡服务器不建议开启,追踪表最大只能记录6万多的条目,访问数超过就会无法记录出错,导致所有的连接失败。
报文状态有五种:
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j
ACCEPT
[root@nebulalinux03 ~]# iptables -t filter -A INPUT -j REJECT
#原有连接和新建连接是什么状态呢
#原有连接不受影响
#新建连接被拒绝
至此,基本及常用内容就说到这里,有关nat转发以及后续相关内容还会继续补充的!!!烦请大佬不吝赐教