1、linux网络防火墙及netfilter基础原理

2、netfilter基础原理及iptable入门

3、iptable 基础框架及扩展匹配

4、iptable扩展匹配


一、linux防火墙及netfilter基础原理

    防火墙(Firewall)有主机防火墙和网络防火墙之分、有硬件防火墙和软件防火墙之分。

    防火墙是工作与主机或网络边缘对进出的报文根据定义的规则作检查,进而对被匹配规则的报文做出相应处理的套件;

    IDS:(Intrusion Detect System ***检查系统),HIDS(Host IDS),NIDS(Network IDS)

    IPS:(Intrusion Protect System ***防御系统),

    iptable :网络层防火墙  iptable/netfilter

    ipfw--ipchains--iptables:让用户编写规则,再把规则应用到netfilter(卡哨)

    netfilter:framework

        hook function(钩子函数--链)

            PREROUTING:路由前

            INPUT:到达本机内部的报文的必经之路

            FORWARD:由本机转发的报文的必经之路

            OUTPUT:由本机发出的报文的必经之路

            POSTROUTING:路由后


    规则的功能:(这4个功能叫做表)优先级:raw--mangle--net--filter

        raw,主要目标是关闭nat表上启用的连接追踪功能,提供效率

        mangle,转换tcp/ip报文首部的某些特性

        net,地址转换,启用connection_track,SNAT(源地址转换)、DNAT、PNAT

        filter,过滤,定义是否允许通过防火墙


    表和链的对应关系:

        filter :INPUT ,FORWARD ,OUPUT

        net : PREOUTING(SNAT),POSTROUTING(DNAT),OUTPUT(很少用)

        mangle:PREROUTING,INPUT,FORWORD,OUTPUT,POSTROUTING

        raw:PREROUTING,OUTPUT

        第二十五天 IPtable基础框架、扩展匹配及防火墙原理、iptable入门_第1张图片


    数据报文流程:

        跟本机内部进程通信:

            进入:PREROUTING,INPUT

            出去:OUTPUT,POSTROUTING

        由本机转发:PREROUTING,FORWORD,POSTROUTING

        数据报文的流向:源IP和目标IP由流向决定


 注 :iptables传输数据包的过程,图解

        第二十五天 IPtable基础框架、扩展匹配及防火墙原理、iptable入门_第2张图片


二、netfilter基础原理及iptables入门

     iptables:用户空间的工具,写规则,并自动发往netfilter,立即生效。

     netfilter:接收并生效规则


     规则基本语法:

        iptables [-t TABLE] [COMMAND] CHAIN  CRETIRIA -j TARGET

            -t TABLE: nat ,mangle,raw ,filter(默认)

            COMMAND:通常使用范围小的规则放在前面,

                链:-F :flush,清空规则链

                    -N :new,自建一条链

                    -X :delete,删除一条自定义的空链

                    -Z :zero,计数器归零

                    -P :policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP

                    -E :重命名自定义链


                链中的规则:-A 在链的尾部附加一条规则

                            -I 在链中插入一条新规则

                            -D 删除规则

                            -R 修改或替换规则

                        查询:-L 

                                -n:数字格式显示主机地址和端口

                                -v:详细格式,-vv

                                --line-numbers:显示规则编号

            查询:iptables -L -n -v

                 #pkts  bytes  target  prot opt   in       out      source  destination

                 包数  字节数 目标    协议 选项 流入接口 流出接口  源地址  目标地址

                    -x:exactly ,不要对计数器的计数结果做单位换算,而显示其精确值

            第二十五天 IPtable基础框架、扩展匹配及防火墙原理、iptable入门_第3张图片

            第二十五天 IPtable基础框架、扩展匹配及防火墙原理、iptable入门_第4张图片


        iptables [-t TABLE] -A 链名 匹配条件 -j  处理目标

            匹配条件:

                通用匹配:

                        -s 地址:指定报文源IP地址匹配的范围,IP或网络地址,可以!取反

                            --src, --source

                        -d 地址:指定报文目标地址的匹配范围,IP或网络地址,可以!取反

                            --dst,--destination

                        -p 协议:指定匹配报文协议类型,

                        -i INTERFACE:数据报文流入的接口,pretouting ,input,forward

                        -o INTERFACE:数据报文流出的接口,output,forward,postrouting

                扩展匹配:

                        隐式扩展:当使用-p {tcp|udp|icmp}

                            -p tcp:

                                --sport PORT:指定源端口

                                --dport PORT:指定目标端口

                                --tcp-flags

                            -p udp:                                

                                --sport PORT:指定源端口

                                --dport PORT:指定目标端口

                                --tcp-flags

                        显式扩展:必须明确说明使用哪个模块扩展

            处理目标:

                内置目标:DROP ,REJECT,ACCEPT

                自定义的链:

            例,拒绝172.16.0.0 网段ping 172.16.100.7 主机

             #iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p icmp -j DROP

             #iptables -L -n  查看规则 或  #watch -n 1 'iptables -L -n -v'

            例,拒绝172.16.0.0 网段访问172.16.100.7 http 的80 端口

             #iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 80 -j DROP   

三、iptables基础框架及扩展匹配

    

netfilter:5 hook functions


    功能:filter, nat, mangle, raw


filter: INPUT, FORWARD, OUTPUT

nat: PREROUTING(DNAT), POSTROUTING(SNAT), OUTPUT(SNAT)

mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

raw: POSTROUTING, OUTPUT


写规则:先确定功能(表),确定报文流向,确定要实现的目标,确定匹配条件


流向:

与本机进程通信:

流入: -->PREROUTING-->INPUT

流出:  -->OUTPUT-->POSTROUTING


经由本机转发:

        请求:-->PREROUTING-->FORWARD-->POSTROUTING

响应:-->PREROUTING-->FORWARD-->POSTROUIING

规则中如果限定原地址、目标地址、源端口、目标端口等与流向相关的设定


写规则时要注意:

服务端:先进后出

客户端:先出后进

客户端端口是随机的,因此大多数场景下无须限定


iptables --> 语法检查 --> netfilter

规则立即生效


切记:先添加放行自己会话


规则文件:/etc/sysconfig/iptables


保存启用中的规则于规则文件中:

1、# iptables-save > /etc/sysconfig/iptables

2、# service iptables save


生效规则文件中的规则:

1、# iptables-restore < /etc/sysconfig/iptables

2、# service iptables restart

执行的操作:清空现有规则,读取并生效规则文件中的规则


iptables [-t TABLE]  COMMAND CHAIN CRETIERIA -j TARGET

链:

-F:flush

-N:new

-X: Delete

-Z: zero

-P: Policy

-E: rEname

规则:

-A:Append

-I: Insert

-D:Delete

-R:Replace


查看:

-L: List

-n: numeric

-v, -vv, -vvv

-x: eXactly

--line-numbers


匹配条件:

通用匹配:

-s, --src, --source: 

-d, --dst, --destination: 

-p {tcp|udp|icmp}:

-i IN_IF:

-o OUT_IF:

扩展匹配:调用netfilter额外模块实现特殊检查机制,(使用到相关功能,要使用iptables命令的-m选项来指定调用哪个模块)

隐式扩展:

-p tcp [-m tcp]

--sport PORT[-PORT]

--dport

--tcp-flag 要检查标志位列表(用逗号分隔)  必须为1的标志位列表(逗号分隔)

例如:--tcp-flags syn,ack,rst,fin syn

all none

    --syn

-p udp [-m udp]

--sport

--dport

-p icmp [-m icmp]

--icmp-type

0: echo-reply, ping响应

8: echo-request, ping请求

显式扩展: 

        -m 扩展模块名称


模块:iptables,netfilter各拥有一部分代码


multiport: 多端口匹配

可用于匹配非连续或连续端口;最多指定15个端口;


专用选项:

--source-ports, --sports port[,port,port:port]

--destination-ports, --dports

--ports


例子:

# iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT

# iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT



iprange: 匹配指定范围内的地址;

匹配一段连续的地址而非整个网络时有用;


专用选项:

        [!] --src-ragne IP[-IP]

[!] --dst-range


# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT

# iptables -A OUTPUT -s 172.16.100.7 -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,


# iptables -I INPUT -d 172.16.100.7 -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: 速率限制

专用选项:

--limit n[/second|/minute|/hour|/day]

--limit-burst n


例子:

# iptables -A INPUT -d 172.16.100.7 -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目录:


放行被动模式下的FTP服务:

1、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/

模块:nf_conntrack_ftp


2、放行请求报文:

(1)放行NEW状态对21端口请求的报文;

 (2) 放行ESTABLISHED以及RELATED状态的报文


3、旅行响应报文:

  (1) 放行ESTABLISHED以及RELATED状态的报文





网上的一篇 iptables 全攻略 相当不错:http://www.linuxso.com/linuxpeixun/10332.html