一、网络安全模型
1、防火墙简介
防火墙(Firewall):也称防护墙,它是一种位于内部网络与外部网络之间的网络安全系统。
工作在主机或网络边缘,对进出的报文按事先定义的规则进行检查,并且由匹配到的规则进行处理的一组硬件或软件,甚至可能是二者的结合
主机防火墙:工作于主机边缘,只能对一台主机起到保护作用
网络防火墙:工作于网络边缘,对多台主机起到保护作用
主机防火墙 + 网络防火墙
硬件防火墙:能高效地处理网络报文,CPU是特制的,在硬件基础上能直接处理报文(解包)
网络层:网络防火墙
应用层:网关或代理服务器(更安全,检测机制更复杂,更为贴近实际应用,效率不高)
IDS:入侵检测系统
HIDS:OSSEC 主机入侵检测系统
NIDS:snort 网络入侵检测系统,
Filesystem:tireware 文件系统级别检测
IPS:IDS + Firewall 入侵防御系统
honeypot:蜜罐 #诱捕
Nessus,nmap 嗅探(扫描)工具
2、iptables
iptables/netfilter:网络层防火墙,支持实现连接追踪(状态检测)
是基于软件形式实现的一种防火墙的软件程序
iptables的前身叫ipfirewall(内核1.x时代),这是一个从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现详细的访问控制功能。
iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道 netfilter。其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。
iptables:防火墙规则编写工具 #用户空间
netfilter:framework(框架)网络过滤器,真正让规则实现 #内核空间
二、iptables的工作机制
1、五链
iptables在网络必然经过的地方,选取了5个位置,来作为控制的地方。这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。
这五个位置分别是:
PREROUTING 路由前
数据报文进入TCP/IP协议栈路由选择前会被PREROUTING“钩”住,分析其数据包对其相应操作,注意:PREROUTING链不能对数据包进行过滤,PREROUTING链是整个netfilter框架中的第一关
INPUT 流入
通过PREROUTING后进行路由选择如果数据包是进入本机内部,则转发到INPUT链,INPUT链能够通过事先定义好的规则对数据包进行筛选如果被匹配则执行相应动作,INPUT链可以对数据包进行过滤,INPUT链是数据报文进入用户空间的必经之路
FORWARD 转发关卡
通过PREROUTING后进行路由选择如果数据包只是通过本机进行转发,则转发到FORWARD链,FORWARD链能够通过事先定义好的规则对数据包进行匹配检查并执行相应动作,INPUT链可以对数据包进行过滤,正是有了FORWARD链iptables才能够作为一个网络防火墙运行在网络边缘对进出网络的数据报文进行过滤
OUTPUT 流出
数据包从用户空间的进程通过路由选择特定的网卡接口后转到OUTPUT链,OUTPUT链能够通过实现定义好的规则对数据报文进行匹配检查并执行相应动作,OUTPUT链可以对数据包进行过滤
POSTROUTING 路由后
数据包从OUTPUT或FORWARD转发而来,到达netfilter框架中的最后一关,分析数据包并执行对应动作,和POSTROUTING一样不能对数据包进行过滤
在路由前和路由后由于没有经过路由决策不会发生过滤作用的,而且我们的(INPUT\FORWORD\OUTPUT)已经可以基本是实现路径的全部封锁控制了。那我们为什么还要放置他们呢?
这个主要是因为我们在做SNAT和DNAT的时候,源地址转换必须在路由之后转换,目标地址转换必须在路由之前转换,这即是他们存在的意义。
2、四表
netfilter过滤数据包的规则是通过四张表的来定义
或者说四个功能
filter
整个iptables最关键的表,实现数据包的过滤;可以由INPUT,FORWARD,OUTPUT这三个能够实现过滤功能的链组成
nat
NAT(Network Address Translation)网络地址转换,
在iptables中也可以实现NAT的相关功能, 例如SNAT(源地址转换),DNAT(目标地址转换),MASQUERADE等功能;nat表可以由PREROUTING, OUTPUT, POSTROUTING组成
mangle
mangle可以对匹配到的报文的数据报进行拆解,做出修改,重新封装等操作;一般我们用的很少,五个链都能实现mangle的功能
raw
raw关闭NAT的连接追踪机制,防止在高并发的访问下服务器的内存溢出导致故障;可由PREROUTING,OUTPUT实现,用的更少。
3、数据包过滤匹配流程
数据包从外网传送到防火墙后,防火墙在IP层向TCP层传送之前,将数据包转发给检查模块进行处理。其过程如下。
#匹配各表的优先级
4、检查和处理机制
检查条件: #根据什么来检查
IP:源地址,目标地址
TCP:SPORT,DPORT,Flags
UDP:SPORT,DPORT,Flags
ICMP:ICMP-TYPE
扩展检查机制:
还可以根据time,协议,string,state(connection-tracking)
处理机制: #匹配到规则的数据包该怎样处理
DROP(悄悄丢弃),REJECT(返回消息明确拒绝),ACCEPT(接受)
SNAT,DNAT:
RETURN:跳转回
REDIRECT:做端口映射
LOG:日志
三、规则
1、规则
规则(rules)其实就是网络管理员预定义的条件,是iptables的基础。
规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规 则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
2、定义规则的”潜规则”
添加规则时的考量点
实现哪些功能: 判断添加在哪张表上
报文的流经路径:判断添加在哪个链上和链上规则的次序
1)同类规则(访问同一程序),匹配范围小的放在上面
2)不同类的规则(访问不同应用), 匹配到报文频率高的放上面
3)将那些可由一条规则描述的多个规则合并成一个
4)设置默认策略
3、防火墙的策略
防火墙策略一般分为两种:
一种叫“通”策略,一种叫“堵”策略,
通策略其实就是白名单,默认端口是关着的,必须要自己指定用户的才能进来。
堵策略可以理解是黑名单,规定范围的人不可以进来。那里但是你必须有身份认证,否则不能进。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。
四、定义规则
1、定义规则语法
iptables [-t table] -N CHAI-NNAME #省略 -t table的话,默认是作用于filter表
创建一条自定义的空规则链
iptables [-t table] -X CHAIN-NAME
删除一条自定义的空规则链
iptables [-t table] -E old-chin-name new-chain-name
为自定义的链改名
注意:上面3条都是针对添加的自定义链,用的不多;内置的5条链不能被改名和删除,
iptables [-t table] -P chain-name target
为链指定默认策略,修改默认的属性,只能修改内置的链
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
-F 清空链中的规则
#规则由编号,在链中自上而下,从1开始,不指定链则清空表中的所有链的规则
-L list,列出表中的所有规则
-n:和-L一起使用,数字格式显示ip和port
-v:和-L一起使用,显示详细信息,
[root@Note3 ~]# iptables -L -n 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 HECHAIN (0 references) target prot opt source destination [root@Note3 ~]# iptables -L -n -v Chain INPUT (policy ACCEPT 44 packets, 4330 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 16 packets, 1696 bytes) pkts bytes target prot opt in out source destination Chain HECHAIN (0 references) pkts bytes target prot opt in out source
pkts:packets,被本规则所匹配到的报文的个数
bytes:被本规则所匹配到的所有报文的大小的和,单位是字节,会执行单位换算
target:目标,即处理机制
port:协议一般为(TCP|UDP|ICMP),指的的上层的协议
opt:可选项
in:数据包的流入端口
out:数据包的流出接口
scource:源地址
destination:目标地址
-vv:
-vvv:
-x:exactly:精确值,不执行单位换算
--line-nambers:显示各规则的行号
-Z:zero,清零,把规则的计数器清零(pkts,bytes等清零)
iptables [-t table] {-A|-D} chain rule-specification
-A:append,附加一条规则,添加在最后面
rule-specification #rule的特有定义
rule-specification定义方式:匹配条件 -j 处理机制
匹配条件:
通用匹配:
-s 匹配原地址,可以是IP,也可以网络地址:可以使用!操作符取反,!172.168.0.0/16,省略默认是0.0.0.0/0
相当于 --src,或 --source
-d 匹配目标地址,可以IP,也可以网络地址:可以使用!操作符取反,!172.168.0.0/16
-p 匹配协议,通常只能使用{TCP|UDP|ICMP}三者之一,指的是上层的协议
-i 数据报文流入的接口,通常只用于INPUT,FORWARD和PREROUTING
-o 数据报文流出的接口,通常只用OUTPUT,FORWARD和POSTROUTING
iptables [-t table] -D chain rulenum 删除指定链的指定规则
iptables [-t table] -I chain [rulenum] rule-specification 插入规则,rulenum指的是,该规则插入为该规则好,不指定规则号则插入至第一行,
iptables [-t table] -R chain rulenum rule-specification 覆盖某规则
iptables [-t table] -S [chain [runenum]]
只显示指定链上的规则添加命令,和save保存的内容一样
2、保存规则
service iptables save
规则会被保存至/etc/sysconfig/iptables文件中,默认,start时也会读取次文件中的内容篇日志规则
iptables-save > /path/to/some_rulefile 保存iptables至别的位置
iptables-restore < /path/to/some_rulefile 从自定义的位置读取并使之生效
[root@Note3 ~]# iptables -A INPUT -s 192.168.10.0/24 -d 192.168.10.3 -j ACCEPT [root@Note3 ~]# iptables -L -nv Chain INPUT (policy ACCEPT 5 packets, 390 bytes) pkts bytes target prot opt in out source destination 0 0 all -- * * 192.168.10.0/24 192.16.100.3 5 356 ACCEPT all -- * * 192.168.10.0/24 192.168.10.3 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 4 packets, 512 bytes) pkts bytes target prot opt in out source destination Chain HECHAIN (0 references) pkts bytes target prot opt in out source destination [root@Note3 ~]# iptables -A INPUT -s 172.16.11.0/24 -d 172.16.11.158 -i eth1 -j ACCEPT [root@Note3 ~]# iptables -A INPUT -d 172.16.11.158 -j ACCEPT [root@Note3 ~]# iptables -L -nv --line-number Chain INPUT (policy ACCEPT 8 packets, 528 bytes) num pkts bytes target prot opt in out source destination 1 1 84 ACCEPT all -- eth1 * 172.16.11.0/24 172.16.11.158 2 0 0 ACCEPT all -- * * 0.0.0.0/0 172.16.11.158 3 0 0 ACCEPT all -- eth1 * 0.0.0.0/0 172.16.11.158 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 5 packets, 524 bytes) num pkts bytes target prot opt in out source destination Chain HECHAIN (0 references) num pkts bytes target prot opt in out source destination #禁Ping [root@Note3 ~]# iptables -A INPUT -s 192.168.10.0/24 -d 192.168.10.3 -p icmp -j DROP [root@Note3 ~]# iptables -L -nv Chain INPUT (policy ACCEPT 99 packets, 7651 bytes) pkts bytes target prot opt in out source destination 5 420 ACCEPT all -- eth1 * 172.16.11.0/24 172.16.11.158 0 0 ACCEPT all -- * * 0.0.0.0/0 172.16.11.158 0 0 ACCEPT all -- eth1 * 0.0.0.0/0 172.16.11.158 4 240 DROP icmp -- * * 192.168.10.0/24 192.168.10.3 [root@Note3 ~]# iptables -D INPUT 4 #清除INPUT链上第4条规则
五、扩展匹配
1、隐含扩展
通用匹配:
-s,-d,-p,-i,-o
扩展匹配:
隐含扩展:使用-p{tcp|udp|icmp},指定某特定协议后,自动能够对协议进行扩展
-p tcp
--dport m[:n]:指定匹配的目标端口,可以是连续的多个端口
--sport m[:n]:匹配的源端口
--tcp-flags:URG(紧急),PSH(传送),RST(重置),SYN,ACK,FIN,ALL,NONE
第一组为要检查的参数,第二组为参数的值要为1
如:--tcp-flags rst,syn,ack,fin syn 也可以简写为--syn
表示要检查rst,syn,ack,fin,其中只有syn为1
-p udp
--dport m[:n]
--sport m[:n]
-p icmp
--icmp-type
type:8是ping请求,0是ping响应,3是ping报错
显示扩展:必须要明确指定的扩展模块
例1:放行来自于192.168.10.0/24网络的主机对本机ssh服务的请求
[root@Note3 src]# iptables -A INPUT -s 192.168.10.0/24 -d 192.168.10.3 -p tcp --dport 22 [root@Note3 src]# iptables -L INPUT -n Chain INPUT (policy ACCEPT) target prot opt source destination tcp -- 192.168.10.0/24 192.168.10.3 tcp dpt:22 [root@Note3 src]# iptables -L INPUT -n -v Chain INPUT (policy ACCEPT 156 packets, 13371 bytes) pkts bytes target prot opt in out source destination 106 7728 tcp -- * * 192.168.10.0/24 192.168.10.3 tcp dpt:22 [root@Note3 src]# iptables -L INPUT 1 -n -v 188 13504 tcp -- * * 192.168.10.0/24 192.168.10.3 tcp dpt:22 [root@Note3 src]# iptables -L -nv Chain INPUT (policy ACCEPT 54 packets, 4973 bytes) pkts bytes target prot opt in out source destination 504 36124 tcp -- * * 192.168.10.0/24 192.168.10.3 tcp dpt:22 277 19964 ACCEPT tcp -- * * 192.168.10.0/24 192.168.10.3 tcp dpt:22 Chain FORWARD (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 37 3388 ACCEPT tcp -- * * 192.168.10.3 192.168.10.0/24 tcp spt:22 Chain HECHAIN (0 references) pkts bytes target prot opt in out source destination
2、显示扩展
显示扩展:必须要明确指定使用的扩展模块
用法:
-m 模块名称 --专用选项1 --专用选项2
iptables的显示扩展模块:
[root@Note3 src]# ls /lib64/xtables/ libip6t_ah.so libipt_NETMAP.so libxt_dccp.so libxt_RATEEST.so libip6t_dst.so libipt_realm.so libxt_dscp.so libxt_recent.so . . .
multiport:多端口匹配,一次指定多个离散的端口
--sports port[,port|,port:port] 最多指定用逗号隔开的15个以内的离散端口
--dports
--ports
[root@Note3 src]# iptables -A INPUT -d 192.168.10.3 -p tcp -m multiport --sports 22,80,8080:9090
iprange:ip地址范围
[!] --src-range ip1[-ip2]
[!] --dst-range ip1[-ip2]
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dstrange 172.16.100.1-172.16.100.100 -j ACCEPT
time:指定时间范围
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
# 1970-01-01T00:00:00 to 2038-01-19T04:17:07.
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --weekdays day[,day....] #也可以使用1,2,3,4,5
[root@Note3 src]# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT
string:字符串匹配
--algo {bm|kmp}:字符匹配查找时使用的算法
--string “STRING":要查找的字符串
--hex-string "HEX-STRING":要查找的字符,先编码成16进制格式
[root@Note3 ~]# iptables -I OUTPUT -s 172.16.100.7 -p tcp --sport 80 -m string --algo kmp --string "help" -j DROP
connlimit:每IP对指定服务的最大并发连接数
[!] --connlimit-above [n]
[root@Note3 ~]# iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimit --connlimit-above 5 -j DROP
limit:报文速率控制
--limit N[/second|/minute|/hour|/day]
--limit-burst N #峰值,最多可以发几个
[root@Note3 ~]# iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimit --connlimit-above 5 -j DROP
#hping3:做测试
state:状态追踪
ip_conntrack和nf_conntrack机制
根据连接追踪机制检查连接间的状态 调整连接追踪功能所能够容纳的最大连接数量: 已经追踪到并记录下的连接: 不同协议或连接类型追踪的时长: 可追踪的连接状态: NEW:新发出的请求;连接追踪表中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求; ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态; RELATED:相关的连接,建立连接后产生的新连接等,如ftp协议的命令连接与数据连接之间的关系 INVALIED:无法识别的连接;
--state #仅放行哪些状态的包
NEW
ESTABLISHED
RELATED
INVALID
[root@Note3 ~]# iptables -A INPUT -d 172.16.100.7 -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT [root@Note3 ~]# iptables -A OUTPUT -s 172.16.100.7 -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
法则:
1.对于进入状态为ESTABLISHED都应该放行
2.对于返回状态为ESTABLISHED都应该放行
3.严格检查进入的状态为NEW的链接
4.所有状态为INVALID都应该拒绝
-j target
RETURN:返回调用链(谁调用它就返回谁)
iptables -I INPUT -d 172.16.100.7 -j clean_in iptables -A clean_in -d 172.16.100.7 -j RETURN
如何放行工作与被动模式的ftp服务?
1、确保iptables加载ftp协议支持的模块,ip_nat_ftp,ip_conntrack_ftp
编辑/etc/syconfig/iptables-config文件,定义如下参数:
IPTABLES_MIDULES="ip_nat_ftp ip_conntrack_ftp"
2、放行请求报文的RELATED和ESTABLISHED状态,放行响应报文的ESTABLISHED状态
回顾:开机流程
POST--> BootSequence(MBR:bootloader) -->GRUB -->kernel(initramfs) --> /sbin/init (/etc/inittab,/etc/init/*.conf)
启动服务时的最后一个服务通常是/etc/rc.d/rc.local(/etc/rc.local),这事实上是一个脚本,但凡写在脚本的命令或脚本调用都在系统运行至此服务被执行
写iptables脚本时,如果把sshd服务也挡掉了怎么办?
写iptables脚本后定义一个5分钟后的at计划任务,清空iptables的规则,并把默认策略改为ACCEPT
练习:
这里先改INPUT和OUTPUT的默认策略为DROP的话,ssh将连不上,所以先放行sshd服务,再修改默认策略
(先做第三题)
3、
[root@Note3 ~]# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT [root@Note3 ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT [root@Note3 ~]# iptables -A INPUT -d 192.168.10.3 -p tcp --dport 22 -m iprange --src-range 192.168.10.1-192.168.10.100 -m state --state NEW -m limit --limit 2/m -j ACCEPT [root@Note3 ~]# iptables -I OUTPUT -s 192.168.10.3 -p tcp --sport 22 -m iprange --dst-range 192.168.10.1-192.168.10.100 -m state --state ESTABLISHED -j ACCEPT [root@Note3 ~]# iptables -P INPUT DROP [root@Note3 ~]# iptables -P OUTPUT DROP [root@Note3 ~]# iptables -L -n Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED ACCEPT tcp -- 0.0.0.0/0 192.168.10.3 tcp dpt:22 source IP range 192.168.10.1-192.168.10.100 state NEW limit: avg 2/min burst 5 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 192.168.10.3 0.0.0.0/0 tcp spt:22 destination IP range 192.168.10.1-192.168.10.100 state ESTABLISHED ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED Chain HECHAIN (0 references) target prot opt source destination [root@Note3 ~]# #这样设置,在本机上ssh 127.0.0.1和ssh 192.168.10.3被禁止了 [root@Note3 ~]# iptables -I INPUT -s 127.0.0.1 -j ACCEPT [root@Note3 ~]# iptables -I OUTPUT -s 127.0.0.1 -j ACCEPT [root@Note3 ~]# iptables -I OUTPUT -d 192.168.10.3 -j ACCEPT
1、
[root@Note3 ~]# iptables -A INPUT -p tcp --dport 80 -m time ! --weekdays Mon -m state --state NEW -m limit --limit 100/s -m string ! --string "admin" --algo bm -j ACCEPT
2、
[root@Note3 ~]# lsmod|grep ftp [root@Note3 ~]# modprobe ip_nat_ftp [root@Note3 ~]# modprobe ip_conntrack_ftp [root@Note3 ~]# lsmod|grep ftp nf_nat_ftp 3507 0 nf_conntrack_ftp 12913 1 nf_nat_ftp nf_nat 22759 2 nf_nat_ftp,iptable_nat nf_conntrack 79758 7 nf_nat_ftp,nf_conntrack_ftp,iptable_nat,nf_nat,nf_conntrack_ipv4,nf_conntrack_ipv6,xt_state [root@Note3 ~]# iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 20:21 -m time --weekdays 1,2,3,4,5 --timestart 08:30 --timestop 18:00 -m state --state RELATED -m limit --limit 5/m -j ACCEPT
4、
[root@Note3 ~]# iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP [root@Note3 ~]# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
5、
[root@Note3 ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT [root@Note3 ~]# iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT