一、什么是防火墙(Firewall)?
防火墙是一种位于内部网络(主机防火墙)与外部网络(网络防火墙)之间的网络安全防护系统,根据特定的访问规则,允许或限制数据包传输通过。主要作用是为了限制企业内部的用户对外的访问,以及互联网上的用户对企业内部的访问,在最大程度上阻止了各个环节的攻击行为(可来自企业内部,也可来自互联网)。
二、防火墙一般作用
1、数据包过滤:数据包过滤是指监控通过 的数据包的特征来决定放行或阻止该数据包。防火墙通过数据包过滤可以实现阻挡攻击,禁止外部或内部访问的某些站点,限制每个IP的流量和连接数。
2、数据包透明转发:防火墙一般架设在提供某些服务的服务器前,用户对服务器的访问请求与服务器的响应给用户的信息,都需要经过防火墙的转发,因此防火墙具备网关的能力
3、阻挡外部攻击:用户发送的信息是防火墙所不允许的,防火墙会立即将其阻断,避免其进入防火墙后面的服务器中。
4、记录攻击行为:防火墙可以根据需要把攻击行为记录下来。
三、防火墙分类
1、按网络环境分:
硬件防火墙:把软件防火墙嵌入在硬件中,一般的软件安全厂商所提供的硬件防火墙便是在硬件服务器厂商定制硬件,然后再把linux系统与自己的软件系统嵌入。价格贵,性能好,缺泛灵活性。
软件防火墙:单独使用软件系统来完成防火墙功能,将软件部署在系统主机上,其安全性较硬件防火墙差,同时占用系统资源,在一定程度上影响系统性能,但灵活性较好。
2、 按作用范围分:
主机防火墙:(内部网络)
网络防火墙:(外部网络)
四、包过滤防火墙(iptables是其中之一)
包过滤防火墙是一种查看所经过的数据包的包头,由此决定DROP(丢弃)这个数据包,还是ACCEPT(接受)这个数据包并让它通过,也可能执行其他更复杂的动作。
在Linux系统中,包过滤功能是内建于内核的,它针对每一个数据包的包头,按照包过滤规则进行判定,与规则相匹配的数据包依据路由信息继续转发,否则就丢弃。
包过滤是在IP层实现,包过滤根据数据包的源IP地址、目的IP地址、协议类型(TCP、UDP或ICMP)、源端口、目的端口、ICMP消息类型、TCP包头中的ACK位等包头信息以及数据包传输方向等信息来判断是否允许数据包通过。
包过滤也包括与服务相关的过滤,这是指基于特定的服务进行包过滤,由于大多服务监听都基于特定的TCP/UDP端口,因此为阻断所有进入特定服务的链接,防火墙只需将所有包含特定TCP/UDP目的端口的包丢弃即可。
1、 包过滤防火墙策略:
拒绝来自某主机或某网段的所有连接。
允许来自某主机或某网段的所有连接。
拒绝来自某主机或某网段的指定端口的连接。
允许来自某主机或某网段的指定端口的连接。
拒绝本地主机或本地网络与其他主机或其他网络的所有连接。
允许本地主机或本地网络与其他主机或其他网络的所有连接。
拒绝本地主机或本地网络与其他主机或其他网络的指定端口的连接。
允许本地主机或本地网络与其他主机或其他网络的指定端口的连接。
2、过滤数据包的基本过程
包过滤规则必须被包过滤设备端口存储起来。
当数据包到达端口时,对数据包包头进行语法分析。如IP、TCP、UDP包头中的字段。
包过滤规则以特殊的方式存储。数据包规则顺序必须与规则存储顺序相同。
如果一条规则阻止数据包传输或接收,则此数据包便不被允许。
如果一条规则允许数据包传输或接收,则此数据包便可以被继续处理。
如果数据包不满足任何一条规则时,则此数据包便被阻塞。
五、iptables包过滤器防火墙
iptables是一个用户态的防火墙应用软件,集成于目前大多数Linux内核中。它实际上是由netfilter和iptables两个组件组成 ,netfilter组件了称为内核空间,是内核的一部分。iptables组件是一种工具,也称用户空间,它使用插入、修改和除去信息包过滤表中的规则变得方便快捷。
1、netfilter:
在整个网络流程的若干位置放置了一些检测点(HOOK),而在每个检测点上登记了一些处理函数进行处理(如包过滤,NAT等,甚至可以是 用户自定义的功能)。
IP层的五个HOOK点的位置如下所示
[1]:INPUT:经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行;
[2]:OUTPUT:本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行。
[3]:FORWARD:要转发的包通过此检测点,FORWARD包过滤在此点进行;
[4]:PREROUTING:刚刚进入网络层的数据包通过此点(刚刚进行完版本号,校验和等检测), 目的地址转换在此点进行;
[5]:POSTROUTING:所有马上便要通过网络设备出去的包通过此检测点,内置的源地址转换功能(包括地址伪装)在此点进行;
2、iptables链:
[1]、内置链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
[2]、自定义链:用于内置链的补充(没有勾子函数)----可实现灵活的规则管理机构,不能单独生效,只有在内置链调用时,关联时才生效。
3、iptables功能:
filter:过滤,防火墙;------真正的防火墙意义
nat:网络地址转换,主要用于修改源IP或目标IP,也可以改端口;-----------network address translation
mangle:拆解报文,做出修改,并重新封装起来;
raw:关闭nat表上启用的连接追踪机制;
4、功能与链的关系:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
5、报文的流向
流入本机:PREROUTING------>INPUT
由本机流出:OUTPUT--------->POSTROUTING
转发:PREROUTING--->FORWARD---->POSTROUTING
6、路由功能发生的时刻:
报文进入本机后:判断目标主机是?
报文离开本机之前:判断经由哪个接口送往下一部?
7、添加规则时的考量点:
要实现哪种功能:判断添加到那个表上
报文流经的路径:判断添加到那个链上
注:链上的规则次序,因为检查的次序;因此,隐含一定的应用规则
1)同类规则(访问同一应用),匹配范围小的放上(前)面;
2)不同类的规则(访问不同应用),匹配报文频率较大的放在上(前)面;
3)将哪些可由一条规则描述的多个规则合并起来;(减少规则的数目,有可能提高性能)
4)设置默认策略;
六、iptables的基本应用
1、查看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 链的#号规则
2、清除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链的#号规则
3、计数清除:
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链的#号规则计数
4、设置链的默认策略
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链允许所有
5、插入规则
iptables -I INPUT 1 :在INPUT链中插入第1号规则
iptables -A INPUT :在INPUT链后追加一条规则
6、替换指定链中的指定规则
iptables -R INPUT 1 :替换INPUT链中的第1号规则
iptables -R OUTPUT
1 :替换OUTPUT链中的第1号规则
iptables -R FORWARD
1 :替换FORWARD链中的第1号规则
7、用户自定义链
创建:
iptables -N NAME :创建用户自定义链NAME
更改:
iptables -E NAME NEW_NAME:更改NAME链名为NEW_NAME
删除:
iptables -X NAME :删除用户自定义链NAME
8、基本规则匹配器
指定协议:-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
9、扩展规则匹配器
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:未进行追踪的连接;
七、部分应用练习
练习:INPUT和OUTPUT默认策略为DROP;
1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
[[email protected] ~]# 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
[[email protected]
~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
# 装载ftp连接追踪的专用模块
[[email protected] ~]# modproble
nf_conntrack_ftp
#放行命令连接
[[email protected]
~]# 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
[[email protected] ~]# iptables -A OUTPUT -s 172.16.38.2 -p tcp --sport 21 -m state --state
ESTABLISHED,RELATED -j ACCEPT
#放行数据连接
[[email protected] ~]# iptables -A
INPUT -d 172.16.38.2 -p tcp -m state --state RELATED,ESTABLISHED
-j ACCEPT
[[email protected] ~]# iptables -A OUTPUT -s 172.16.38.2 -m state --state ESTABLISHED -j ACCEPT
3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
[[email protected]
~]# 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
[[email protected] ~]# iptables -A OUTPUT -s 172.16.38.2 -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
[[email protected]www ~]# iptables -A INPUT -d 172.16.38.2 -p tcp --tcp-flags ALL ALL -j DROP
5、允许本机ping别的主机;但不开放别的主机ping本机;
[[email protected]
~]# iptables -A INPUT -d 172.16.38.2 -p icmp --icmp-type 8 -j DROP
[[email protected]
~]# iptables -A OUTPUT -s 172.16.38.2 -p icmp --icmp-type 8 -j ACCEPT
6、开放本机web服务器给非192.168.0.0/24网络中的主机访问
[[email protected] ~]# 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请求;
[[email protected] ~]# 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号端口进入和响应, 不允许本机通过任务端口访问外部网络
[[email protected]
~]# 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