首页 > 系统服务 > 详细

Linux防火墙(iptables )的功能详解,不能再详细了

时间:2017-01-25 23:17:08      阅读:940      评论:0      收藏:0      [点我收藏+]

首先理解防火墙是什么?

防火墙只是一个框架,真正想实现就需要规则,只有在出入口处定义防范策略,也才能识别好人还是坏人;

iptabels怎么来的? (1) iptables它只是命令行工具程序,位于用户空间且只是通用规则编辑管理工具; 
(2) 最早实现在内核中提供防火墙机制的是BSD UNIX,而Linux设计开发者参考了在BSD中的实现并开始引入到Linux内核当中来,最早的一代我们叫IPfirewall也是2.0之前的版本。 
(3) 2.2版本后叫ipchains,为了解决应对防火墙上的不同策略而浮生。 
(4) 2.4版本后叫iptables,为了解决防火墙上诸多功能与不同策略而浮生。 
ipfirewall是什么? 
ipfirewall简称ipfw,是在FreeBSD上开发的IP封包过滤程式,具备防火墙功能,由FreeBSD开发团队负责维护。它曾被移植到多个平台上,Mac OS X曾经采用它作为预设防火墙,直到Mac OS X 10.7 Lion 采用另一个FreeBSD程式PF来取代它。在94年艾伦·考克斯曾经将它移植到Linux 1.1上,作为Linux的预设防火墙,直到Linux 2.4被iptable来取代。(摘自wiki) 
iptables又是什么? 
我们在上面已经说过,它只是一个命令行工具,只是一个运行在用户空间的应用软件,通过控制Linux内核netfilter模块,来管理网络数据包的流动与转送。在大部分的Linux系统上面,iptables是使用/usr/sbin/iptables来操作,文件则放置在手册页(Man page[2])底下,可以通过 man iptables 指令获取。通常iptables都需要内核层级的模块来配合运作,Xtables是主要在内核层级里面iptables API运作功能的模块。因相关动作上的需要,iptables的操作需要用到超级用户的权限。(摘自wiki) 
什么是Firewall? 
它是一种隔离工具(Packets Filter Firewall,即包过滤防火墙,带状态追踪机制的包过滤防火墙) 
工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件; 
组件可以是硬件级别或者是软件级别

硬件防火墙:在硬件级别实现部分过滤功能的防火墙;另一部分功能基于软件实现;
       提供通用功能支撑;
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙;
       提供复杂逻辑;
主机防火墙:服务范围为当前主机;
       只为单台主机提供访问策略;
网络防火墙:服务范围为防火墙被的局域网;
       整个逻辑是在软件层实现的;

Linux系统内核级防火墙有两个层面的工具组成

netfilter与iptables
(1) Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架。该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想;
(2) Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能: 
    网络地址转换(Network Address Translate);
    数据包内容修改; 
    以及数据包过滤的防火墙功能; 
(3) Netfilter 平台中制定了数据包的五个挂载点(Hook Point,可理解为钩子函数,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容);
这5个挂载点分别是 PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING; 
(4) iptables:Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件。类似的应用程序还有 firewalld

iptables的四表与五链

四表;tables
       filter:过滤,防火墙;
       nat:network address translation,网络地址转换;
       mangle:拆解报文,做出修改,并重新封装;
       raw:关闭nat表上启用的连接追踪机制;
五链;CHAINS
       prerouting 路由前
       input 入站
       forward 转发
       output 出站
       postrouting 路由后

四个表的功能讲解

filter表: 
主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP,ACCEPT,REJECT); 
filter 表对应的内核模块为iptable_filter,包含三个规则链: 
    INPUT链:针对哪些目的地是本地的包; 
    FORWARD链:过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包; 
    OUTPUT链:是用来过滤所有本地生成的包; 
nat表:
主要用于修改数据包的IP端口等信息(网络地址转换,如SNAT,DNAT,MASQUERADE,REDIRECT);
属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链: 
    PREROUTING链:作用是在包刚刚到达防火墙时改变它的目的地址; 
    OUTPUT链:改变本地产生的包的目的地址; 
    POSTROUTING链:在包就要离开防火墙之前改变其源地址; 
mangle表:
主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛; 
包含五条规则链:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD ;
raw表:
是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表; 
包含两条规则链;OUTPUT与PREROUTING;

五个链的功能讲解

在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链;

从应用时间点的角度理解这些链:
(1) INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则;
(2) OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则;
(3) FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时应用此链中的规则;
(4) PREROUTING链:在对数据包作路由选择之前,应用此链中的规则,如DNAT; 
(5) POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则,如SNAT;

iptables中数据包和4种被跟踪连接的4种不同状态:

(1) NEW:该包想要开始一个连接(重新连接或将连接重定向) ;
(2) RELATED:该包是属于某个已经建立的连接所建立的新连接; 
例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。–icmp-type 0 ( ping 应答) 就是–icmp-type 8 (ping 请求)所RELATED出来的; 
(3) ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包; 
(4) INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据;

报文的请求方式和报文的流向

报文的请求:

(1) 由本机流出的报文 
     请求别人; 
     响应别人; 
(2) 流入本机的报文 
     别人直接请求进来的; 
     自己请求出去别人响应进来的;

报文的流向:

(1) 到本机某进程的报文:PREROUTING –> INPUT;

(2) 由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING;

(3) 由本机的某进程发出报文:OUTPUT –> POSTROUTING;

注意:接口本身没有方向,我们在写规则的时候要考虑报文的流经方向;

iptables规则的组成部分即数据包的处理方式

上面我们已经说过了四表五链(功能与钩子)的对应关系,而真正去管理实现防火墙的基本功能是需要iptables这个管理工具来实现; 
注意:整个防火墙的规则是由iptables来编写; 
那iptables规则的组成到底有哪些呢?

1、匹配条件:
对一个报文的检查部分有; 
    网络层首部:Source IP, Destination IP ;
    传输层首部:Source Port, Destination Port ;
    应用层首部:需借助于扩展检查机制方可实现; 
    扩展检查机制:需要iptables_netfilter扩充一些功能才能检查(以模块化呈现) ;

2、处理动作:target 叫处理目标 
    ACCEPT–接收允许,DROP–丢弃,REJECT–拒绝;

安装使用iptables/netfilter

安装信息摘要:
(1) 实验的系统环境:CentOS 7.2 
(2) netfilter是位于内核中的TCP/IP协议栈报文处理框架,可使用模块管理命令mod查看模块信息;
(3) iptables定义的规则是在用户空间定义的,然后送往内存中的内核上,重启自动消失; 
(4) iptables不是服务,即需要配置文件来保存规则也可写入脚本使其开机自动运行; 
(5) 针对CentOS平台不同系统版本的iptables管理实现: 
CentOS 5/6:iptables命令编写规则
    ~]# iptables -t filter -F 
    ~]# service iptables save 
    服务脚本: /etc/init.d/iptables (可复制到CentOS7上一样可运行) 
CentOS 7:firewalld(守护进程),firewall-cmd(命令行工具), firewall-config(配置文件) 
    ~]# systemctl disable firewalld (服务关闭,先disable后stop) 
iptables安装:
程序包:iptables(ipv4包过滤和NAT转换管理工具) 
iptstate(状态追踪工具) 
保证实验需要先安装应用程序: 
~]# yum install httpd samba telent vsftpd -y

用iptables命令去写规则时需要注意的问题

规则匹配方法:

根据指定匹配条件来尝试匹配每个流经此处报文,一旦匹配成功则由规则后面指定处理动作进行处理

规则匹配的条件:主要匹配IP层首部特征;
基本匹配条件:源地址,目标地址,传输层协议; 
扩展匹配条件:需要借助于扩展模块进行指定的匹配条件(有两种); 
    隐式扩展:已经在基本匹配条件中指明的协议相关的扩展; 
    显式扩展:隐式扩展之外的其它扩展匹配条件; 
处理动作: 
    基本动作:ACCEPT,DROP,… 
    扩展动作:需要借助于扩展模块进行,但无须显式指定,仅需指明动作,大写都是指明扩展 ; 
添加规则时需要考量的问题(重点): 
(1) 报文流经的位置:用于判断将规则添加至哪个链; 
(2) 实现的功能:用于判断将规则添加至哪个表; 
(3) 报文的方向:用于判断哪个为“源”,哪个为“目标”; 
(4) 匹配条件:用于编写能够正确匹配目标报文的规则; 

举例:阻止来自于10.1.0.101访问本机的web服务

iptables命令的多种使用格式

通用规则管理格式: 

iptables [-t able] COMMAND chain cretieria [-m [per-match-options]] [-j targetname [per-target-options]]

注意:-t table 表示指明要管理的表,默认为filter且优先级最低;

技术分享









COMMANDS(子命令): 
对链本身管理: 

-P:iptables [-t table] -P chain target,定义链的默认策略;其target一般可使用ACCEPT或DROP;            
    因为防火墙风格两种:白名单,黑名单 一但设置为DROP则外部访问全拒绝
    举例:iptables -t filter -p INPUT DROP (改默认策略为DROP)
    
-N:chain,自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数;    
    iptables [-t table] -N 
    举例:iptables -N in_web (0 references=零次引用)             
    注意:自定义链规则不会送入到钩子上的,自定义链想要生效必须在内置链上去引用它;            
     每一个自定义链都会有被引用计数,为零表示没有被引用;
    
-X:iptables [-t table] -X [chain],删除自定义的空的引用计数为0的链;           
    举例:iptables -X (慎用...如未加X选项表示删除所有链,且不可逆)
    
-F:iptables [-t table] -F [chain [rulenum]] [options...],清空指定的链,或删除指定链上的规则 ;
    
-E:iptables [-t table] -E old-chain-name new-chain-name,重命名自定义的引用计数为0的链;    
    举例:iptables -E in_web in_httpd
    
-Z:iptables [-t table] -Z  [chain [rulenum]] [options...] 置零计数器          
    每条规则以及链的默认策略分别有各自的两个计数器:
        (1) 匹配到的报文的个数:pkts
        (2) 匹配到的所有报文的大小之和:bytes    
    举例:iptables -Z INPUT (多次刷新)

规则显示的字段表示的意思:

pkts:由此包所匹配到的报文个数;
bytes:由此规则所匹配到的包的大小之和/字节数;
target:表示匹配到的规则是target;
prot:表示被这个规则所匹配到的协议protocol;
opt选项:
in:报文限制从哪个接口流入;
out:报文限制从哪个接口流出;
source:源地址;
destination:目标地址;
注意:如果定义的链没有被任何规则所匹配,则默认被策略所匹配(policy ACCEPT 806 packets,94361 bytes);

链规则管理:

-A:append, iptables [-t table] -A chain rule-specification
    追加规则到指定的链尾部,增;
-I:insert, iptables [-t table] -I chain [rulenum] rule-specification
    插入规则到指定的链中的指定位置,默认为链首;
-D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum第几号规则
    删除指定的链上的指定规则,删;
-R:replace,iptables [-t table] -R chain rulenum rule-specification
    将指定的链上的指定规则替换为新的规则,改;

查看:

-L:list, iptables [-t table] -L [chain [rulenum]] [options...]
    -n:数字格式;
    -v:verbose,详细格式信息;
    -vv, -vvv;
    --line-numbers:显示链上的规则的编号;
    -x:exactly,显示计数器的精确值;
-t:查看不同的表
    ~]# iptables -t nat -vnL
    ~]# iptables -vnL

iptables的匹配条件

匹配条件我们在上面已经讲过了,在这里注意一点就可以; 
即多重条件之间的隐含逻辑为“与”操作; 
基本匹配条件:       

[!] -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:跳转目标;

举例:针对本机入站凡事来自于10.1.0.0/16网络请求都被允许,凡事来自于10.1.253.44访问本机的请求都拒绝;
    iptables -I INPUT -s 10.1.253.44 -j REGECT 
    iptables -t filter -A INPUT -s 10.1.0.0/16 -j ACCEPT 
把以上所拒绝的源网络地址匹配规则改为DROUP 
    iptables -R INPUT 1 -s 10.1.253.44 -j DROP 
不再阻断10.1.253.44报文请求,放行 
    iptables -vnL –lines-numbers (先看规则处在哪个条目上) 
    iptables -D INPUT 1 不指明匹配条件,指明number数 
    iptables -D INPUT -s 10.1.253.44 -j DROP(指明匹配条件) 
举例:本机只允许本机上的tcp请求服务,请求放行 
    iptables -A INPUT -s 10.1.253.0.0/16 -d 10.1.253.43 -p tcp -j ACCEPT 
    iptables -R INPUT 1 -j REGECT 
注意:不同类别的规则,匹配机会更大,访问比较频繁的放在前面(注意先后顺序)

扩展匹配条件: 
隐式扩展: 

不用-m选项明确给出要使用的扩展机制的扩展;
此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;(不指定-m扩展即为隐式扩展) ;
-p tcp:可直接使用tcp协议对应的扩展选项; 
    [!] –source-port,–sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口; 
        21:22:23 [:20,20:] 
    [!] –destination-port,–dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口; 
        21:22:23 [:20,20:] 
    [!] –tcp-flags mask comp 
        报文标志位: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]:匹配报文中的传输层的源端口;可给出多个连接的端口; 
        21:22:23 [:20,20:] 
    [!] –destination-port,–dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口; 
        21:22:23 [:20,20:] 
-p icmp:可直接使用icmp协议对应的扩展选项,主要指定icmp类型用来探测主机或网络的可用性 
        [!] –icmp-type {type[/code]|typename} 
        –icmp-type 0/0:匹配对ping请求的响应报文 
        –icmp-type 8/0:匹配ping请求报文 
举例:只开放本机的openssh服务的22端口给本地网络(整个网络只放行openssh 22端口) 
    iptables -A INPUT -s 10.1.0.0/16 -d 10.1.253.43 -p tcp –dport 22 -j ACCEPT 入站 
入站整个网络我只放行22端口 
    iptables -A OUTPUT -d 10.1.0.0/16 -s 10.1.253.43 -p tcp –sport 22 -j ACCEPT 出站 
出站整个网络我只放行22端口 
    iptables -P INPUT DROP 
    iptables -P OUTPUT DROP 
举例:开放本机的ping请求 
ping请求报文:8/0 :请求报文是进入本机的 
    iptables -A INPUT -s 10.1.0.0/16 -d 10.1.253.43 -p icmp –icmp-type 8/0 -j ACCEPT 
抓包看一看 tcpdump -i eno16777736 -nnn icmp 
ping响应报文:0/0 :响应报文是由本机发出去的 
别人ping自己 
    iptables -A OUTPUT -d 10.1.0.0/16 -s 10.1.253.43 -p icmp –icmp-type 0/0 -j ACCEPT 
自己ping他人,出站 
    iptables -A OUTPUT -s 10.1.253.43 -d 0.0.0.0/0 -p icmp –icmp-type 8/0 -j ACCEPT 
先让你请求出现,不让你出去/状态是 
    iptables -A INPUT -d 10.1.253.43 -s 0.0.0.0/0 -p icmp –icmp-type 0/0 -j ACCEPT






本文出自 “51eA” 博客,请务必保留此出处http://51eat.blog.51cto.com/11892702/1894231

Linux防火墙(iptables )的功能详解,不能再详细了

原文:http://51eat.blog.51cto.com/11892702/1894231

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!