Linux防火墙基本知识 |
han |
一、防火墙的分类 (一)、包过滤防火墙。 数据包过滤(packet Filtering)技术是在网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,称为访问控制表(access control lable,ACL)。通过检查数据流中每个数据包的源地址和目的地址,所用的端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过。 包过滤防火墙的优点是它对用户来说是透明的,处理速度快且易于维护。缺点是:非法访问一旦突破防火墙,即可对主机上的软件和配置漏洞进行***;数据包的源地址、目的地址和IP的端口号都在数据包的头部,可以很轻易地伪造。“IP地址欺骗”是***针对该类型防火墙比较常用的***手段。 (二)、代理服务型防火墙 代理服务(proxy service)也称链路级网关或TCP通道。它是针对数据包过滤和应用网关技术存在的缺点而引入的防火墙技术,其特点是将所有跨跃防火墙的网络通信链路分为两段。当代理服务器接收到用户对某个站点的访问请求后就会检查请求是否符合控制规则。如果规则允许用户访问该站点,代理服务器就会替用户去那个站点取回所需的信息,再转发给用户,内外网用户的访问都是通过代理服务器上的“链接”来实现的,从而起到隔离防火墙内外计算机系统的作用。 此外,代理服务也对过往的数据包进行分析和注册登记,并形成报告,同时当发现有被***迹象时会向网络管理员发出警告,并保留***记录,为证据收集和网络维护提供帮助。 二、防火墙的工作原理 (一)、包过滤防火墙的工作原理 包过滤是在IP层实现的,因此,它可以只用路由器来完成。包过滤根据包的源IP地址、目的IP地址、源端口、目的端口及包传递方向等报头信息来判断是否允许包通过,过滤用户定义的内容,如IP地址。其工作原理是系统在网络层检查数据包,与应用层无关。包过滤器的应用非常广泛,因为CPU用来处理包过滤的时间可以忽略不计。而且这种防护措施对用户透明,合法用户在进出网络时,根本感觉不到它的存在,使用起来很方便。这样系统就具有很好的传输性能,易扩展。 但是这种防火墙不***全,因为系统对应用层信息无感知--也就是说,它们不理解通信的内容,不能在用户级别上进行过滤,即不能识别不同的用户和防止地址的盗用。如果***者把自己主机的IP地址设成一个合法主机的IP地址,就可以很轻易地通过包过滤器,这样更容易被***攻破。基于这种工作机制,包过滤防火墙有以下缺陷: 1、通信信息:包过滤防火墙只能访问部分数据包的头信息。 2、通信和应用状态信息:包过滤防火墙是无状态的,所以它不可能保存来自于通信和应用的状态信息。 3、信息处理:包过滤防火墙处理信息的能力是有限的。 (二)、代理服务型防火墙工作原理 代理服务型防火墙在应用层上实现防火墙功能。它能提供部分与传输有关的状态,能外圈提供与应用相关的状态和部分传输的信息,它还能处理和管理信息。 三、使用iptables实现包过滤防火墙 (一)、iptables概述及原理 从内核2.4之后使用全新的内核包过虑管理工具--iptables,这个工具使用户更易于理解其工作原理,更容易被使用,也具有更强大的功能。 iptables只是一个管理内核包过滤的工具,可以加入、插入或删除核心包过滤表格(链)中的规则。实际上真正执行这些过滤规则的是netfilter(linux核心中一个通用架构)及其相关模块(如iptables模块和nat模块)。 netfilter是linux核心中一个通用架构,它提供一系列的“表”(tables),每个表由若干“链”(chains)组成,而每条链中可以由一条或数条规则(rule)组成。可以这样理解,netfilter是表的容器,表是链的容器,链是规则的容器。 系统缺省的表为“filter”,该表中包含了INPUT、FORWARD和OUTPUT 3个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的:“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件,如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则;最后,如果数据包不符合该链中任何一条规则,系统就会根据该链预先定义的策略(policy)来处理该数据包。 (二)、iptables传输数据包的过程 当数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有以下3种情况: 1、数据包的目的地址是本机,则系统将数据包送往INPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统将丢弃该包。 2、数据包的上的地址不是本机,也就是说这个包将被转发,则系统将数据包送往FORWARD链,如果通过规则检查,该包被发给相应的本地进程处理;如果没有通过规则检查,系统将丢弃该包。 3、数据包是由本地系统进程产生的,则系统将其送往OUTPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统将丢弃该包。 用户可以给各链定义规则,当数据包到达其中的每一条链,iptables就会根据链中定义的规则来处理这个包。iptables将数据包的头信息与它所传递到的链中的每条规则进行比较,看它是否和每条规则完全匹配。如果数据包与某条规则匹配,iptables就对该数据包执行由该规则指定的操作。例如某条链中的规则决定要丢弃(DROP)数据包,数据包就会在该链处丢弃;如果链中规则接受(ACCEPT)数据包,数据包就可以继续前进;但是,如果数据包与这条规则不匹配,那么它将与链中的下一条规则进行比较。如果该数据包不符合该链中的任何一条规则,那么iptables将根据该链预先定义的默认策略来决定如何处理该数据包,理想的默认策略应该告诉iptables丢弃(DROP)该数据包。 (三)、iptables的优点 netfilter/iptables的最大优点是它可以配置有状态的防火墙,这是ipfwadm和ipchains等以前的工具都无法提供的一种重要功能。有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有4种有效状态,名称分别为ESTABLISHED、INVALID、NEW和RELATED。 状态ESTABLISHED指出该信息包属于已经建立的连接,该连接一直用于发送和接收信息包并且完全有效。INVALID状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。状态NEW表示该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。最后,RELATED表示该信息包正在启动新连接,以及它与已建立的连接想关联。 netflter/iptables的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。可以定制自己的规则来满足特定需求,从而只允许想要的网络流量进入系统。 (四)、iptables的基础知识 1、规则(rule) 规则(rule)就是网络管理员预定的条件,规则一般定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(TCP、UDP、ICMP)和服务类型(如HTTP、FTP、SMTP)。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(ACCEPT)、拒绝(REJECT)、或丢弃(DROP)等。配置防火墙的主要规则就是添加、修改和删除这些规则。 2、链(chains) 链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中的第一条规则开始检查,看该数据包是否满足规则所定义的条件,如果满足,系统就会根据该条规则所定义的方法处理该数据包,否则iptables将继续检查下一条规则。如果该数据包不符合链中任何一何况规则,iptables就会根据该链预先定义的默认策略来处理该数据包。 3、表(tables) 表(tables)提供特定的功能,iptables内置3个表,即filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。 (1)filter表。filter表主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对防火墙而言,主要利用filter表中指定一系列规则来实现对数据包进行过滤操作。 filter表是iptables默认的表,如果没有指定使用哪个表,iptables就默认使用filter表来执行所有的命令。filter表包含了INPUT链(处理进入的数据包)、FORWARD链(处理转发的数据包)和OUTPUT链(处理本地生成的数据包)。在filter表中只允许对数据包进行接受或丢弃的操作,而无法对数据包进行更改。 (2)nat表。nat青主要用于网络地址转换NAT,该表可以实现一对一、一对多和多对多的NAT工作,iptables就是使用该表实现共享上网功能的。nat表包含了PREROUTING链(修改即将到来的数据包)、OUTPUT链(修改在路由之前本地生成的数据包)和POSTROUTING链(修改即将出去的数据包)。 (3)mangle表。mangle表主要用于对指定的包进行修改,因为某些特殊应用可能去改写数据包的一些传输特性,例如理性数据包的TTL和TOS等,不过在实际应用中该表的使用率不高。 (五)、关闭系统防火墙 由于系统的防火墙功能也是使用iptables实现的,如果用户在系统的iptables之上设置规则,很容易发生冲突,所以在进行iptables学习之前,建议关闭系统的防火墙功能。 (六)、iptables命令格式 iptables的命令格式较为复杂,一般格式如下: #iptables [-t 表] -命令 匹配 操作 注:iptables对所有选项和参数都区分大小写! 1、表选项
iptables: Firewall: 主机防火墙: 网络防火墙: 工作于主机或网络边缘,对于进出的报文根据定义的规则作检查,进而对被规则匹配到的报文作为相应处理的套件; IDS:Intrusion Detect System ***检测系统 HIDS: Host IDS NIDS: Network IDS 防火墙工作于内核,所以我们要使用iptables来调用netfileer工作 他是直接就生效的, netfiler:是framework架构的 挂钩函数
PREROUTING:路由前 INPUT:到达本机内部的报文必经之路 FORWARD:由本机转发的报文必经之路 OUTPUT:由本机发出的报文的必经之路 POSTROUTING:路由后 我们要匹配的规则的表友 raw(优先级最高 功能是取消nat的 PREROUTING:路由前 INPUT:到达本机内部的报文必经之路 FORWARD:由本机转发的报文必经之路 OUTPUT:由本机发出的报文的必经之路 规则的功能POSTROUTING:路由后 (raw追踪功能的) filter:过滤 ,定义是否允许通过防火墙 nat:是做地址装换的 1启用connection_track: |
SNAT:源地址转换
DNAT:目的地址的转换
mangle
表和链的对应关系:
filter: INPUT, FORWARD, OUTPUT
nat: PREROUTING(SNAT),POSTROUTING(DNAT),OUTPUT
mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw: PREROUTING, OUTPUT
数据报文流程:
跟本机内部进程通信:
进入:PREROUTING, INPUT
出去:OUTPUT, POSTROUTING
由本机转发:
PREROUTING, FORWARD, POSTROUTING
数据报文的流向:
源IP和目标IP由流向决定;
iptables: 用户空间的工具,写规则,并自动发往netfilter,立即生效;
netfilter: 接收并生效规则;
基本语法:
iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET
-t TABLE:
nat, mangle, raw, filter
默认为filter
COMMAND:
链:
-F:flush, 清空规则链;
-N:new, 自建一条链
-X: delete, 删除一条自定义的空链
-Z:zero,计数器归零
-P:policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP;
-E:重命名自定义链
链中的规则:
-A :设置规则策略
-I:插入一条规则
-D:删除一条自定义的空链
-R:修改规则
查询:
-L
-n: 数字格式显示主机地址和端口;
-v: 详细格式,-vv, -vvv
--line-numbers: 显示规则编号
当我们定义好一条规则是: iptables -L -n -v 来查看已定义的规则
pkts bytes target prot opt in out source destination
包数 字节数 目标 协议 流入的接口 流出的接口 源地址 目标地址
A:显示其精确值
iptables [-t TABLE] -A 链名 匹配条件 -j 处理目标
iptables [-t TABLE] -A 链名 匹配条件 -j 处理目标
匹配条件:
通用匹配
-s 地址:指定报文源IP地址匹配的范围;可以是IP,也可以是网络地址;可使用!取反;
--src, --source
-d 地址:指定报文目标IP地址匹配的范围;
--dst, --destination
-p 协议:指定匹配报文的协议类型,一般有三种tcp, udp和icmp;
-i INTERFACE: 数据报文流入的接口;PREROUTING, INPUT, FORWARD
-o INTERFACE: 数据报文流出的接口;OUTPUT, FORWARD, POSTROUITING
扩展匹配
隐式扩展:当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项;
-p tcp:
--sport PORT[-PORT]: 指定源端口
--dport PORT[-PORT]: 指定目标端口
--tcp-flags
-p udp:
--sport
--dport
显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项;
-m state --state
处理目标:
内置目标:
DROP
REJECT
ACCEPT
自定义的链
显式扩展:
-m 扩展模块名称
模块:iptables,netfilter各拥有一部分代码
multiport: 多端口匹配
可用于匹配非连续或连续端口;最多指定15个端口;
专用选项:
--source-ports, --sports port[,port,port:port]
--destination-ports, --dports
--ports
例子:我们允许别人访问我们的seb服务和连接我么的sshd服务
# iptables -I INPUT -d 172.16.249.162 -p tcp -m multiport --dports 22,80 -j ACCEPT
# iptables -I OUTPUT -s 172.16.249.162 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange: 匹配指定范围内的地址;
匹配一段连续的地址而非整个网络时有用;
专用选项:
[!] --src-ragne IP[-IP]
[!] --dst-range
例子: 我们允许172.16.100.1-172.16.100.100能够使用telnet来远程我们的服务器
# iptables -A INPUT -d 172.16.249.162 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
# iptables -A OUTPUT -s 172.16.249.162 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
string: 字符串匹配,能够检测报文应用层中的字符串
字符匹配检查高效算法
kmp, bm
专用选项:
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串;
# iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP
time: 基于时间做访问控制
专用选项:
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day]
Mon, Tue,
我们允许别人在周二到周五的早上8:20到下午18:40通过我们的服务器来连接web服务来上网
# iptables -I INPUT -d 172.16.249.162 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit: 连接数限制,对每IP所能够发起并发连接数做限制;
专用选项:
[!] --connlimit-above [n]
例子:iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
limit: 速率限制 为了防止那些不正当的人来ping我们的电脑我们要做的限制
专用选项:
--limit n[/second|/minute|/hour|/day]
--limit-burst n
例子:我们允许别的服务器来ping我们的服务器每分钟20次,
# iptables -A INPUT -d 172.16.249.162 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
state: 状态检查
专用选项:
--state
连接追踪中的状态:
NEW: 新建立一个会话
ESTABLISHED:已建立的连接
RELATED: 有关联关系的连接
INVALID: 无法识别的连接
调整连接追踪功能所能容纳的连接的最大数目:
/proc/sys/net/nf_conntrack_max
当前追踪的所有连接/proc/net/nf_conntrack
不同协议或连接类型追踪时的属性:
/proc/sys/net/netfilter目录:
(1) 重启后永久性生效:
开启:chkconfig iptables on
关闭:chkconfig iptables off
(2) 即时生效,重启后失效:
开启:service iptables start
关闭:service iptables stop
需要说明的是对于Linux下的其它服务都可以用以上命令执行开启和关闭操作。
#iptables [-t 表名]
[-t 表名]:定义查看哪个表的规则,表名可以使用filter、nat和mangle,如果没有宝,默认使用filter表
:定义默认策略
:定义查看指定表中哪个链的规则,如果不指明,将查看某个表中所有链的规则
:处理数据包的动作,可以使用ACCEPT(接受)和DROP(丢弃)
#iptables -P INPUT ACCEPT (将filter表INPUT链的默认策略定义为接受)
#iptables -t nat -P OUTPUT DROP (将nat表OUTPUT链的默认策略定义为丢弃)
创建一个最简单的规则范例。对于没有经验和时间的用户而言,设置一个简单而又实用的规则是必要的,最基本的原则是“先拒绝所有数据包,然后再允许需要的数据包”,也就是说通常为filter表的链定义。一般都将INPUT定义为DROP,这样就可以阻止任何数据包进入,其他项目定义为ACCEPT,这样对外发送的数据就可以出去。
#iptables -P INPUT DROP
#iptables -P FORWARD ACCEPT
#iptables -P OUTPUT ACCEPT
3、增加、插入、删除和替换规则
#iptables [-t 表名] 链名 [规则编号] [-i | o 网卡] [-p 协议类型] [-s 源IP | 源子网] [--sport 源端口号] [-d 目标IP | 目标子网] [--dport 目标端口号]
[-t 表名]:定义查看哪个表的规则,表名可以使用filter、nat和mangle,如果没有定义,默认使用filter表
-A:新增一条规则,该规则将增加到规则列表的最后一行,该参数不能使用规则编号
-I:插入一条规则,原来该位置上的规则就会身后顺序移动,如果没有指定规则编号,则在第一条规则前插入
-D:删除一条规则,可以输入完整规则,或直接指定规则编号
-R:替换某条规则,规则被替换并不会改变顺序,必须要指定替换的规则编号
:指定查看指定表中某条链的规则,可以使用INPUT、OUTPUT、FORWARD、PREROUTING、OUTPUT、POSTROUTIN
[规则编号]:规则编号是在插入、删除和替换规则时用,编号是按照规则列表的顺序排列,第一条规则编号为1
[-i | o 网卡名称]:i是指数据包从哪块网卡输入,o是批数据包从哪块网卡输出
[-p 协议类型]:可以指定规则应用的协议,包含TCP、UDP、ICMP等
[-s 源IP | 源子网]:数据包的源IP或子网
[--sport 源端口号]:数据包的源端口号
[-d 目标IP | 目标子网]:数据包的目标IP或子网
[--dport 目标端口号]:数据包的目标端口号
:处理数据包的动作
#iptables -A INPUT -i lo -j ACCEPT (追加一条规则,接受所有来自lo接口的数据包)
#iptables -A INPUT -s 192.168.0.44 -j ACCEPT (追加一条规则,接受所有来自192.168.0.44的数据包)
#iptables -A INPUT -s 192.168.0.44 -j DROP (追加一条规则,丢弃所有来自192.168.0.44的数据包)
注:iptables的按照顺序读取规则的,如果两条规则冲突,以排在前面的规则为准。
#iptables -I INPUT 3 -s 192.168.1.0/24 -j DROP (在INPUT链中的第3条规则前插入一条规则,丢弃所有来自192.168.1.0/24的数据包)
注:-I参数如果没有指定插入的位置,将插入到所有规则的最前面
#iptables -D INPUT 2 (删除filter表中INPUT链中的第2条规则)
#iptables -R INPUT 2 -s 192.168.10.0/24 -p tcp --dport 80 -j DROP (替换filter表INPUT链中第2条规则为,禁止192.168.10.0/24访问TCP的80端口)
4、清除规则和计数器
在新建规则时,往往需要清除原有的或旧的规则,以免影响新规则。如果规则较多,逐条删除比较麻烦,可以使用清除规则参数快速删除所有规则。
#iptables [-t 表名]
[-t 表名]:指定策略将应用于哪个表,可以使用filter、nat和mangle,如果没有指定,默认为filter表
-F:删除指定表中所有规则
-Z:将指定表中数据包计数器和流量计数器归零
#iptables -Z (将filter表中数据包计数器和流量计数器请零)
#iptables -F (删除filter表中的所有规则)
5、记录与恢复防火墙规则
可以使用记录与恢复防火墙规则命令,将现有防火墙机制复制下来,在需要恢复时直接恢复即可。
#iptables-save > 文件名 (记录当前防火墙规则)
#iptables-restore > 文件名 (将防火墙规则恢复到当前主机环境)
Linux的iptables下的NAT配置
两台机一台能上网,另外一台无法上网,而我们其中一台是Linux系统的话,就好办了。
配置个iptables NAT吧。
步骤:1、把etc/sysctl.conf中的net.ipv4.ip.forward = 0 后面的0改为1
2、启动iptables:#service iptables start
3 、最重要的一步:#iptables -t nat -A POSTROUTING -o eth0 -s 192.168.10.100/24 -j SNAT -to 外网ip www.2cto.com
4 、 查看nat相关的iptables规则:#iptables -t nat --list (注意POSTROUTING项)
5 、 清除filter、tables的规则:#iptables -F
#iptables -X
6 、 之后就完成了,在另外一台机子设置ip和网段与上面的相符合就行了。
iptables nat
我们也可以在配置文件中设置
例如第一步:Vim /etc/sysctl.conf中
改为1:就是开启路由功能
第二部:
例如: 我们要在172.16.249.162与192.168.1.3之间通信 要把我们的网关设置为172.16.249.229:注:都设为同一样的网关
ip router add 172.16.249.229 up
然后在172,。16.249.229上设置网路转发功能
我们在172.16.249.162与192.168.1.3通信要在路由前设置
iptabbles -t forword -A PREROUTING --s 172.16.249.162 -p tcp --dport 80 -j SNAT 172.16.249.229
z这样就开启了转发功能
在当我们172.16.249.162访问192.168.1.3是在其的日志上显示的是172.16.249.229的ip地址 这样别人就不知道我们的地址,从而保护我们的主机