一、防火墙,iptables和netfilter定义

防火墙是由软件和硬件设备组合而成的一种隔离技术,它工作于网络或主机的边缘(通信报文的进出口),对于进出本网络或主机的数据包根据事先定义的检测规则进行匹配检测,允许或是限制传输的数据包通过

netfilter :内核的一部分,内核中工作在tcp/ip网络协议栈上的框架,由一些数据包过滤表组成,这些表包含内核用户控制数据包过滤处理的规则集。

iptables : administration tool for IPv4 packet filtering and NAT .用来插入、修改和删除数据包过滤表中的规则的管理工具。定义的规则通过内核接口直接送至内核,立即生效,但不会永久有效,如果需要永久有效,需要保存至配置文件中,可以选择开机加载(方法???)或者手动加载。

二、iptables 深入学习

iptables对于每一个chain,都是对其中的rule进行从上到下的匹配,一旦匹配则不再向下匹配,因此在添加rule时要注意-A和-I的差别,一个添加在首部,一个添加在尾部。

基本语法格式:

iptables  [ –t 表名 ]  命令选项  [ 链名 ]  [ 条件匹配 ]  [ –j 目标动作或跳转 ]
Tip:若不指定表名,默认使用filter表。


iptables主要参数

-A 向规则链中添加一条规则,默认被添加到末尾
-t 指定要操作的表,默认是filter
-D 从规则链中删除规则,可以指定序号或者匹配的规则来删除
-R 进行规则替换
-I 插入一条规则,默认被插入到首部
-F 清空所选的链,重启后恢复
-N 新建用户自定义的规则链
-X 删除用户自定义的规则链
-p 用来指定协议可以是tcp,udp,icmp等也可以是数字的协议号,
-s 指定源地址
-d 指定目的地址
-i 进入接口
-o 流出接口
-j 采取的动作,accept,drop,snat,dnat,masquerade,reject
--sport 源端口
--dport 目的端口,端口必须和协议一起来配合使用

注意:所有链名必须大写,表明必须小写,动作必须大写,匹配必须小写


查看策略规则

iptables -L -n

-x  在v的基础上,禁止自动单位换算(k,m)

-v  显示详细信息,包含每条规则的匹配包数量和匹配字节数

-n  只显示ip地址和端口号码,不显示域名和服务名称

-t  接表明,如果不加,默认是-t filter

-L  列出一个或所有的规则


清除规则

iptables -F   清除所有规则

iptables -X  删除用户自定义的链

iptables -Z  链的计数器清零

默认我们是对filter表进行操作


用命令行的操作,只是个临时的操作,如果需要永久的操作,则保存到配置文件里面去。


规则链

prerouting   路由之前

input            进入

output         出去

forward        转发

postrouting    路由之后


nat 地址转换

prerouting

postrouting

    目标地址转换在进入的端口改

    源地址转换在出去的端口改


下面是iptables优先匹配图

wKioL1hkwv_TBy4TAAXywyVHOu4833.png-wh_50

四表五链

raw,mangle,nat,filter

    可以使用自定义链,但只在被调用时才发挥作用,而且如果没有自定义链中的任何规则匹配,还应该有返回机制,用可以删除自定义的空连,默认连无法删除。

每个规则都有两个内置的计数器:被匹配的报文个数,被匹配的报文大小之和。


规则:匹配标准,处理动作

iptables [-t  TABLE]    COMMAND     CHAIN[num]  匹配标准  -j  处理办法


匹配规则

    通用匹配

        -s , --src                      指定源地址

        -d , --dst                     指定目标地址

        -p {icmp,udp,tcp}  指定协议

        -i  interface                   指定数据表问流入的接口

                     用于定义标准的链:PREROUTING,INPUT,FORWARD

        -o interface                   指定数据报文流出的接口

                 用于定义标准的链:OUTPUT,POSTROUTING,FORWARD

                

    -j  target

            ACCE[T

            DROP

            REJECT

iptables  -t filter -A  INPUT  -s 192.168.1.72/32 -d 192.168.103.108/32 -j DROP   


    扩展匹配

        隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用-p {tcp|udp|icmp}

            -p tcp

                --sport  源端口

                --dport  目标端口

                 --tcp-flags mask comp:只检查mask指定的标志位,是逗号分隔的标志位列表,此列表中小狐仙的标记为必须为1,comp中没有出现,而mask中出现的,必须为0;

                    --tcp-flags SYN,FIN,ACK,RST SYN==--syn

                   --syn

            -p icmp

                --icmp-type

                    0:echo-reply    

                     8:echo-request

            -p udp

                --sport

                --dport

            自己ping出去是8,别人回来的是0,

        显示扩展:必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能

            -m EXTESTION --spe-opt

            state  状态扩展

                结合ip_conntrack追踪会话的状态

                    NEW 新链接请求

                    ESTABLISHED:   已建立的链接

                    INVALID:    非法链接

                    RELATED:    相关联的

                -m state --state NEW -j ACCEPT  状态是NEW的都通过

    

  命令:

            管理规则:

                    -A    附加一条规则,添加在链的尾部

                    -I   CHAIN [num]  插入一条规则,插入为对应CHAIN上的第num条

                    -D  CHAIN [num]  删除指定链中的第num条规则

                    -R   CHAIN [num]  替换指定的规则,

            管理链:

                    -F [CHAIN]:flush    清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链

                    -P CHAIN    :设定指定链的默认策略

                    -N         自定义一个新的空链

                    -X          删除一个自定义的空链

                    -Z         置零指定链中所有规则的计数器

                    -E         重命名自定义的链

 查看类

                    -L   显示直到那个表中的规则

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

                                -v     显示链及规则详细信息

                                -vvv 

                                -x     显示计数器的精确值

                                --line-numbers    显示规则号码

  动作(target)

        ACCEPT        放行

        DROP            丢弃

         REJECT        拒绝

         DNAT          目标地址转换

         SNAT            原地址转换

         REDIRECT      端口重定向

          MASQUERADE    地址伪装

          LOG                日志

         MARK                打标记

iptables不是服务,但有服务脚本,服务脚本的主要作用在于管理保存的规则

        装载及卸载模块


允许访问172.16.100.100   sshd     22/tcp

iptables -t filter -A INPUT -s 192.168.0.0/16 -d 172.16.100.100 -p tcp --dport 22 -j ACCEPT

iptables -t filter -A OUTPUT -s 172.16.100.100 -d 192.168.0.0/16 -p tcp --sport 22 -j ACCEPT

允许自己ping通自己

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT

iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT

允许自己ping出去

iptables -A OUTPUT -s 192.168.103.117 -p icmp --icmp-type 8 -j ACCEPT

iptables -A INPUT -d 192.168.103.117 -p icmp --icmp-type 0 -j ACCEPT

修改为默认策略

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD DROP

开启允许web服务

iptables -I INPUT -d 172.16.1.00.100  -p tcp --dport 80 -j ACCEPT

iptables -I OUTPUT -s 172.16.100.100 -p tcp --sport 80 -j ACCEPT


用于连接追踪ip表的状态

iptstate

-t     显示表的总数

cat  /proc/net/ip_conntrack


查看使用的模块

lsmod | grep ip

卸载一个模块

modprobe -r  ip_conntrack

cat /proc/sys/net/ipv4/ip_conntrack_max    设置可以保存多少个ip_conntrack


多端口匹配

    multiport  离散的多端口匹配扩展

        --source-ports

        --destination-ports

        --ports

    -m multiport  --destination-ports 21,22,80 -j ACCEPT  

iptables -I 2 -d 172.16.100.100 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT

    使用!条件取反(英文的!号)


-m   iprange

        --src-range

        --dst-range

 iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

-m  connlimit    链接数限制

        ! --connlimit-above n

            iptables -A INPUT -d 172.16.100.100 -p tcp --dport 80 -m connlimit  ! --connlimit-above 2 -j ACCEPT                      低于两个连接数允许  


-m limit

        --limit RATE

        --limit -burst

iptables -I INPUT -d  172.16.100.100 -p tcp --dport 22 -m limit 5/minute --limit-burst 5 -j ACCEPT

    每分钟5个进来,一下子涌来为5个

iptables -I INPUT -d 172.16.100.100 -p icmp --icmp-type 8 -m limit --limit 5/minute  --limit-burst 5 -j ACCEPT     ping进来前5个包很快,后面是每分钟5个包进来


    -m  string             过滤关键字的内容

                --algo {bm|kmp}

                --string "STRING"

iptables -I OUTPUT -d 172.16.100.100 -m string --algo kmp --string "h7m9" -j REJECT  过滤h7m9内容


-j  TARGET

        LOG

                --log-prefix “STRING”

iptables -I INPUT 4 -d 172.16.100.100 -p icmp --icmp-type 8 -j LOG --log-prefix "--firewall log for icmp--"


NAT

FORWARD


练习:判断规则的意义(调用)

iptables  -N  clean_in

iptables -A clean_in  -d 255.255.255.255 -p icmp -j DROP

iptables -A clean_in  -d 172.16.255.255 -p icmp -j DROP


iptables -A clean_in -p tcp !  --syn -m state --state NEW -j DROP

iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP

iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP

iptables -A clean_in -d 172.16.100.100 -j RETURN


iptables -A INPUT -d 172.16.100.100 -j clean_in


iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT


iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,115,445 -j DROP

iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,113,115,445 -j DROP

iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP


iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT


利用iptables的recent模块抵御dos***

ssh 远程连接

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent  --update --seconds 300 --hitcount 3 --name SSH -j DROP

1.利用connlimit模块将单ip的并发设置为3,会误杀使用nat上网的用户,可以根据实际情况增大该值

2.使用recent和state模块限制单ip在300s内置能与本机建立3个新连接,被限制5分钟即可恢复访问。

第二句是记录访问tcp22端口的新链接,记录名称为ssh

--set 记录数据包的来源ip,如果ip已经存在将更新已经存在的条目

第三句是指ssh记录中ip,300s内发起超过3次链接则拒绝此ip的链接

--update 是指每次建立连接都更新列表

--seconds必须与--rcheck或者--update同时使用

--hitcount必须与--rcheck或者--update同时使用

iptables的记录:/proc/net/ipt_recent/SSH

也可以使用下面这句话记录日志

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "ssh attack"


NAT:network address translation

DNA: 目标地址转换

SNAT:  源地址转换(PORTROUTING, output)

/proc/sys/net/ipv4/ip_forward:1    打开路由功能


        -j SNAT

                --to-source

        -j MASQUERADE     只有外网的地址是自动获取的时候 才使用


iptables -t nat -A PORTROUTING -s 192.168.0.0/16 -j SNAT --to-source 10.10.10.5

来自192.168.0.0网段的ip出去都转换成10.10.10.5

iptalbes -t nat -R PORTFOUTING -s 192.168.0.0/16 -j DNAT --to-destination 10.10.10.5:8080


 -j DNAT

        --to-destination IP[:port]

 PNAT:Port NAT


iptables -A FORWARD -m string --algo kmp --string "xcb" -j DROP

访问内容有xcb的都直接drop掉


l7-filter userr the standard iptalbes extensuion syntax

#iptables [specify table & chain ] -m layer7 --l7proto [protocol name] -j [action]


iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j SNAT --to-source 172.16.1.1

iptables -A RORWARD -s 192.168.0.0/16 -m layer7 --l7proto qq -j DROP


-m time

    --datestart  --datestop

    --timestart   --timestop

iptables -A  FORWARD -s 192.168.0.0/24 -m time --timestart 08:00:00  --timestop 12:00:00 -j DROP


保存配置文件

service iptables save

iptables-save  > /etc/sysconfig/iptables-back      备份配置文件

iptables-restore < /etc/sysconfig/iptables-back   使用它生效


iptables脚本:

#bin/bash

ipt=/usr/sbin/iptables

einterface=eth1

iinterface=eth0

eip=172.168.1.1

iip=192.168.0.254


$ipt -t nat -F

$ipt -t filter -F

$ipt -t mangle -F


$ipt -N clean_up

$ipt -A clean_up -d 255.255.255.255 -p icmp -j DROP

$ipt -A clean_up -j RETURN














                    




简单Iptables使用示例:

1. 在filter表的INPUT链末尾增加一条规则:
iptables -t filter -A INPUT -p tcp -j ACCEPT
2. 在filter表的INPUT链行首增加一条规则:
iptables –I INPUT –p udp –j ACCEPT   ( 此处省略了“-t filter”选项,默认以filter处理)
3. 在filter表的INPUT链中插入一条防火墙规则,做为链的第二条规则
iptables –I INPUT 2 –p icmp –j ACCEPT
4. 查看filter表INPUT链中的所有规则,同时显示规则的序号:
iptables –L INPUT –line-numbers
5. 删除filter表INPUT链中第2条规则:
iptables –D INPUT 2
6. 清空filter、nat、mangle表各链中的所有规则:
iptables –F
iptables –t nat –F
iptables –t mangle –F
7. 设置filter表FORWARD规则链的默认策略为DROP
iptables –P FORWARD DROP


条件匹配示例:

1. 协议匹配:如拒绝进入防火墙的所有icmp协议数据包
iptables –I INPUT –p icmp –j REJECT

允许转发除icmp协议以外的所有数据(使用!可以将条件取反

iptables –A FORWARD ! –p icmp –j ACCEPT

2. 地址匹配:(”-s 源地址”/ “-d 目标地址”)

拒绝转发来自192.168.1.1主机的数据

iptables –A FORWARD –s 192.168.1.1 –j REJECT

3. 网络接口匹配:(“-i 网络接口名”/ “-o 网络接口名”分别对应接收数据包的网卡和发送数据包的网卡)

丢弃从外网接口eth1进入防火墙本机的源地址为私网地址的数据包

iptables –A INPUT –i eth1 –s 192.168.0.0/16 –j DROP

iptables –A INPUT –i eth1 –s 172.16.0.0/12 –j DROP   (这里运用了子网汇总)

iptables –A INPUT –i eth1 –s 10.0.0.0/8 –j DROP

4. 端口匹配:用于检查数据包的TCP或UDP端口号,需要以“-p tcp”或“-p udp”匹配为前提,使用“--sport 源端口”、“--dport 目标端口”的形式。端口可以表示为单个端口号或者用冒号分割的端口范围。

仅允许管理员从192.168.1.0/24网段使用SSH方式远程登录防火墙主机

iptables –A INPUT –p tcp –dport 22 –s 192.168.1.0/24 –j ACCEPT

iptables –A INPUT –p tcp –dport 22 –j DROP

5. TCP标记匹配:在Iptables命令中使用“--tcp-flags  检查范围  被设置的标记”的形式,两个参数“检查范围”和“被设置的标记”均为TCP标记的列表,各标记之间以逗号分割。“检查范围”告诉Iptables需要检查数据包的哪几个标记,“被设置 的标记”则明确匹配对应只为1的标记。【SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送)等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对】

拒绝从外网接口eth1直接访问防火墙本机的数据包,但是允许响应防火墙TCP请求的数据包进入;

iptables –P INPUT DROP

iptables –I INPUT –i eth1 –p tcp --tcp-flags SYN,RST,ACK  SYN –j REJECT

iptables -I INPUT  -i eth1 -p tcp  ! --syn -j ACCEPT

(注:--syn同等于:--tcp-flags SYN,RST,ACK,FIN SYN,详情可以man iptables)

6. ICMP类型匹配:ICMP类型可以使用字符串或数字代码,例如“Echo-Request”(数字代码为8),“Echo-Reply”(数字代码为0),“Destination-Unreachable”(数字代码为3),分别对应ICMP协议的请求、回显、目标不可达数据。

禁止其它主机ping防火墙主机,但是允许防火墙ping其它主机(允许接收ICMP回应数据)。

iptables -A INPUT -p icmp --icmp-type Echo-Request -j DROP

iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT

iptables -A INPUT -p icmp --icmp-type Destination-Unreachable -j ACCEPT

7. 显示条件匹配:这种匹配功能需要额外的内核模块提供,因此需要手工指定匹配方式,在Iptables命令中使用“-m 模块关键字”的形式调用显示匹配,当然还需要指定匹配内容。

a. MAC地址匹配:例如禁止转发来自MAC地址为00:01:12:AA:3F:DD的主机数据包

iptables –A FORWARD –m mac –mac-source  00:01:12:AA:3F:DD –j DROP

b. 多端口匹配:Iptables中使用“—dports 端口列表”,“—sports 端口列表”的形式对应源端口地址列表、目标端口地址列表。

允许防火墙本机开放TCP端口20、21、25、110及被动模式FTP端口1250~1280

iptables –A INPUT –p tcp –m multiport –dports 20,21,25,110,1250:1280 –j ACCEPT

c. 多IP地址匹配:Iptables中使用“--src-range IP地址范围”“--dst-range IP地址范围”的形式对应源IP地址范围、目标IP地址范围。

禁止转发IP地址为192.168.1.1~192.168.1.10的TCP数据包

iptables –A FORWARD –p tcp –m iprange –src-range 192.168.1.1-192.168.1.10 –j DROP

d. 状态匹配:常见的数据包状态包括NEW(与任何连接无关的)、ESTABLISHED(响应请求或已建立连接的)和RELATED(与已有连接相关的)

禁止转发与正常TCP连接无关的非--syn请求数据包(如网络中存在一些非法***数据包)

iptables –A FORWARD –m state –state NEW –p tcp ! –syn –j DROP

 

防火墙规则的导入、导出

直接执行iptables-save命令时,会把当前设置的防火墙规则信息输出到终端。通常情况下,可以使用重定向将信息保存为指定的配置文件,结合系统默认提供的Iptables服务脚本,可以自动加载位置于/etc/sysconfig/iptables文件中的规则配置。

使用iptables-restore命令,可以从已保存的配置文件中导入Iptables规则(该文件必须是使用Iptables-save命令导出的配置数据)。