iptables基础(一)
===========================================================================
概述:
本章将介绍Linux中有关防火墙的相关基础知识,内容包括:
iptables/netfilter:
netfilter上的5个钩子函数;
iptables上的5链;
四表:raw,mangle,nat,filter以及各表的功能和链的对应关系;
iptables的安装和命令规则的组成和使用格式;
iptables的匹配规则,包括基本匹配条件和扩展匹配条件;
扩展匹配条件中的隐性匹配和显性匹配
===========================================================================
iptables介绍
1.Firewall
★Firewall:防火墙系统
是一种隔离工具,Packets Filter Firewall (包过滤型防火墙);
☉定义:
工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件;
☉硬件防火墙:
在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现;
☉软件防火墙:
应用软件处理逻辑运行于通用硬件平台之上的防火墙;
★防火墙范围分类:
主机防火墙:服务范围为当前主机;
网络防火墙:服务范围为防火墙背后的局域网;
2.iptables/netfilter:
★netfilter:防火墙框架,framework;位于内核空间;
⊙hooks function(钩子函数)
prerouting:路由前
input : 入栈
forward : 转发
output : 出栈
postrouting:路由后
注意:
钩子函数都是在内核中的TCP/IP协议栈上定义的。
★iptables:
命令行工具程序,位于用户空间;规则管理工具;
⊙CHAINS:链,在钩子上定义规则
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
注意:
iptables 是用户空间的规则管理工具,通过iptables编写好规则后,然后送往在对应的CHAINS(链)之上来管理报文;
★报文流向:
到本机某进程的报文:PREROUTING --> INPUT
由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
由本机的某进程发出报文:OUTPUT --> POSTROUTING
3.tables 表
★功能:
filter:过滤,防火墙;
nat:network address translation,网络地址转换;
mangle:拆解报文,做出修改,并重新封装;
raw:关闭nat表上启用的连接追踪机制;
附录:
filter表和nat表
★优先级次序(由高而低):
raw --> mangle --> nat --> filter
★功能<-->钩子对应关系:很重要
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
★数据包过滤匹配流程:
4.iptables规则的组成及工作原理:
★匹配条件:
网络层首部:Source IP(源IP), Destination IP(目标IP)
传输层首部:Source Port(源端口), Destination Port(目标端口)
扩展检查机制:
★处理动作:target 目标
ACCEPT:接受
DROP:丢弃
REJECT:驳回,拒绝
★iptables工作流程
iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来确定是否可以进入主机。
工作流程如下图所示:
(数据报的流向是从左向右)
★总结:
1.防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
2.如果匹配上规则,即明确表明是阻止还是通过,数据包就不在向下进行匹配新规则了。
3.如果所有规则中没有明确表明是阻止还是通过,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
4.防火墙默认规则是所有的规则执行完才会执行的。
5.匹配上了拒绝规则也是匹配,这点要多注意。
iptables命令使用基础
1.安装:
★netfilter:位于内核中的tcp/ip协议栈报文处理框架;
★iptables:
☉CentOS 5/6:iptables命令编写规则;
初始化安装命令:
# iptables -t filter -F
# service iptables save
☉CentOS 7:firewalld,firewall-cmd, firewall-config
初始化安装命令:
# systemctl disable firewalld
★程序包:
iptables,iptstate
2.iptables命令的规则:
★规则:
根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;
⊙匹配条件:
◆基本匹配条件:主要是ip层(源地址,目标地址),传输层协议;
◆扩展匹配条件:需要借助于扩展模块进行指定的匹配条件;
隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;
显式扩展:隐式扩展之外的其它扩展匹配条件;
⊙处理动作:
基本动作:ACCEPT,DROP,...
扩展动作:需要借助于扩展模块进行,但无须显式指定,仅需指明动作;
★添加规则时需要考量的问题:
报文流经的位置:用于判断将规则添加至哪个链;
实现的功能:用于判断将规则添加至哪个表;
报文的方向:用于判断哪个为“源”,哪个为“目标”;
匹配条件:用于编写能够正确匹配目标报文的规则;
3.iptables命令的使用格式:
★规则使用格式:
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options] 扩展条件
target = -j targetname [per-target-options] 处理动作
★规则管理格式:
iptables [-t table] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]
⊙-t table:
指明要管理的表; 默认为filter;
⊙COMMANDS:
◆链管理:
-P:iptables [-t table] -P chain target
定义链的默认策略;其target一般可使用ACCEPT或DROP;
-N:iptables [-t table] -N chain
自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数;
-X:iptables [-t table] -X [chain]
删除自定义的空的引用计数为0的链;
-F:iptables [-t table] -F [chain [rulenum]] [options...],
清空指定的链,或删除指定链上的规则 ;
-E:iptables [-t table] -E old-chain-name new-chain-name,
重命名自定义的引用计数为0的链;
-Z:iptables [-t table] -Z [chain [rulenum]] [options...]
规则置零,置零计数器
◆规则:
-A:append, iptables [-t table] -A chain rule-specification,
追加规则到指定的链尾部;
-I:insert, iptables [-t table] -I chain [rulenum] rule-specification,
插入规则到指定的链中的指定位置,默认为链首;
-D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum,
删除指定的链上的指定规则;
-R:replace,iptables [-t table] -R chain rulenum rule-specification,
将指定的链上的指定规则替换为新的规则;
◆查看:
-L:list, iptables [-t table] -L [chain [rulenum]] [options...]
-n:数字格式,不要做反解;
-v:verbose,详细格式信息;
-vv, -vvv
--line-numbers:显示链上的规则的编号;
-x:exactly,显示计数器的精确值;
★计数器:
每条规则以及链的默认策略分别有各自的两个计数器:
匹配到的报文的个数:pkts
匹配到的所有报文的大小之和:bytes
演示:链管理
1.-L 查看iptables的表和链
# 查看表,默认指的是filter表,有三个链 [root@centos7 ~]# iptables -vnL Chain INPUT (policy ACCEPT 1020 packets, 92926 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 487 packets, 78021 bytes) pkts bytes target prot opt in out source destination # 查看nat表,有四个链 [root@centos7 ~]# iptables -t nat -vnL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
2. -P 定义链的默认策略为DROP
[root@CentOS6 ~]# ping 192.168.1.12 # 定义之前是能ping同 PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data. 64 bytes from 192.168.1.12: icmp_seq=1 ttl=64 time=2.56 ms 64 bytes from 192.168.1.12: icmp_seq=2 ttl=64 time=0.499 ms 64 bytes from 192.168.1.12: icmp_seq=3 ttl=64 time=0.369 ms # 定义默认策略为DROP [root@centos7 ~]# iptables -t filter -P INPUT DROP [root@centos7 ~]# iptables -nL Chain INPUT (policy DROP) # INPUT 链默认由 ACCEPT 链转为DROP target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 定义之后ping不通了,链ssh远程登录都掉了 [root@CentOS6 ~]# ping 192.168.1.12 PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data.
3. -N 自定义链
[root@centos7 ~]# 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 # 定义一个in_web的链 [root@centos7 ~]# iptables -N in_web [root@centos7 ~]# 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 Chain in_web (0 references) # 自定义的链,0次引用 target prot opt source destination
4. -X 删除自定义链
[root@centos7 ~]# iptables -X [root@centos7 ~]# 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
5. -E 重命名自定义的链
[root@centos7 ~]# iptables -N in_web [root@centos7 ~]# 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 Chain in_web (0 references) target prot opt source destination [root@centos7 ~]# iptables -t filter -E in_web web_input_packets # 重命名自定义链 [root@centos7 ~]# 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 Chain web_input_packets (0 references) # 重新定义完成 target prot opt source destination
6. -Z,置零计数器,即规则置零
[root@centos7 ~]# iptables -vnL Chain INPUT (policy ACCEPT 52 packets, 5160 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 33 packets, 5558 bytes) pkts bytes target prot opt in out source destination [root@centos7 ~]# iptables -Z INPUT # 置零 [root@centos7 ~]# iptables -vnL Chain INPUT (policy ACCEPT 6 packets, 396 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 4 packets, 448 bytes) pkts bytes target prot opt in out source destination
iptables的匹配条件
1.匹配条件及规则
★匹配条件:
⊙基本匹配条件:
主要是ip层(源地址,目标地址),传输层协议;
⊙扩展匹配条件:需要借助于扩展模块进行指定的匹配条件;
隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;
显式扩展:隐式扩展之外的其它扩展匹配条件;
注意:
多重条件之间的隐含逻辑为“与”操作;
★匹配规则的原则:
如果被第一条规则所匹配到,就会做处理,处理完之后就到达不了第二条规则了;
不同类别服务的规则(比如控制web服务的,SSH服务的等),应该把访问比较频繁的服务所对应的规则放到前面,即:匹配机会更大的规则放到前面;
同一类别的规则,要把匹配条件苛刻的,范围较小的放到前面,而范围较大的放到后面。
2.基本匹配条件
★参数:
⊙[!]-s, --source address[/mask][,...]:
检查报文中的源IP地址是否符合此处指定的地址或地址范围;
⊙[!]-d, --destination address[/mask][,...]:
检查报文中的目标IP地址是否符合此处指定的地址或地址范围;
⊙[!] -p, --protocol protocol:
检查报文中传输层的协议类型,支持tcp, udp, udplite, icmp,icmpv6,esp, ah, sctp, mh,或者 "all"表示所有协议;
⊙[!] -i, --in-interface name:
检查报文进入本机时的接口是否符合本处指定的接口;只适应 INPUT, FORWARD and PREROUTING ;
⊙[!] -o, --out-interface name:
检查报文即将离开本机时经由的接口是否符合本处指定的接口;FORWARD, OUTPUT and POSTROUTING;
注意:这里的[!]为取反
★-m, --match match:显式指明要使用的扩展模块;
★ -j, --jump target:跳转目标;
注意:
对于本地主机上的大多数的访问控制,如果只是本地作为服务器,那我们只需把INPUT链改为DROP,只放行合法的请求进来就可以;
而对于控制本机请求别人的服务时,我们应该把OUTPUT链设为DROP,只放行认为合法的请求出去就可以;
为了安全起见,建议INPUT和OUTUT链的默认策略应该均为DROP。
演示:
1.添加一条规则,仅使192.168.1.0/24网络中的主机可以访问本机服务,使用-A和-s即可,如下:
# 因为是控制访问服务,所以,请求报文会首先经过INPUT链,所以,要把INPUT链的默认策略 设置为DROP,然后只针对符合源地址要求的报文放行; [root@centos7 ~]# iptables -t filter -P INPUT DROP [root@CentOS6 ~]# ping 192.168.1.14 PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data. # 发现ping不同 # 添加规则,凡是来自于192.168.1.0/24网络的地址,统统放行 [root@centos7 ~]# iptables -t filter -A INPUT -s 192.168.1.0/24 -j ACCEPT [root@CentOS6 ~]# ping 192.168.1.14 # 马上就可以ping 通了 PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data. 64 bytes from 192.168.1.14: icmp_seq=120 ttl=64 time=0.919 ms 64 bytes from 192.168.1.14: icmp_seq=121 ttl=64 time=2.48 ms 64 bytes from 192.168.1.14: icmp_seq=122 ttl=64 time=2.64 ms 64 bytes from 192.168.1.14: icmp_seq=123 ttl=64 time=0.682 ms [root@centos7 ~]# iptables -vnL Chain INPUT (policy DROP 16 packets, 1098 bytes) # 报文 大小 处理动作 协议 选项 源地址 目标地址 pkts bytes target prot opt in out source destination 74 7383 ACCEPT all -- * * 192.168.1.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 83 packets, 9411 bytes) pkts bytes target prot opt in out source destination
1)在上题的基础上,我想禁止192.168.1.0/24 网络中ip为192.168.1.13这台主机的访问,那就需要在上题定义的规则中添加规则了,使用 -I 选项 如下:
# 插入规则 [root@centos7 ~]# iptables -I INPUT -s 192.168.1.13 -j REJECT [root@centos7 ~]# iptables -vnL Chain INPUT (policy DROP 0 packets, 0 bytes) # 可以看到先后次序,同一类规则,范围小的放到前面 pkts bytes target prot opt in out source destination 7 588 REJECT all -- * * 192.168.1.13 0.0.0.0/0 reject-with icmp-port-unreachable 235 21761 ACCEPT all -- * * 192.168.1.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 14 packets, 1564 bytes) pkts bytes target prot opt in out source destination [root@CentOS6 ~]# ping 192.168.1.14 PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data. # 每次 ping,都给你驳回了,这是REJECT From 192.168.1.14 icmp_seq=1 Destination Port Unreachable From 192.168.1.14 icmp_seq=2 Destination Port Unreachable From 192.168.1.14 icmp_seq=3 Destination Port Unreachable
2)把规则上处理动作的REJECT换为DROP,使用-R 如下
[root@centos7 ~]# iptables -R INPUT 1 -s 192.168.1.13 -j DROP # 规则替换 [root@centos7 ~]# iptables -vnL Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 4 336 DROP all -- * * 192.168.1.13 0.0.0.0/0 # 新替换的规则 420 36377 ACCEPT all -- * * 192.168.1.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 5 packets, 700 bytes) pkts bytes target prot opt in out source destination [root@CentOS6 ~]# ping 192.168.1.14 # 这是发现卡在这了,ping不通 PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data.
3)删除对ip为192.168.1.13主机的限制,使用-D选项
[root@centos7 ~]# iptables -vnL --line-numbers # 首先查看要删除规则的规则号 Chain INPUT (policy DROP 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 4 336 DROP all -- * * 192.168.1.13 0.0.0.0/0 2 439 38135 ACCEPT all -- * * 192.168.1.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 18 packets, 2396 bytes) num pkts bytes target prot opt in out source destination # 删除指定规则的规则号码即可 [root@centos7 ~]# iptables -D INPUT 1 # 注意:也可使用 # iptables -D INPUT 192.168.1.13 -j DROP 来指明确切的匹配条件,一定要写target [root@centos7 ~]# iptables -vnL # 查看规则已经被删除 Chain INPUT (policy DROP 9 packets, 632 bytes) pkts bytes target prot opt in out source destination 526 45355 ACCEPT all -- * * 192.168.1.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 43 packets, 5555 bytes) pkts bytes target prot opt in out source destination
2.只允许指定网络192.168.1.0/24内的主机,对本机(目标地址为本机)上所有TCP协议的服务请求放行,添加一条规则,指明三重条件-s,-d,-p
[root@centos7 ~]# iptables -F #首先清空所有的规则 [root@centos7 ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.14 -p tcp -j ACCEPT [root@centos7 ~]# iptables -vnL Chain INPUT (policy DROP 35 packets, 5862 bytes) pkts bytes target prot opt in out source destination 31 2306 ACCEPT tcp -- * * 192.168.1.0/24 192.168.1.14 # 新规则 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 48 packets, 4259 bytes) pkts bytes target prot opt in out source destination [root@CentOS6 ~]# curl # 访问web服务,可以 <html> <head> <title>Test Page</title> </head> <body> <h1>My Test Page</h1> </body> </html> [root@CentOS6 ~]# ping 192.168.1.14 # 但是ping不通,因为只限制tcp协议可以访问 PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data. ^C --- 192.168.1.14 ping statistics --- 3 packets transmitted, 0 received, 100% packet loss, time 2445ms
2.扩展匹配条件
1)隐式扩展条件
★定义:
不用 -m 选项明确给出要使用的扩展机制的扩展;此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;
★-p tcp:可直接使用tcp协议对应的扩展选项;
⊙[!] --source-port,--sport port[:port]:
匹配报文中的传输层的源端口;可给出多个连接的端口;
⊙[!] --destination-port,--dport port[:port]:
匹配报文中的传输层的目标端口;可给出多个连接的端口;
⊙[!] --tcp-flags mask comp 标志位的检查机制
◆标志位:SYN,ACK,FIN,RST,URG,PSH;
◆mask:要检查的标志位列表,以逗号分隔;例如SYN,ACK,FIN,RST
◆comp:mask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0;
例如: --tcp-flags SYN,ACK,FIN,RST SYN 表示,要求只匹配tcp协议给定的这些标志位(SYN,ACK,FIN,RST)中SYN为1,而其余都为0的,这也就是tcp的第一次握手阶段。
⊙[!] --syn:相当于--tcp-flags SYN,ACK,FIN,RST SYN 上面的简写格式
★-p udp:可直接使用udp协议对应的扩展选项;
⊙[!] --source-port,--sport port[:port]:
匹配报文中的传输层的源端口;可给出多个连接的端口;
⊙[!] --destination-port,--dport port[:port]:
匹配报文中的传输层的目标端口;可给出多个连接的端口;
★-p icmp(互联网控制报文协议):
可直接使用icmp协议对应的扩展选项;
⊙[!] --icmp-type {type[/code]|typename}
例如:
--icmp-type 0/0:匹配对ping请求的响应报文
--icmp-type 8/0:匹配ping请求报文
演示:
1.TCP协议扩展
只开放本地的SSH服务的22号端口给本地网络(192.168.1.0/24)
分析:请求报文入栈(INPUT)时源IP和port为192.168.1.0/24网络中的任意主机ip和端口,不确定,但是 目标IP和port是确定的,都是本地服务器的ip和ssh服务tcp协议的22号端口,所以为如下规则: [root@centos7 ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.14 -p tcp --dport 22 -j ACCEPT 分析:请求报文出栈(OUTPUT)时源IP和port为本地服务器的ip(192.168.1.14)和ssh服务的22号端口,是确定,但是 目标IP和port是192.168.1.0/24网络中的任意主机ip和端口,是不确定的,所以为如下规则: [root@centos7 ~]# iptables -A OUTPUT -d 192.168.1.0/24 -s 192.168.1.14 -p tcp --sport 22 -j ACCEPT 然后修改本地服务器的INPUT和OUTPUT的默认策略为DROP [root@centos7 ~]# iptables -P INPUT DROP [root@centos7 ~]# iptables -P OUTPUT DROP 查看所有规则如下: [root@centos7 ~]# iptables -vnL Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 16 1056 ACCEPT tcp -- * * 192.168.1.0/24 192.168.1.14 tcp dpt:22 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 107 11864 ACCEPT tcp -- * * 192.168.1.14 192.168.1.0/24 tcp spt:22
2.ICMP协议扩展
1)在上题的基础上开放本机的ping请求,即允许其他人ping本机。
要想能够被别人ping到,即ping请求入栈,源ip是不确定的,目标ip是本地服务器确定,协议为icmp,其类型为8 [root@centos7 ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.14 -p icmp --icmp-type 8/0 -j ACCEPT 此时虽然,ping请求可以接受,但是只能入栈却不能出栈,通过抓包可以看出,有来自192.168.1.13的请求,但本机却未作出回应 [root@centos7 ~]# tcpdump -i eno16777736 -nn icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eno16777736, link-type EN10MB (Ethernet), capture size 65535 bytes 00:35:43.436103 IP 192.168.1.13 > 192.168.1.14: ICMP echo request, id 41227, seq 752, length 64 00:35:44.435252 IP 192.168.1.13 > 192.168.1.14: ICMP echo request, id 41227, seq 753, length 64 00:35:45.435325 IP 192.168.1.13 > 192.168.1.14: ICMP echo request, id 41227, seq 754, length 64 00:35:46.435659 IP 192.168.1.13 > 192.168.1.14: ICMP echo request, id 41227, seq 755, length 64 开放本机的ping响应报文 [root@centos7 ~]# iptables -A OUTPUT -d 192.168.1.0/24 -s 192.168.1.14 -p icmp --icmp-type 0/0 -j ACCEPT [root@CentOS6 ~]# ping 192.168.1.14 # 客户端已经可以ping通 PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data. 64 bytes from 192.168.1.14: icmp_seq=1023 ttl=64 time=0.434 ms 64 bytes from 192.168.1.14: icmp_seq=1024 ttl=64 time=0.703 ms 64 bytes from 192.168.1.14: icmp_seq=1025 ttl=64 time=0.657 ms
如果想让本地主机可以ping互联网上的任意主机,规则如下:
现在本地主机是ping不了其他主机的,因为本地主机发送不了ping的请求报文 [root@centos7 ~]# ping 192.168.1.13 PING 192.168.1.13 (192.168.1.13) 56(84) bytes of data. ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted 要想能够ping其他主机要在OUTPUT上定义出栈的请求报文,如下: [root@centos7 ~]# iptables -A OUTPUT -s 192.168.1.14 -d 0.0.0.0/0 -p icmp --icmp-type 8 -j ACCEPT 本地主机ping ip为192.168.1.13 的其他主机 [root@centos7 ~]# ping 192.168.1.13 PING 192.168.1.13 (192.168.1.13) 56(84) bytes of data. 在ip为 192.168.1.13 的主机抓包可见能够收到ip为192.168.1.13主机的请求报文,客户端主机也会发送响应报文,如下: [root@CentOS6 ~]# tcpdump -i eth0 -nn icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 12:51:09.454278 IP 192.168.1.14 > 192.168.1.13: ICMP echo request, id 3486, seq 22, length 64 12:51:09.454311 IP 192.168.1.13 > 192.168.1.14: ICMP echo reply, id 3486, seq 22, length 64 12:51:10.454195 IP 192.168.1.14 > 192.168.1.13: ICMP echo request, id 3486, seq 23, length 64 12:51:10.454228 IP 192.168.1.13 > 192.168.1.14: ICMP echo reply, id 3486, seq 23, length 64 12:51:11.454249 IP 192.168.1.14 > 192.168.1.13: ICMP echo request, id 3486, seq 24, length 64 虽然本地主机的ping请求发送出去了,但是ping的其他主机的响应报文不能入栈,所以要定义其他主机 的响应报文入栈,如下: [root@centos7 ~]# iptables -A INPUT -d 192.168.1.14 -s 0.0.0.0/0 -p icmp --icmp-type 0 -j ACCEPT [root@centos7 ~]# ping 192.168.1.13 # 可以ping通,也有回应了 PING 192.168.1.13 (192.168.1.13) 56(84) bytes of data. 64 bytes from 192.168.1.13: icmp_seq=1 ttl=64 time=5.02 ms 64 bytes from 192.168.1.13: icmp_seq=2 ttl=64 time=0.512 ms
2)显式扩展条件
★定义:
必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项;
★multiport
以离散或连续的方式定义的多端口匹配条件; (最多不超过15个).
⊙[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
⊙[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
⊙[!] --ports port[,port|,port:port]...:匹配此处指定的源或目标端口;
演示:
1.使用一条规则开放本机的22,80和23号端口
[root@centos7 ~]# iptables -F # 首先清空所有的规则 定义入栈的规则,这里不指明源ip和端口,默认为网络中所有的主机 [root@centos7 ~]# iptables -A INPUT -d 10.1.252.161 -p tcp -m multiport --dports 22,23,80 -j ACCEPT 定义出栈规则,同样这里不指明目标ip和端口,默认为网络中所有的主机 [root@centos7 ~]# iptables -A OUTPUT -s 10.1.252.161 -p tcp -m multiport --sports 22,23,80 -j ACCEPT 定义入栈,出栈的默认策略为DROP [root@centos7 ~]# iptables -P INPUT DROP [root@centos7 ~]# iptables -P OUTPUT DROP 查看规则如下: [root@centos7 ~]# iptables -vnL Chain INPUT (policy DROP 112 packets, 11838 bytes) pkts bytes target prot opt in out source destination 420 32308 ACCEPT tcp -- * * 0.0.0.0/0 10.1.252.161 multiport dports 22,23,80 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 7 packets, 420 bytes) pkts bytes target prot opt in out source destination 151 13992 ACCEPT tcp -- * * 10.1.252.161 0.0.0.0/0 multiport sports 22,23,80 ================================================================================== 测试如下: [root@CentOS6 ~]# curl # 测试httpd 的80端口成功 <html> <head> <title>Test Page</title> </head> <body> <h1>My Test Page</h1> </body> </html> [root@CentOS6 ~]# ssh 10.1.252.161 #ssh服务的22号端口正常 root@10.1.252.161's password: Last login: Sat Oct 22 10:25:28 2016 from 10.1.250.25 =========================================== Welcome Everbody 心有理想,春暖花开!!! 2016-10-22 10:51:55 Saturday ===========================================
★iprange
以连续的ip地址范围指明多地址匹配条件;
[!] --src-range from[-to] :指明匹配多个源地址;
[!] --dst-range from[-to] :指明匹配多个目标地址;
★string
对报文中的应用层数据做字符串匹配检测;
[!] --string pattern:字符串匹配模式检测
[!] --hex-string pattern:把字符串转换成16进制的字符格式,效率更高
--algo {bm|kmp}:字符串匹配检查算法;
--from offset: 从最开始出偏移多少个字节开始检查;
--to offset :设置我们要检查匹配到何处结束;
注意:
前二者选其一,是必须要给定的,算法也是必须要给定的;
--from和--to 如果二者不给定的话,就是检查整个报文
演示:
1.对互联网中的敏感词汇sex做规则匹配
没有设定规则前,含敏感词汇的和不含的文件,都可以正常访问,如下: #不含敏感词汇 [root@CentOS6 ~]# curl http://10.1.252.161/text.html <html> <head> <title>Test Page</title> </head> <body> <h1>My Test Page</h1> </body> </html> # 含敏感词汇sex [root@CentOS6 ~]# curl http://10.1.252.161/text1.html sex # ===================================================================================== 分析:本题是在web服务上做了更加严格的规则,同类规则中匹配严格的要放到前面,优先检查; 因为响应报文中包含敏感词汇,所以,我们要在出栈上做定义,源ip为本主机,这里只限定web服务 所以源端口为80,如果所有的服务都限定,不用指明端口即可,然后匹配sex,匹配到后执行REJECT [root@centos7 ~]# iptables -I OUTPUT -s 10.1.252.161 -p tcp --sport 80 -m string --string "sex" --algo bm -j REJECT [root@centos7 ~]# iptables -vnL Chain INPUT (policy DROP 4 packets, 312 bytes) pkts bytes target prot opt in out source destination 1682 132K ACCEPT tcp -- * * 0.0.0.0/0 10.1.252.161 multiport dports 22,23,80 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 REJECT tcp -- * * 10.1.252.161 0.0.0.0/0 tcp spt:80 STRING match "sex" ALGO name bm TO 65535 reject-with icmp-port-unreachable 1089 115K ACCEPT tcp -- * * 10.1.252.161 0.0.0.0/0 multiport sports 22,23,80 #================================================================================= 设定规则后,再次访问,可以发现,不含敏感词汇的可以正常访问,含有敏感词汇sex的,不能正常访问 [root@CentOS6 ~]# curl http://10.1.252.161/text.html <html> <head> <title>Test Page</title> </head> <body> <h1>My Test Page</h1> </body> </html> [root@CentOS6 ~]# curl # 卡着不动了,说明访问不了
★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...]:限定每周的周几有效;
注意:
设置访问时间规则时,一定要校正系统时间
演示:
为了演示效果,这里禁止web服务在每周六访问,定义规则如下:
规则设定之前可以正常访问web服务 [root@CentOS6 ~]# curl http://10.1.252.161/text.html <html> <head> <title>Test Page</title> </head> <body> <h1>My Test Page</h1> </body> </html> #======================================================================================== 设定规则,如下: [root@centos7 ~]# iptables -I INPUT -d 10.1.252.161 -p tcp --dport 80 -m time --weekdays 6 -j REJECT [root@centos7 ~]# iptables -vnL Chain INPUT (policy DROP 10 packets, 780 bytes) pkts bytes target prot opt in out source destination 0 0 REJECT tcp -- * * 0.0.0.0/0 10.1.252.161 tcp dpt:80 TIME on Sat UTC reject-with icmp-port-unreachable 3041 234K ACCEPT tcp -- * * 0.0.0.0/0 10.1.252.161 multiport dports 22,23,80 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 165 54078 REJECT tcp -- * * 10.1.252.161 0.0.0.0/0 tcp spt:80 STRING match "sex" ALGO name bm TO 65535 reject-with icmp-port-unreachable 2063 220K ACCEPT tcp -- * * 10.1.252.161 0.0.0.0/0 multiport sports 22,23,80 ========================================================================================== [root@CentOS6 ~]# curl http://10.1.252.161/text.html # 卡在这里不动了,规则设定之前是可以访问的
★connlimit
根据每客户端IP做并发连接数限制,即限制单IP可同时发起的连接请求数;
--connlimit-upto n:连接数小于等于阈值(上限);
--connlimit-above n:连接数超出阈值;
演示:
对于ssh服务,每客户端发起的单ip不能超过2个,规则如下:
[root@centos7 ~]# iptables -I INPUT -d 10.1.252.161 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT [root@centos7 ~]# iptables -vnL Chain INPUT (policy DROP 13 packets, 1014 bytes) pkts bytes target prot opt in out source destination 0 0 REJECT tcp -- * * 0.0.0.0/0 10.1.252.161 tcp dpt:22 #conn src/32 > 2 reject-with icmp-port-unreachable 3944 307K ACCEPT tcp -- * * 0.0.0.0/0 10.1.252.161 multiport dports 22,23,80 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 165 54078 REJECT tcp -- * * 10.1.252.161 0.0.0.0/0 tcp spt:80 STRING match "sex" ALGO name bm TO 65535 reject-with icmp-port-unreachable 2794 418K ACCEPT tcp -- * * 10.1.252.161 0.0.0.0/0 multiport sports 22,23,80 测试没有是可以的
由于篇幅限制,后续内容请查看http://1992tao.blog.51cto.com/11606804/1864763,谢谢关注!!!