目录

一、iptables简介

二、netfilter/iptables关系

三、iptables工作流程

四、iptables的四表五链

        1、表的概念

        2、链的概念

        3、表链结构示意图

        4、规则链之间的匹配顺序

 五、规则匹配条件

        1、通用匹配

        2、隐含匹配

        3、显示匹配

        4、状态匹配

六、保存和载入规则


一、iptables简介

        防火墙,就是用于实现Linux下访问控制的功能,它分为硬件或软件防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,即防火墙的策略和规则,以达到让它对出入网络的IP、数据进行检测。

二、netfilter/iptables关系

        netfilter:属于“内核态”的防火墙功能体系。是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集。

        iptables:属于“用户态”的防火墙管理体系。是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易。

        netfilter/iptables后期简称为iptables,iptables是基于内核的防火墙其中内置了raw、mangle、nat和filter四个规则表。

三、iptables工作流程

        iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。

        ① 防火墙是一层一层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的;
        ② 如果匹配上规则,即明确表明阻止还是通过,此时数据包就不再向下匹配新规则了;
        ③ 如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,则按照默认策略进行处理;
        ④ 防火墙的默认规则是对应的链的所有的规则执行完成后才会执行的;

四、iptables的四表五链

        1、表的概念

         把具有相同功能的规则的集合叫做“表”,所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功能:

        filter表:负责过滤功能,即防火墙,内核模块:iptables_filter;

        nat表:网络地址转换功能,内核模块:iptables_nat;

        mangle表:拆解报文,做出修改,并重新封装的功能,内核模块:iptables_mangle;

        raw表:关闭nat表上启用的连接追踪机制,内核模块:iptables_raw;

        2、链的概念

        防火墙的作用就在于对经过的报文匹配"规则",然后执行对应的"动作",所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链"。每个经过这个"关卡"的报文,都要将这条"链"上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。一共分为以下五条链:

        INPUT :处理入站数据包,匹配目标 IP 为本机的数据包。

        OUTPUT :处理出站数据包,一般不在此链上做配置。

        FORWARD :处理转发数据包,匹配流经本机的数据包。

        PREROUTING链 :在进行路由选择前处理数据包,用来修改目的地址,用来做 DNAT。相当于把内网中的 80 端口映射到路由器外网端口上。

        POSTROUTING链 :在进行路由选择后处理数据包,用来修改源地址,用来做 SNAT。相当于内网通过路由器 NAT 转换功能实现内网主机通过一个公网IP地址上网。

        3、表链结构示意图

        优先顺序 :规则表应用顺序 : raw → mangle → nat → filter

        4、规则链之间的匹配顺序

        入站数据:PREROUTING→>INPUT

        出站数据:OUTPUT→POSTROUTING

        转发数据:PREROUTING→FORWARD→POSTROUTING

 五、规则匹配条件

        在编写防火墙规则时,匹配条件的设置起着决定性的作用。只有清晰、准确地设置好匹配条件,防火墙才知道要对符合什么条件的数据包进行处理,避免"误杀"。对于同一条防火墙规则,可以指定多个匹配条件,表示这些条件必须都满足规则才会生效。根据数据包的各种特征,结合iptables的模块结构,匹配条件的设置包括三大类:通用匹配 、隐含匹配、显式匹配

        1、通用匹配

        通用匹配也称为常规匹配,这种匹配方式可以独立使用,不依赖于其他条件或扩展模块。
常见的通用匹配包括:协议匹配、地址匹配、网络接口匹配

        协议匹配:
        编写iptables规则时使用"-p 协议名"的形式指定,用来检查数据包所使用的网络协议(–protocol),如tcp、udp、icmp和 all(针对所有IP数据包)等,可用的协议类型存放于Linux系统的/etc/procotols文件中。例如,若要丢弃通过icmp 协议访问防火墙本机的数据包,允许转发经过防火墙的除 icmp协议之外的数据包,可以执行以下操作:

通用匹配:可直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件

协议匹配:-p协议名
 
地址匹配:-s源地址、-d目的地址          #可以是IP、网段、域名、空(任何地址)
 
接口匹配:-i入站网卡、-o出站网卡


iptables -A FORWARD ! -p icmp -j ACCEPT
iptables -A INPUT -d 192.168.145.101 -j DROP
iptables -I INPUT -i ens33 -s 192.168.145.0/24 -j DROP

iptables -I INPUT -p icmp -j DROP
iptables -A FORWARD ! -p icmp -j ACCEPT    ###感叹号”!"表示取反



        2、隐含匹配

        要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件。端口匹配:–sport源端口、–dport目的端口

#可以是个别端口、端口范围
 
--sport 1000      匹配源端口是1000的数据包
 
--sport 1000:3000 匹配源端口是1000-3000的数据包
 
--sport :3000     匹配源端口是3000及以下的数据包
 
--sport 1000:     匹配源端口是1000及以上的数据包
 
注意:--sport和--dport必须配合-p <协议类型> 使用

示例:

iptables -A INPUT -p tcp --sport 1000:3000 -jREJECT
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -I FORWARD -d 192.168.145.0/24 -p tcp --dport 24500:24600 -j DROP
iptables -A FORWARD -s 192.168.145.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.145.0/24 -p udp --sport 53 -j ACCEPT
iptables -A INPUT -s 192.168.145.0/24 -p tcp --dport 53 -j ACCEPT

        TCP标记匹配:–tcp-flags TCP标记

 iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT
 ###丢弃SYN请求包,放行其他包

        ICMP类型匹配: --icmp-type ICMP类型 ###可以是字符串、数字代码

iptables -A INPUT -p icmp --icmp-type 8 -j DROP      #禁止其它主机ping本机
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT    #允许本机ping其它主机
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT                      

        ping出去--icmp-type为8;ping响应为0

        3、显示匹配

        要求以"-m扩展模块”的形式明确指出类型,包括多端口、mac地址、IP范围、数据包状态等条件

        多端口匹配:

-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表

iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT

        IP范围匹配:

-m iprange --src-range IP范围

iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
#禁止转发源地址位于192.168.80.100-192.168.80.200的udp数据包

        MAC地址匹配:

-m mac --mac-source MAC地址

iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
#禁止来自某MAC地址的数据包通过本机转发

        4、状态匹配

        常见的连接状态:

        NEW:与任何连接无关的,还没开始连接。

        ESTABLISHED :响应请求或者已建立连接的,连接态。

        RELATED:与已有连接有相关性的( 如 FTP 主被动模式的数据连接 ),衍生态,一般与ESTABLISHEBD配合使用。

        INVALID:不能被识别属于哪个连接或没有任何状态。

        iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
        #禁止转发与正常TCP连接无关的非–syn请求数据包(如伪造的网络攻击数据包)

命令示例:       

修改为DROP之前应该先放行ssh

iptables [-t filter] -A INPUT -s 192.168.145.0/24 -d 192.168.145.101 -p tcp -j ACCEPT

iptables -A OUTPUT -s 192.168.145.101 -d 192.168.145.0/24 -p tcp -j ACCEPT

让进入INPUT链和OUTPUT链的所有报文都采用DROP策略

iptables -P INPUT DROP 

iptables -P OUTPUT DROP

放开icmp协议

iptables -A INPUT -d 192.168.145.101 -p icmp -j ACCEPT

iptables -A OUTPUT -s 192.168.145.101 -p icmp -j ACCEPT

tcpdump -i ens33 -nn icmp  监听ens33接口的icmp报文

只开放ssh服务:

iptables -I INPUT -s 192.168.145.0/24 -d 192.168.145.101 -p tcp --dport 22 -j ACCEPT

iptables -I OUTPUT -s 192.168.145.101 -d 192.168.145.0/24 -p tcp --sport 22 -j ACCEPT

开放多端口:

iptables -I INPUT 2 -d 192.168.145.101 -p tcp -m multiport --dports 22,80,443 -j ACCEPT

开放多ip访问:

iptables -I INPUT -d 192.168.145.101 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 192.168.145.100-192.168.145.200 -j ACCEPT

假如我们允许自己ping别人,但是别人ping自己ping不通如何实现呢?
在出去的端口上:iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
在进来的端口上:iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

iptables -I OUTPUT 2 -s 192.168.145.101 -p udp -m multiport --dports 123,323 -m state --state NEW -j ACCEPT

六、保存和载入规则

        1、保存:iptables-save > /PATH/TO/FILE

        2、重载:iptables-restore < /PATH/FROM/FILE

Logo

更多推荐