iptables基础概念

iptables基本概念梳理

前言

netfilter/Iptables (其中包括netfilter和Iptables两个组件)组 成了Linux平台下的包过滤防火墙,它与大多数的Linux自带软 件一样,这个防火墙是免费提供的,它可以代替昂贵的企业级 防火墙来解决实际问题与实际方案,完成封包过滤,封包重定 向和网络地址转换等功能。

一、工作原理

数据包从外网传送到防火墙后,防火墙在IP层向TCP层传 送之前,将数据包转发给检查模块进行处理。其过程如下。

⑴ 首先与第一个过滤规则比较。

⑵ 如果与第一个模块相同,则对它进行审核,判断是否要 转发该数据包,这时审核的结果是转发数据包,则将数据包发 送到TCP层进行处理,否则就将它丢弃。

⑶ 如果与第一个过滤规则不同,则接着与第二个规则相 比较,如果相同则对它进行审核,过程与上一步相同。

⑷ 如果与第二个过滤规则不同,则继续与下一个过滤规 则比较,直到与所有的过滤规则比较完成。要是不满足所有过 滤规则,就将数据丢弃。

iptables基础概念

二、iptables规则集

规则就是决定如何处理一个包的语句。如果一个包符合 所有的条件(match),我们就运行target指令。

书写规则的语法格式是:

Iptables [-t table] command [match] [target]

一条Iptables规则包含上面四个元素:表,命令,匹配,目标。

1、表

有四种 可用的表选项:filter、nat、mangle和raw。该选项不是必须的,如果 未指定,则filter用作默认表。

filter

filter表用来过滤数据包的,实现原理比较简单,根据规则对数据包做DROP或者ACCEPT处理。下图是信息包在filter表中的穿越过程。

iptables基础概念

NAT

NAT,Network Address Translation的缩写,NAT表的主要用处是网络地址的转换,采用网络地址转换技术可提高内网安全性。当IP地址不足时,很多用户使用私有IP地址来组建网络,而这些私有地址又不能直接访问Internet上的资源,针对这种情况也可以采用地址转换技术来解决。NAT可以实现一个IP地址转换为另一个或一组IP地址。下图是包在NAT表中的处理过程。

iptables基础概念

PREROUTING链的作用是在包进防火墙时改变它的目的地址,OUTPUT链改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。

mangle

这个表的用途主要是用来Mangle数据包,可以改变不同的包及包头的内容,比如TTL,TOS或MARK,这里要强调的是TOS并没有真正的改变数据包内容,只是在内核空间为包做了一个标记,防火墙内其它程序可以用这种标记对包进行过滤或者高档路由。这个表由五个内建的链组成:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

iptables基础概念

raw

优先级最高,设置raw一般是为了不再让iptables做数据包的链接跟踪处理,提高性能。raw:PREROUTING, OUTPUT。

链的概念

链是数据包传播的路径,一条链就是规则的一个检查清单,每条链可以有一条或者多条规则。如果包头不符合链中的规则,iptables就会根据该链的默认策略来处理数据包。

INPUT链:过滤所有目标地址是本机的数据包(对进入本机数据包的过滤)

OUTPUT链:过滤所有本机产生的数据包(对源地址的数据包过滤)

FORWARD链:过滤所有经过本机的数据包(源地址和目标地址都不是本机的数据包)

POSTROUTING链:在数据包离开防火墙时改变数据包的源地址

PEROUTING链:数据包到达防火墙时改变数据包的目的地址

2、命令

-A 增加一个规则到链中;

-D 在链中的指定位置删除一个规则;

-R 在链中的指定位置替换一个规则;

-I 在链中的指定位置插入一个新的规则;

-N 产生一个新的链;

-X 删除一个空的链;

-P 设置一个链的默认策略;

-L 列出一个链的规则;

-F 清空一个链的所有规则;

-Z 清零一个链里所有规则的包和字节计数器;

3、匹配

根据规则匹配所应有的特征,如源地址、目的地址和协议,将匹配分为五类:

第一类是generic matches:通用匹配,适用于所有的规则

第二类是TCP matches,只能适用于TCP包的匹配

第三类是UDP matches,主要用于UDP包的匹配

第四类是ICMP matches,用于ICMP包的

第五类针对的是特殊状态的,如访问的频率限制等。

匹配条件:

基本匹配条件:无需加载任何模块,由 iptables/netfilter 自行提供;

    [!] -s, --source address[/mask][,...]:检查报文中的源 IP 地址是否符合此处指定的地址或范围;
    [!] -d, --destination address[/mask][,...]:检查报文中的目标 IP 地址是否符合此处指定的地址或范围;
    [!] -p, --protocol protocol
        protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mhor "all"

            {tcp|udp|icmp}
    [!] -i, --in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于 PREROUTING,INPUT 和 FORWARD 链;
    [!] -o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于 FORWARD、OUTPUT 和 POSTROUTING 链;

扩展匹配条件: 需要加载扩展模块,方可生效;

隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p 指明了协议,就表示已经指明了要扩展的模块;
    tcp:

        [!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
        [!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
        [!] --tcp-flags mask comp
            mask is the flags which we should examine, written as a comma-separated list,例如 SYN,ACK,FIN,RST
                comp is a comma-separated list of flags whichmust be set,例如 SYN
                例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要检查的标志位为 SYN,ACK,FIN,RST 四个,其中 SYN 必须为 1,余下的必须为 0;
        [!] --syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“;

    udp
        [!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
        [!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;

    icmp
        [!] --icmp-type {type[/code]|typename}
            echo-request:8
            echo-reply:0

显式扩展:必须要手动加载扩展模块, [-m matchname [per-match-options]];

使用帮助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions

1、multiport 扩展
以离散方式定义多端口匹配;最多指定 15 个端口;
[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
[!] --ports port[,port|,port:port]...:指明多个端口;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT

2、iprange 扩展
指明连续的(但一般不脑整个网络)ip 地址范围;
[!] --src-range from[-to]:源 IP 地址;
[!] --dst-range from[-to]:目标 IP 地址;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP

3、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

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...]
--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

5、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

6、limit 扩展
基于收发报文的速率做匹配;
令牌桶过滤器;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
~]# iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
~]# iptables -I INPUT 2 -p icmp -j REJECT

7、state 扩展
    根据”连接追踪机制“去检查连接的状态;
    conntrack 机制:追踪本机上的请求和响应之间的关系;状态有如下几种:
    NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第
    一次发出的请求;
    ESTABLISHED:NEW 状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的
    通信状态;
    RELATED:相关联的连接;如 ftp 协议中的数据连接与命令连接之间的关系;
    INVALID:无效的连接;
    UNTRACKED:未进行追踪的连接;
[!] --state state
~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT

调整连接追踪功能所能够容纳的最大连接数量:
    /proc/sys/net/nf_contrack_max
已经追踪到到的并记录下来的连接:
    /proc/net/nf_conntrack
不同的协议的连接追踪时长:
    /proc/sys/net/netfilter/

iptables 的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除;当模板满载时,后续的连接可能会超时解決方法一般有两个:

(1) 加大 nf_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.nf_conntrack_max = 393216
net.ipv4.netfilter.nf_conntrack_max = 393216

(2) 降低 nf_conntrack timeout 时间
vi /etc/sysctl.conf
net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120

iptables -t nat -L -n

4、目标

目标是由规则指定的操作,对与那些规则匹配的信息包执 行这些操作:

ACCEPT:当信息包与具有ACCPET目标的规则完全匹配 时,会被接受(允许它前往目的地)。

DROP:当信息包与具有DROP目标的规则完全匹配时,会 阻塞该信息包,并且不对它作进一步处理。

REJECT:该目标的工作方式与 DROP目标相同,但它比 DROP好。REJECT不会在服务器和客户机上留下死套接字。 另外,REJECT会将错误信息发回给信息包的发送方。

处理动作:
-j targetname [per-target-options]
ACCEPT
DROP
REJECT
RETURN:返回调用链;
REDIRECT:端口重定向;
LOG:记录日志;
MARK:做防火墙标记;
DNAT:目标地址转换;
SNAT:源地址转换;
MASQUERADE:地址伪装;
...
自定义链:

三、iptables状态机制

状态机制是一种连接跟踪机制,连接跟踪可以让Netfilter知道某个特定连接的状态,通常运行连接跟踪机制的防火墙称作带有状态机制的防火墙,这种防火墙要比非状态防火墙跟安全,因为它允许编写更严密的规则。几种状态机制组合使用,用来匹配数据包,可以使防火墙效果更加显著。

(1)NEW

表明这个包是第一个遇到的包,即某个连接第一个包,它即将被匹配了,NEW状态。

(2)ESTABLISHED

ESTABLISHED其关注两个方向上的数据传输,而且会继续匹配这个连接报,处于ESTABLISHED状态是比较容易理解的,只要发送并接到应答即为ESTABLISHED的了;一个连接要从NEW变为ESTABLISHED,只要接到响应即可。

(3)RELATED

RELATED是一个繁琐的状态,如果一个连接和某个已知处于ESTABLISHED状态的连接有关系时,就认为是RELATED的了。首先要有一个ESTABLISHED的连接,这个连接再产生一个主连接之外的连接,这个连接就是RELATED的了。

(4)INVALID

INVALID说明数据包是无效的,即不能被识别,导致出现这种情况的因素有几个,比如内存溢出等,收到不知属于哪个连接的错误信息。一般情况下,会采用DROP来处理这个状态的任何东西。

四、规则的检查次序

(1)同类规则(访问同一应用),匹配范围小的放前面;用于特殊处理;

(2)不同类的规则(访问不同应用),匹配范围大的放前面;

(3)应该将那些可由一条规则描述的多个规则合并为一;

(4)设置默认策略;

五、规则优化:

服务器端规则设定:任何不允许的访问,应该在请求到达时给予拒绝;

(1) 可安全放行所有入站的状态为 ESTABLISHED 状态的连接;

(2) 可安全放行所有出站的状态为 ESTABLISHED 状态的连接;

(3) 谨慎放行入站的新请求

(4) 有特殊目的限制访问功能,要于放行规则之前加以拒绝;

六、如何开放被动模式的 ftp 服务?

(1) 装载 ftp 连接追踪的专用模块:
    ~]# modproble nf_conntrack_ftp
(2) 放行命令连接(假设 Server 地址为 172.16.100.67):
    ~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
    ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
(3) 放行数据连接(假设 Server 地址为 172.16.100.67):
    ~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    ~]# iptables -I OUTPUT -s 172.16.100.67 -m state --state ESTABLISHED -j ACCEPT

七、规则的用效期限:

使用 iptables 命令定义的规则,手动删除之前,其生效期限为 kernel 存活期限;

保存规则:

CentOS 6:

~]# service iptables save

将规则保存至/etc/sysconfig/iptables 文件中;

~]# iptables-save /PATH/TO/SOMERULESFILE

CentOS 7:

~]# iptables-save /PATH/TO/SOMERULESFILE

重新载入预存规则文件中规则:

~]# iptables-restore < /PATH/FROM/SOMERULESFILE

CentOS 6:

~]# service iptables restart (重载)


自动生效规则文件中的规则:

(1) 用脚本保存各 iptables 命令;让此脚本开机后自动运行;

/etc/rc.d/rc.local 文件中添加脚本路径:/PATH/TO/SOMESCRIPTFILE

(2) 用规则文件保存各规则,开机时自动载入此规则文件中的规则;

/etc/rc.d/rc.local 文件添加:iptables-restore < /PATH/FROM/IPTABLESRULESFILE

原创文章,作者:N24_yezi,如若转载,请注明出处:http://www.178linux.com/64223

(0)
上一篇 2016-12-19 20:07
下一篇 2016-12-19 21:58

相关推荐

  • 二叉树迭代器算法

    二叉树(Binary Tree)的前序、中序和后续遍历是算法和数据结构中的基本问题,基于递归的二叉树遍历算法更是递归的经典应用。 假设二叉树结点定义如下: // C++ struct Node {     int value;     No…

    Linux干货 2016-08-15
  • 马哥教育网络班22期+第一周课程练习

    计算机的组成及其功能 计算机主要由五大部分组成:控制器、运算器、存储器、输入设备、输出设备,即CPU(控制器、运算器)、内存、I/O(输入/输出设备)。 控制器 是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。 运算器 对数据进行各种算术运算和逻辑运算,即对数据…

    Linux干货 2016-08-15
  • HipHop PHP实战(详解web运行模式)

    Note: These code examples assume the HipHop compiler is fully built. 1 . Setting Up Your Environment (构建环境) To get started, you need to configure two environment variables. cd…

    Linux干货 2015-04-10
  • 马哥教育网络班20期 第9周课程练习

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash #the purpose of program : # #08/11/2016  PATH=/bin:/sbin:…

    Linux干货 2016-08-15
  • OpenSSL

    OpenSSL由三部分组成:             libencrypto库             libssl库 …

    Linux干货 2017-05-30
  • Corosync + Pacemaker 搭建高可用MariaDB服务

    Corosync + Pacemaker 搭建高可用MariaDB服务 实验描述 1.本实验的目的是为了通过手动配置corosync配置文件,实现MariaDB服务的高可用,集群心跳传递使用组播方式。2.三个节点的主机名分别为:node5.redhat.com、node6.redhat.com、node7.redhat.com。地址为172.16.100.5…

    Linux干货 2016-04-06