内容:
1、防火墙简介
2、iptables简介
3、iptables的使用说明(主机防火墙和网络防火墙)
4、iptables的保存
一、防火墙简介
1、防火墙(Firewall),它是一种位于内部网络与外部网络之间的网络安全系统。一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。内部网络和外部网络之间的所有网络数据流都必须经过防火墙,这是防火墙所处网络位置特性,同时也是一个前提。因为只有当防火墙是内、外部网络之间通信的唯一通道,才可以全面、有效地保护企业网内部网络不受侵害,所以防火墙一般部署在内网的最外层。
2、防火墙的主要类型
网络层防火墙:
网络层防火墙可视为一种 IP 封包过滤器,运作在底层的TCP/IP协议堆栈上。我们可以以枚举的方式,只允许符合特定规则的封包通过,其余的一概禁止穿越防火墙(病毒除外,防火墙不能防止病毒侵入)。这些规则通常可以经由管理员定义或修改,不过某些防火墙设备可能只能套用内置的规则。
我们也能以另一种较宽松的角度来制定防火墙规则,只要封包不符合任何一项“否定规则”就予以放行。操作系统及网络设备大多已内置防火墙功能。
较新的防火墙能利用封包的多样属性来进行过滤,例如:来源 IP地址、来源端口号、目的 IP 地址或端口号、服务类型(如 HTTP 或是 FTP)。也能经由通信协议、TTL 值、来源的网域名称或网段...等属性来进行过滤。
应用层防火墙:
应用层防火墙是在 TCP/IP 堆栈的“应用层”上运作,您使用浏览器时所产生的数据流或是使用 FTP 时的数据流都是属于这一层。应用层防火墙可以拦截进出某应用程序的所有封包,并且封锁其他的封包(通常是直接将封包丢弃)。理论上,这一类的防火墙可以完全阻绝外部的数据流进到受保护的机器里。
防火墙借由监测所有的封包并找出不符规则的内容,可以防范电脑蠕虫或是木马程序的快速蔓延。不过就实现而言,这个方法既烦且杂(软件有千千百百种啊),所以大部分的防火墙都不会考虑以这种方法设计。
主机防火墙:每一个独立的主机都会载有防火墙的设置,主要用于请求和接受数据,主要作用在filter表的INPUT和OUTPUT链
网络防火墙:部署在一个网络的出口位置,用于保护整个内部网络,主要用于转发数据,主要作用在filter表的FORWORD链和nat表的对应链中
二、iptables简介
1、iptables的前身叫ipfirewall,这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能,它是依赖许多行和列组成的规则表组成,因此叫iptables。。
2、iptables其实应该叫netfilter/iptables它实际上由两个组件netfilter 和 iptables 组成。
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种规则编写工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
3、iptables是定义规则的工具,本身并不算是防火墙。它定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)
内核空间中有5个位置可以被设计来进行数据的过滤:
(1.进入本机的外网接口(PREROUTING)
(2.数据包从内核流入用户空间的(INPUT)
(3.数据包从用户空间流出的(OUTPUT)
(4.从一个网络接口进来,到另一个网络接口去的(FORWORD)
(5.离开本机的内网接口(POSTROUTING)
由上图可以看出,一个数据包经过时,有必须经过这5个关卡的其中一个或多个,而每个关卡都可以做相关的规则来进行限制,这个关卡的就叫做CHAIN(链),而每个关卡都会通过数据包的特征来进行判断(IP、port等)
iptables的表有四种,顾名思义,每个表的名字都已经高度概括了其功能,即filter表、nat表、mangle表和raw表,分别用于实现包过滤(防火墙),网络地址转换、包重构(修改)和数据跟踪处理,而每个表又定义了不同的链组合:
表的优先级:
row--mangle--nat--filter
其中INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。
三、iptables的安装以及使用说明
1、netfilter:位于内核中的tcp/ip协议栈报文处理框架,一般只需要安装iptables管理工具即可
2、iptables命令:
iptables的语法:
iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j(jump) 处理办法
注意所有的规则都是添加上去后立即生效,但不是永久生效。
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;
匹配条件:
基本匹配条件:源地址,目标地址,传输层协议
扩展匹配条件:需要借助于扩展模块进行指定的匹配条件
隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;
显式扩展:隐式扩展之外的其它扩展匹配条件;
处理动作:
基本动作:ACCEPT,DROP,...
扩展动作:需要借助于扩展模块进行,但无须显式指定,仅需指明动作;
添加规则时需要考量的问题:
(1) 报文流经的位置:用于判断将规则添加至哪个链;
(2) 实现的功能:用于判断将规则添加至哪个表;
(3) 报文的方向:用于判断哪个为“源”,哪个为“目标”;
(4) 匹配条件:用于编写能够正确匹配目标报文的规则;
3、iptabls命令的使用格式:
table只有四个,所以无需多讲,下面来看看COMMAND的用法
(1)COMMANDS:按照功能分类,大致可以分为一下几类:
链管理类:
-P:定义链的默认策略;其target一般可使用ACCEPT或DROP,accept表示所有都可以通过,只有设置的黑名单不能通过,而drop的效果相反,所有都不能通过,只有白名单的才能通过,建议使用accept白名单的模式;
-N:自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数;
-X:删除自定义的空的引用计数为0的链;
-F:-F [chain [rulenum]] [options...],清空指定的链,或删除指定链上的规则 ;
-E:-E old-chain-name new-chain-name,重命名自定义的引用计数为0的链;
-Z:-Z [chain [rulenum]] [options...],置零
规则管理类:
-A:追加规则到指定的链尾部;
-I:插入规则到指定的链中的指定位置,默认为链首;
-D:删除指定的链上的指定规则;
-R:将指定的链上的指定规则替换为新的规则;
查看规则类:
-L:list, iptables [-t table] -L [chain [rulenum]] [options...]
-n:数字格式;
-v:verbose,详细格式信息;
-vv, -vvv
--line-numbers:显示链上的规则的编号;
-x:exactly,显示计数器的精确值;
注意,查看时 iptables -Lvn和iptables -vnL的命令效果是不一样的,参数是按顺序来进行匹配
iptables-save可以在标准输出查看所有的表的规则情况。
计数器类:
每条规则以及链的默认策略分别有各自的两个计数器:
1) 匹配到的报文的个数:pkts
2) 匹配到的所有报文的大小之积:bytes
(2)PARAMETER(匹配条件)
匹配条件可以分为:基本的匹配条件和扩展的匹配条件,
注意:多重条件之间的隐含逻辑为“与”操作;
基本匹配条件:
[!] -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:跳转目标;
扩展匹配条件:
隐式扩展:不用-m选项明确给出要使用的扩展机制的扩展;此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;
-p tcp:可直接使用tcp协议对应的扩展选项;
[!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;
[!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;
[!] --tcp-flags mask comp
tcp-flags:SYN,ACK,FIN,RST,URG,PSH;
mask:要检查的标志位列表,以逗号分隔,例如SYN,ACK,FIN,RST
comp:mask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0;
--tcp-flags SYN,ACK,FIN,RST SYN
[!] --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请求报文
显式扩展:必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项;
1)multiport:以离散或连续的方式定义的多端口匹配条件; Up to 15 ports can be specified.
[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
[!] --ports port[,port|,port:port]...:匹配此处指定的源或目标端口;
2)iprange:以连续的ip地址范围指明多地址匹配条件;
[!] --src-range from[-to]
[!] --dst-range from[-to]
3)string:对报文中的应用层数据做字符串匹配检测;
[!] --string pattern
[!] --hex-string pattern
--algo {bm|kmp}:字符串匹配检查算法(这是必须带上的参数,否则会报错);
4)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...]
5)connlimit :根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求;
--connlimit-upto n:连接数小于等于阈值;
--connlimit-above n:连接数超出阈值;
例:
~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT:表示允许SSH连接的最大连接数为2个。
6)limit :基于收发报文的速率进行匹配;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
例:
~]# iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT #每分钟只能处理ping请求20个
7)state :状态检测:连接追踪机制(conntrack)
NEW:新连接
ESTABLISHED:已建立的连接
RELATED:相关联的连接
INVALID:无法识别的连接
UNTRACKED:未被追踪连接;
相关的内核模块:
nf_conntrack
nf_conntrack_ipv4
nf_conntrack_ftp
追踪到的连接保存在/proc/net/nf_conntrack文件中;
能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max
建议调整至足够大;
不同的协议的连接追踪时长定义在:/proc/sys/net/netfilter/
用法:
[!] --state state
例:如何开放被动模式的ftp服务步骤:
1) 装载追踪ftp协议的模块;
# modprobe nf_conntrack_ftp
2) 放行入站命令连接
# iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
3) 放行入站数据连接
# iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
4) 放行出站的ESTABLISHED连接
# iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT
(3)target:要处理的动作,一般有-j来跳转进行动作的处理
处理动作(跳转目标):
-j tagetname [per-target-options]
简单target:ACCEPT,DROP
扩展target:
REJECT:(拒绝服务)
--reject-with type
icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited,默认为icmp-port-unreachable;
LOG:记录日志
Turn on kernel logging of matching packets.
--log-level level
--log-prefix prefix:日志信息的前导信息;
(4)自定义链的使用:
1)新建一个自定链
[[email protected] ~]# iptables -N nihao [[email protected] ~]# iptables -vnL Chain INPUT (policy ACCEPT 32 packets, 2304 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 9 packets, 876 bytes) pkts bytes target prot opt in out source destination Chain nihao (0 references) pkts bytes target prot opt in out source destination
2)向自定义链添加规则
# iptables -A nihao -d 10.1.252.36 -p tcp --dport 21 -j DROP
3)将要处理的数据包跳转至自定义链接
# iptables -A INPUT -d 10.1.252.36 -j nihao
4)删除自定链
[[email protected] ~]# iptables -X nihao [[email protected] ~]# iptables -nvL Chain INPUT (policy ACCEPT 10 packets, 859 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, 416 bytes) pkts bytes target prot opt in out source destination
4、iptables/netfilter网络防火墙:
1、添加规则于FORWARD链,注意几个问题:
(1) 请求和响应报文均会经由FORWARD链,要注意规则的方向性;
第一条:iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
(2) 如果可以启用conntrack机制,注意网关主机所能够追踪的连接数的最大数量要符合需要
2、NAT:
NAT英文全称是Network Address Translation,称是网络地址转换,它是一个IETF标准,允许一个机构以一个地址出现在Internet上。NAT将每个局域网节点的地址转换成一个IP地址,反之亦然。它也可以应用到防火墙技术里,把个别IP地址隐藏起来不被外界发现,使外界无法直接访问内部网络设备,同时,它还帮助网络可以超越地址的限制,合理地安排网络中的公有Internet 地址和私有IP地址的使用。
NAT的类型
静态NAT(Static NAT)
静态NAT设置起来最为简单和最容易实现的一种,内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址。
动态地址NAT(Pooled NAT)
动态地址NAT是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络。
源地址转换:SNAT,作用在POSTROUTING链上
静态转换:
动态转换:
目标地址转换:DNAT,作用在PREROUTING链上
(1).SNAT基于原地址的转换
基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。
定义的格式:
比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.100.1这个IP.
那么,如果172.16.100.1不是固定的怎么办?
我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。所以,我们就需要这样设置:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
(2).DNAT目标地址转换
对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上。
定义的格式:
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2
目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上
四、iptables的保存
1、保存和载入规则,建议使用手动保存规则列表:
通过重定向保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE 注意:重载文件中的规则,会清除已有规则;
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不予提交;
CentOS 6:
保存规则:service iptables save:保存规则于/etc/sysconfig/iptables,保存操作会清除文件中原有的内容;
也可以iptables-save命令重定向输出文本保存,需要恢复时iptables-restore进行重定向输入即可导入
CentOS 7开机自动生效规则:
(1) firewalld服务;
(2) shell脚本,直接记录iptables命令;
(3) 自定义unit file或init script;
规则优化的思路:
(1) 优先放行双方向状态为ESTABLISHED的报文;
(2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
(3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面;
(4) 设置默认策略:白名单机制
(a) 可使用iptables -P设定默认策略;
(b) 建议在规则链的最后定义规则做为默认策略;