1、什么是防火墙(Firewall)?linux
防火墙是一种位于内部网络(主机防火墙)与外部网络(网络防火墙)之间的网络安全防御系统,根据特定的访问规则,容许或限制数据包传输经过。主要做用是为了限制企业内部的用户对外的访问,以及互联网上的用户对企业内部的访问,在最大程度上阻止了各个环节的***行为(可来自企业内部,也可来自互联网)。
web
2、防火墙通常做用算法
一、数据包过滤:数据包过滤是指监控经过 的数据包的特征来决定放行或阻止该数据包。防火墙经过数据包过滤能够实现阻挡***,禁止外部或内部访问的某些站点,限制每一个IP的流量和链接数。
安全
二、数据包透明转发:防火墙通常架设在提供某些服务的服务器前,用户对服务器的访问请求与服务器的响应给用户的信息,都须要通过防火墙的转发,所以防火墙具有网关的能力
服务器
三、阻挡外部***:用户发送的信息是防火墙所不容许的,防火墙会当即将其阻断,避免其进入防火墙后面的服务器中。
网络
四、记录***行为:防火墙能够根据须要把***行为记录下来。
并发
3、防火墙分类ssh
一、按网络环境分:tcp
硬件防火墙:把软件防火墙嵌入在硬件中,通常的软件安全厂商所提供的硬件防火墙即是在硬件服务器厂商定制硬件,而后再把linux系统与本身的软件系统嵌入。价格贵,性能好,缺泛灵活性。ide
软件防火墙:单独使用软件系统来完成防火墙功能,将软件部署在系统主机上,其安全性较硬件防火墙差,同时占用系统资源,在必定程度上影响系统性能,但灵活性较好。
二、 按做用范围分:
主机防火墙:(内部网络)
网络防火墙:(外部网络)
4、包过滤防火墙(iptables是其中之一)
包过滤防火墙是一种查看所通过的数据包的包头,由此决定DROP(丢弃)这个数据包,仍是ACCEPT(接受)这个数据包并让它经过,也可能执行其余更复杂的动做。
在Linux系统中,包过滤功能是内建于内核的,它针对每个数据包的包头,按照包过滤规则进行断定,与规则相匹配的数据包依据路由信息继续转发,不然就丢弃。
包过滤是在IP层实现,包过滤根据数据包的源IP地址、目的IP地址、协议类型(TCP、UDP或ICMP)、源端口、目的端口、ICMP消息类型、TCP包头中的ACK位等包头信息以及数据包传输方向等信息来判断是否容许数据包经过。
包过滤也包括与服务相关的过滤,这是指基于特定的服务进行包过滤,因为大多服务监听都基于特定的TCP/UDP端口,所以为阻断全部进入特定服务的连接,防火墙只需将全部包含特定TCP/UDP目的端口的包丢弃便可。
一、 包过滤防火墙策略:
拒绝来自某主机或某网段的全部链接。
容许来自某主机或某网段的全部链接。
拒绝来自某主机或某网段的指定端口的链接。
容许来自某主机或某网段的指定端口的链接。
拒绝本地主机或本地网络与其余主机或其余网络的全部链接。
容许本地主机或本地网络与其余主机或其余网络的全部链接。
拒绝本地主机或本地网络与其余主机或其余网络的指定端口的链接。
容许本地主机或本地网络与其余主机或其余网络的指定端口的链接。
二、过滤数据包的基本过程
包过滤规则必须被包过滤设备端口存储起来。
当数据包到达端口时,对数据包包头进行语法分析。如IP、TCP、UDP包头中的字段。
包过滤规则以特殊的方式存储。数据包规则顺序必须与规则存储顺序相同。
若是一条规则阻止数据包传输或接收,则此数据包便不被容许。
若是一条规则容许数据包传输或接收,则此数据包即可以被继续处理。
若是数据包不知足任何一条规则时,则此数据包便被阻塞。
5、iptables包过滤器防火墙
iptables是一个用户态的防火墙应用软件,集成于目前大多数Linux内核中。它其实是由netfilter和iptables两个组件组成 ,netfilter组件了称为内核空间,是内核的一部分。iptables组件是一种工具,也称用户空间,它使用插入、修改和除去信息包过滤表中的规则变得方便快捷。
一、netfilter:
在整个网络流程的若干位置放置了一些检测点(HOOK),而在每一个检测点上登记了一些处理函数进行处理(如包过滤,NAT等,甚至能够是 用户自定义的功能)。
IP层的五个HOOK点的位置以下所示
[1]:INPUT:经路由查找后,送往本机的经过此检查点,INPUT包过滤在此点进行;
[2]:OUTPUT:本机进程发出的包经过此检测点,OUTPUT包过滤在此点进行。
[3]:FORWARD:要转发的包经过此检测点,FORWARD包过滤在此点进行;
[4]:PREROUTING:刚刚进入网络层的数据包经过此点(刚刚进行完版本号,校验和等检测), 目的地址转换在此点进行;
[5]:POSTROUTING:全部立刻便要经过网络设备出去的包经过此检测点,内置的源地址转换功能(包括地址假装)在此点进行;
二、iptables链:
[1]、内置链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
[2]、自定义链:用于内置链的补充(没有勾子函数)----可实现灵活的规则管理机构,不能单独生效,只有在内置链调用时,关联时才生效。
三、iptables功能:
filter:过滤,防火墙;------真正的防火墙意义
nat:网络地址转换,主要用于修改源IP或目标IP,也能够改端口;-----------network address translation
mangle:拆解报文,作出修改,并从新封装起来;
raw:关闭nat表上启用的链接追踪机制;
四、功能与链的关系:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
五、报文的流向
流入本机:PREROUTING------>INPUT
由本机流出:OUTPUT--------->POSTROUTING
转发:PREROUTING--->FORWARD---->POSTROUTING
六、路由功能发生的时刻:
报文进入本机后:判断目标主机是?
报文离开本机以前:判断经由哪一个接口送往下一部?
七、添加规则时的考量点:
要实现哪一种功能:判断添加到那个表上
报文流经的路径:判断添加到那个链上
注:链上的规则次序,由于检查的次序;所以,隐含必定的应用规则
1)同类规则(访问同一应用),匹配范围小的放上(前)面;
2)不一样类的规则(访问不一样应用),匹配报文频率较大的放在上(前)面;
3)将哪些可由一条规则描述的多个规则合并起来;(减小规则的数目,有可能提升性能)
4)设置默认策略;
6、iptables的基本应用
一、查看iptables规则: L(列出) S(显示)
===================L==================
iptables -L:列出全部链的规则(默认filter表)
iptables -nL:以数字格式列出全部的链(Ip和端口)
iptables -vL:详细列出全部链的规则
iptables -L INPUT:列出INPUT链的规则
iptables -L OUTPUT:列出OUTPUT链的规则
iptables -L FORWARD:列出FORWARD链的规则
iptables -L INPUT #:列出INPUT 链的#号规则
===================S==========================
iptables -S:显示全部链的规则
iptables -vS:显示全部链的详细规则
iptables -S INPUT:显示INPUT链的规则
iptables -S OUTPUT:显示OUTPUT链的规则
iptables -S FORWARD:显示FORWARD链的规则
iptables -S INPUT #:显示INPUT 链的#号规则
二、清除iptables指定链和表中全部规则:
iptables -F:清除全部链的规则(默认filter表)
iptables -F INPUT:清除INPUT链的全部规则
iptables -F FORWARD:清除FORWARD链的全部规则
iptables -F OUTPUT:清除OUTPUT链的全部规则
iptables -D:清除全部链的规则(默认filter表)
iptables -D INPUT #:清除INPUT链的#号规则
iptables -D OUTPUT #:清OUTPUT链的#号规则
iptables -D FORWARD #:清除FORWARD链的#号规则
三、计数清除:
iptables -Z:清除全部链的规则计数
iptables -Z INPUT:清除INPUT链的规则计数
iptables -Z OUTPUT:清除OUTPUT链的规则计数
iptables -Z FORWARD:清除FORWARD链的规则计数
iptables -Z INPUT #:清除INPUT链的#号规则计数
iptables -Z OUTPUT #:清除OUTPUT链的#号规则计数
iptables -Z FORWARD #:清除FORWARD链的#号规则计数
四、设置链的默认策略
iptables -P :设置链的默认策略
iptables -P INPUT DROP :设置INPUT链拒绝全部
iptables -P OUTPUT DROP :设置OUTPUT链拒绝全部
iptables -P FORWARD DROP :设置FORWARD链拒绝全部
iptables -P INPUT ACCEPT :设置INPUT链容许全部
iptables -P OUTPUT ACCEPT :设置OUTPUT链容许全部
iptables -P FORWARD ACCEPT :设置FORWARD链容许全部
五、插入规则
iptables -I INPUT 1 :在INPUT链中插入第1号规则
iptables -A INPUT :在INPUT链后追加一条规则
六、替换指定链中的指定规则
iptables -R INPUT 1 :替换INPUT链中的第1号规则
iptables -R OUTPUT 1 :替换OUTPUT链中的第1号规则
iptables -R FORWARD 1 :替换FORWARD链中的第1号规则
七、用户自定义链
建立:
iptables -N NAME :建立用户自定义链NAME
更改:
iptables -E NAME NEW_NAME:更改NAME链名为NEW_NAME
删除:
iptables -X NAME :删除用户自定义链NAME
八、基本规则匹配器
指定协议:-p
tcp 、udp、icmp、all等协议!(表示非,加在协议以前)
指定icmp类型:
iptables -A INPUT -picmp --icmp-type echo-request -j ACCEPT
指定ip地址:
iptables -A INPUT -s192.168.1.2 -j ACCEPT
iptables -A INPUT -s192.168.0.0/24 -j ACCEPT
指定接口:
iptables -A INPUT -ieth0 -j ACCEPT
iptables -A FORWARD -o eth0 -j ACCEPT
指定端口号:
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -p tcp --sport www -j ACCEPT
指定IP碎片:
iptables -A FORWARD -p tcp -s 192.16.0.0/24 -d 192.168.1.200 --drop 80 -j ACCEPT # 容许192.16.0.0/24这个网段访问192.168.1.200的80端口
iptables -A FORWARD -p tcp -f -s 192.16.0.0/24 -d 192.168.1.200 -j ACCEPT
指定TCP标记:
iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j ACCEPT
九、扩展规则匹配器
limit:过滤限制速率
iptables -A INPUT -m limit --limit 1000/hour -j ACCEPT # 每小时数据包数量1000
iptables -A INPUT -m limit --limit-burst 15 -j ACCEPT # 匹配最大初始数据包数量(默认是5)
iptables -A INPUT -m limit --limit 5/m --limit-burst 15 -j ACCEPT # 匹配最大初始数据包数量15 每分钟5个
multiport:以离散方式定义多端口匹配;最多指定15个端口;
iptables -A INPUT -p tcp -m multiport --sport 22,88,21 -j ACCEPT # 指定多个源端口;
iptables -A INPUT -p tcp -m multiport --dport 22,88,21 -j ACCEPT # 指定多个目标端口;
iptables -A INPUT -p tcp -m multiport --port 22,88,21 -j ACCEPT # 指明多个端口;
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.38.2 -p tcp -m multiport --dports 22,80 -j ACCEPT
iprange:指明连续的(但通常不是整个网络)ip地址范围;
[!] --src-range from[-to]:源IP地址;
[!] --dst-range from[-to]:目标IP地址;
iptables -A INPUT -d 172.16.38.2 -p tcp --dport 80 -m iprange --src-range 172.16.38.5-172.16.38.10 -j DROP # 拒绝172.16.38.5-172.16.38.10网络范围访问本机web端口
iptables -A OUTPUT -m iprange --dst-range 172.16.38.5-172.16.38.10 -j DROP # 禁用本机访问172.16.38.5-172.16.38.10网络范围
string:对报文中的应用层数据作字符串模式匹配检测;
--algo {bm|kmp}:字符串匹配检测算法;
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
[!] --string pattern:要检测的字符串模式;
[!] --hex-string pattern:要检测的字符串模式,16进制格式;
iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT
iptables -A INPUT -d 172.16.38.2 -p tcp --dport 80 -m string --algo bm --string "admin" -j ACCEPT
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...]
--kerneltz:使用内核上的时区,而非默认的UTC;
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
星期一 Monday星期二 Tuesday星期三 Wednesday星期四 Thursday星期五 Friday星期六 Saturday星期日 Sunday
connlimit:根据每客户端IP作并发链接数数量匹配;
--connlimit-upto n:链接的数量小于等于n时匹配;
--connlimit-above n:链接的数量大于n时匹配;
iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT
state:根据”链接追踪机制“去检查链接的状态;
conntrack机制:追踪本机上的请求和响应之间的关系;状态有以下几种:
NEW:新发出请求;链接追踪模板中不存在此链接的相关信息条目,所以,将其识别为第一次发出的请求;
ESTABLISHED:NEW状态以后,链接追踪模板中为其创建的条目失效以前期间内所进行的通讯状态;
RELATED:相关联的链接;如ftp协议中的命令链接与数据链接之间的关系;
INVALID:无效的链接;
UNTRACKED:未进行追踪的链接;
7、部分应用练习
练习:INPUT和OUTPUT默认策略为DROP;
一、限制本地主机的web服务器在周一不容许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不容许访问;web服务器仅容许响应报文离开本机;
[root@www ~]# iptables -A INPUT -d 172.16.38.2 -p tcp --dport 80 -m limit --limit 100/s -m time --weekdays 1 -m string --algo bm --string "admin" -j ACCEPT
[root@www ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
二、在工做时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
# 装载ftp链接追踪的专用模块
[root@www ~]# modproble nf_conntrack_ftp
#放行命令链接
[root@www ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.38.2 -p tcp --dport 21 -m limit --limit 5/m -m time --timestart 8:30 --timestop 18:00 --weekdays 1,2,3,4,5 -j ACCEPT
[root@www ~]# iptables -A OUTPUT -s 172.16.38.2 -p tcp --sport 21 -m state --state ESTABLISHED,RELATED -j ACCEPT
#放行数据链接
[root@www ~]# iptables -A INPUT -d 172.16.38.2 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@www ~]# iptables -A OUTPUT -s 172.16.38.2 -m state --state ESTABLISHED -j ACCEPT
三、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求创建的速率一分钟不得超过2个;仅容许响应报文经过其服务端口离开本机;
[root@www ~]# iptables -A INPUT -d 172.16.38.2 -p tcp --dport 22 -m iprange --src-range 172.16.38.1-172.16.38.100 -m limit --limit 2/m -j ACCEPT
[root@www ~]# iptables -A OUTPUT -s 172.16.38.2 -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
四、拒绝TCP标志位所有为1及所有为0的报文访问本机;
[root@www ~]# iptables -A INPUT -d 172.16.38.2 -p tcp --tcp-flags ALL ALL -j DROP
五、容许本机ping别的主机;但不开放别的主机ping本机;
[root@www ~]# iptables -A INPUT -d 172.16.38.2 -p icmp --icmp-type 8 -j DROP
[root@www ~]# iptables -A OUTPUT -s 172.16.38.2 -p icmp --icmp-type 8 -j ACCEPT
6、开放本机web服务器给非192.168.0.0/24网络中的主机访问
[root@www ~]# iptables -A INPUT 3 -s 192.168.0.0/24 -d 172.16.38.2 -p tcp --dport 80 -j DROP
7、禁止本机被非172.16.0.0/16网络中的主机进行ping请求;
[root@www ~]# iptables -A INPUT ! -s 172.16.0.0/16 -d 172.16.38.2 -p icmp --icmp-type 8 -j DROP
补充:利用iptables的recent模块来抵御DOS***: 22,创建一个列表,保存有全部访问过指定的服务的客户端IP
ssh: 远程链接,
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,能够根据实际状况增大该值;
2.利用recent和state模块限制单IP在300s内只能与本机创建2个新链接。被限制五分钟后便可恢复访问。
下面对最后两句作一个说明:
1.第二句是记录访问tcp 22端口的新链接,记录名称为SSH
--set 记录数据包的来源IP,若是IP已经存在将更新已经存在的条目
2.第三句是指SSH记录中的IP,300s内发起超过3次链接则拒绝此IP的链接。
--update 是指每次创建链接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用
3.iptables的记录:/proc/net/xt_recent/SSH
下面防火墙规则:容许22号和80号端口进入和响应, 不容许本机经过任务端口访问外部网络
[root@www ~]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.16.38.2 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 172.16.38.2 tcp dpt:80
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 172.16.38.2 0.0.0.0/0 state ESTABLISHED
DROP all -- 172.16.38.2 0.0.0.0/0