首页 > 代码库 > 防火墙及netfilter基础iptables基本用法

防火墙及netfilter基础iptables基本用法

iptables

 

firewall:

主机防火墙

网络防火墙

 

工作于主机或网络的边缘,对于进出的报文根据事先定义的规则作检查,将那些能够被规则所匹配到的报文作出相应处理的组件。

 

网络防火墙:

专业的硬件防火墙:

checkpoint,netscreen

主机:

 

iptables: 程序

iptables:规则编写工具

netfilter: 网络过滤器, 内核中工作在TCP/IP网络协议栈上的框架;

 

IDSIntrusionDetecting System

NIDS

HIDS

 

IPS:Intrusion Protec System

 

HoneyPot: 蜜罐

 

kali,(backtrack)

 

OpenBSD:

ipfw

ipchains

iptables/netfilter

 

kernel,framework

 

hooksfunction:

prerouting: 进入本机后路由功能发生之前

input:到达本机内部

output: 由本机发出

forward: 由本机转发

postrouting:路由功能发生之后,即将离开本机之前

 

路由发生的时刻:

报文进入本机后:

判断目标地址

报文离开本机之前:

判断经由哪个接口发出;

 

报文流向经由的位置:

到本内部:prerouting, input

由本机发出:output, postrouting

由本机转发:prerouting, forward, postrouing

 

规则的功能:

过滤:firewall

地址转换:NAT Server

NetworkAddress Translation

mangle:修改报文首部中的某些信息

raw:关闭nat表上启用的连接追踪功能

 

filterinput,forward, output

natprerouting,output, postrouting

mangleprerouting,input, forward, output, postrouting

rawprerouting,output

 

iptables:每个钩子函数上可放置n条规则;对应于每个钩子上的多条规则就称为一个链(CHAIN

每个功能有多个链,所以,就称作表;

技术分享

 

链:链上的规则次序即为检查次序,因此有一定的法则

(1) 同类规则,匹配范围小的放上面;

(2) 不同类规则,匹配报文几率较大的放上面;

(3) 应该设置默认策略;

 

iptables/netfilter

netfilter:framework in kernel

tcp/ip协议栈

 

iptables有四表五链

filter:input, forward, output

添加规则时的考量点:

(1) 要实现的功能:判断添加在哪个表上;

(2) 报文流向及经由路径:判断添加在哪个链上;

 

功能的优先级:

由高而低:

raw--> mangle --> nat --> filter

 

规则的组成部分:

报文的匹配条件, 匹配之后如何处理

 

匹配条件:基本匹配条件、扩展匹配条件

如何处理:内建处理机制、自定义处理机制(自定义的链)

 

注意:报文不可能经由自定义链,只有在被内置链上的引用才能生效(即做为自定义目标)

 

iptables:规则管理工具

自动实现规则的语法检查

 

规则和链有计数器:

pkts: 由规则或链匹配到的报文的个数;

bytes:由规则或链匹配到的所有报文大小之和;

 

链:应该有默认策略;

 

 

iptables命令生成规则,送往netfilter;

规则通过内核接口直接送至内核,因此,会立即生效。但不会永久有效;

如果期望有永久有效,需要保存至配置文件中,此文件还开机时加载和由用户手工加载;

 

iptables[-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET

 

-tTABLE:

默认为filter, 共有filter, nat, mangle, raw四个可用;

 

SUBCOMMAND

链:

-Fflush,清空指定表的指定链上所有规则;省略链名时,清空表中的所有链;

例:

[root@localhost~]# iptables -F INPUT

[root@localhost~]# iptables -F OUTPUT

 

-Nnew, 新建一个用户自定义的链;自定义链只能作为默认链上的跳转对象,即在默认链通过引用来生效自定义链;

例:

技术分享

 

-Xdrop,删除用户自定义的空链非空自定义链内置链无法删除

-Zzero,将规则的计数器置0

-Ppolicy,设置链的默认处理机制;当所有都无法匹配或有匹配有无法做出有效处理机制时,默认策略即生效;

filter表的可用策略:ACCEPT,DROP, REJECT

            例:表明filter的表INPUT链默认为DROP

iptables-t filter -P INPUT DROP

 

-Erename,重命名自定义链;

 

注意:被引用中的链,无法删除和改名

 

规则:

-Aappend,在链尾追加一条规则;

-Iinsert,在指定位置插入一条规则;

-Ddelete,删除指定的规则;

-Rreplace,替换指定的规则;

 

查看:

-Llist,列出指定链上的所有规则;

-n: numeric,以数字格式显示地址和端口号,即不反解;

-v: verbose,详细格式,显示规则的详细信息,包括规则计数器等;

-vv:

-vvv:

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

 

可以显示规则的编号

 iptables -L -n --line-numbers

-x: exactly,显示计数器的精确值;

                                                          

技术分享

 

pktsbytes target     prot opt in     out    source               destination

pkts: 被本规则所匹配到的包个数;

bytes:被本规则所匹配到的所包的大小之和;

target: 处理目标(目标可以为用户自定义的链)

prot: 协议 {tcp,udp, icmp}

opt: 可选项

in: 数据包流入接口

out: 数据包流出接口

source: 源地址

destination: 目标地址;

 

CRETERIA: 匹配条件

检查IP首部,检查TCPUDPICMP首部;

基于扩展机制,也可以进行额外的检查;如做连接追踪;

 

注意:可同时指定多个条件,默认多条件要同时被满足;

 

匹配条件:

 

通用匹配:

[!] -s, --src, --source  IP|Network:检查报文中的源IP地址;

-d, --dst, --destination:检查报文中的目标IP地址;

-p, --protocol:检查报文中的协议,即ip首部中的protocols所标识的协议;tcpudpicmp三者之一;

-i, --in-interface:数据报文的流入接口;通常只用于PREROUTING, INPUT, FORWARD链上的规则;

-o, --out-interface:检查报文的流出接口;通常只用于FORWARD, OUTPUT, POSTROUTING链上的规则;

 

                             

                                            例:替换第一条规则,检查为tcp协议首部

                                            iptables -t filter -R INPUT 1 -s 172.16.250.145 -d 172.16.249.139 -ptcp -j ACCEPT

                                            添加一条icmp协议的

                                            iptables -t filter -R INPUT 1 -s 172.16.250.145 -d 172.16.249.139 -picmp -j ACCEPT

                                             例:INPUT的默认策略改为DROP

                                            iptables -t filter -P INPUTDROP

 

                                           例将原先的第二条规则替换为以eth0端口进入的以icmp协议

                                           [root@localhost ~]# iptables -R INPUT 2 -s 172.16.250.145 -d172.16.249.139 -p icmp -i eth0 -j ACCEPT

                                           [root@localhost ~]# iptables -L -n -v --line-numbers

                                           Chain INPUT (policy DROP 7 packets, 796 bytes)

                                           num   pkts bytes target     prot opt in     out    source              destination        

                                           1     1546  113K ACCEPT     tcp --  *      *      172.16.250.145      172.16.249.139     

                                           2        0     0 ACCEPT     icmp -- eth0   *       172.16.250.145       172.16.249.139

 

扩展匹配:使用iptables的模块实现扩展性检查机制

隐式扩展:如果在通用匹配上使用-p选项指明了协议的话,则使用-m选项指明对其协议的扩展就变得可有可无了;

tcp:

--dportPORT[-PORT]

--sport

--tcp-flagsLIST1 LIST2

LIST1: 要检查的标志位;

LIST2:在LIST1中出现过的,且必须为1标记位;而余下的则必须为0;

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

--syn:用于匹配tcp会话三次握手的第一次;

例:目标的80端口被禁止

iptables -I INPUT 1 -s 172.16.250.145 -d172.16.249.139 -p tcp -m tcp --dport 80 -j DROP-m tcp可以不写)

 

udp:

--sport

--dport

icmp:

--icmp-types

8:echo request

0echo reply

 

练习:

1、放行本机上的sshhttp服务;要求inputoutput策略默认均为DROP

2、开放本机对ping的响应,和ping请求;

 

 

显式扩展:必须指明使用的扩展机制;

-m 模块名称

每个模块会引入新的匹配机制;

 

想知道有哪些模块可用:

rpm-ql iptables

 

小写字母,以.so结尾;

 

multiport扩展:

以离散定义多端口匹配;最多指定15个端口;

 

专用选项:

--source-ports,--sports PORT[,PORT,...]

--destination-ports,--dports PORT[,PORT,...]

--portsPORT[,PORT,...]

 

例子:

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

iptables-I OUTPUT 1 -s 172.16.100.11 -p tcp -m multiport --sports 22,80,443 -j ACCEPT

 

iprange扩展:

指定连续的ip地址范围;在匹配非整个网络地址时使用;

 

专用选项:

[!]--src-range IP[-IP]

[!]--dst-range IP[-IP]

 

示例:

iptables-A INPUT -d 172.16.100.11 -p tcp --dport 23 -m iprange --src-range172.16.100.1-172.16.100.100 -j ACCEPT

iptables-A OUTPUT -s 172.16.100.11 -p tcp --sport 23 -m iprange --dst-range172.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 1 -s 172.16.100.11 -p tcp --sport 80 -m string --string"sex" --algo kmp -j REJECT

 

time扩展:

基于时间区间做访问控制

 

专用选项:

--datestartYYYY[-MM][-DD][hh[:mm[:ss]]]

--dattestop

 

--timestart

--timestop

 

--weekdaysDAY1[,DAY2,...]

 

示例:

#iptables -R INPUT 1 -d 172.16.100.11 -p tcp --dport 80 -m time --timestart08:30 --timestop 18:30 --weekdays Mon,Tue,Thu,Fri -j REJECT

 

connlimit扩展:

基于连接数作限制;对每个IP能够发起的并发连接数作限制;

 

专用选项:

--connlimit-above[n]

 

#iptables -I INPUT 2 -d 172.16.100.11 -p tcp --dport 22 -m connlimit--connlimit-above 5 -j REJECT

 

limit扩展:

基于发包速率作限制;

 

专用选项:令牌桶算法

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

--limit-burstn

 

iptables-R INPUT 3 -d 172.16.100.11 -p icmp --icmp-type 8 -m limit --limit 10/minute--limit-burst 5 -j ACCEPT

 

    

iptables/netfilter(3)

 

显式扩展(续)

connection template:连接追踪模板,用于记录各连接及相关状态;基于IP实现,与是否为TCP协议无关;通过倒计时的方式删除条目;

 

记录连接的状态:

NEW: 新建立的连接,连接追踪模板中无相应的条目时,客户端第一次发出的请求;

ESTABLISHEDNEW状态之后,边距追踪模板中的条目删除之前所进行的通信过程,都称为ESTABLISHED

RELATED:相关联的连接,如ftp协议的命令连接与数据连接即为相关联的连接;

INVALIED: 无法识别的状态;

 

state扩展:启用连接追踪模板记录连接,并根据连接匹配连接状态的扩展;

启用连接追踪功能之前:简单包过滤防火墙;

启用连接追踪功能:带状态检测的包过滤防火墙;

 

专用选项:

--stateSTATE

 

调整连接追踪功能所能容纳的连接的最大数目:

/proc/sys/net/nf_conntrack_max

 

当前追踪的所有连接:

/proc/net/nf_conntrack

 

不同协议或连接类型追踪时的时长属性:

/proc/sys/net/netfilter/

 

如何放行被动模式下的ftp服务:

(1) 装载模块:

#modprobe nf_conntrack_ftp

 

(2) 放行请求报文

放行入站请求端口为21的请求报文;

放行所有状态为ESTABLISHEDRELATED状态的入站报文;

 

(3) 放行出站响应报文

放行所有状态为ESTABLISHED的出站报文;

 

如何保存及重载规则:

保存:

(1)service iptables save

/etc/sysconfig/iptables文件;

 

(2)iptables-save > /PATH/TO/SOMEFILE

 

重载:

(1)service iptables reload

 

(2)iptables-restore < /PATH/FROM/SOMEFILE

 

NATNetwork AddressTranslation

 

仅从请求报文判断,地址转换:

源地址转换:SNAT

目标地址转换:DNAT

端口转换:PNAT

 

NAT Server: 能根据需要实现所谓的SNATDNATPNAT

并非是用户空间运行的进程完成转换功能,靠的是内核中地址转换规则;

 

SNAT:CIP --> SIP: CIP --> SNAT(PIP) --> SIP

CIP: 本地客户端地址

DNATRemoteIP--> PIP: RemoteIP --> DNAT(SIP) --> SIP

RemoteIP:远程客户端地址;

PNAT:端口转换

 

私有的客户端访问互联网的方法:

(1)SNAT

(2)Proxy

 

SNAT:主要用于实现让内网客户端访问外部主机时使用;

注意:要定义在POSTROUTING链;也可以在OUTPUT上使用;

 

定义方法:

iptables -t nat -A POSTROUTING -s 内网网络或主机地址 -j SNAT --to-source NAT服务器上的某外网地址

 

另一个TARGET

MASQUERADE:地址伪装;

能自行判断该转为哪个源地址;

 

iptables -t nat -A POSTROUTING -s 内网网络或主机地址 -j MASQUERADE

 

DNAT:主要用于发布内部服务器,让内网中的服务器在外网中可以被访问到;

注意:要定义在PREROUTING链;

 

iptables -t nat -A PREROUTING -d NAT服务器的某外网地址 -p 某协议 --dport 某端口 -jDNAT --to-destination 内网某服务器地址[:PORT]

 

FULLNAT: 全地址转换

在请求报文到时:既修改源地址,又修改目标地址

 

 

回顾:

state扩展,nat

 

state扩展:

tcp finite state machine: 有限状态机

closed, listen, syn_sent, syn_rcvd,established, fin_wait_1, fin_wait_2, close_wait, last_ack time_wait

 

state: 无论tcp,udp, icmp协议,都能够基于connection track template完成连接追踪;

NEW,ESTABLISHED, RELATED, INVALID

 

内核模块:nf_conntrack, nf_conntrack_ftp

 

专用选项:--state

 

nat: 网络地址转换;用到的表为nat

SNAT:源地址转换;

DNAT:目标地址转换;

FULLNAT:源地址和目标都进行转换;

 

nat表相对应链:PREROUTING,OUTPUT, POSTROUTING

SNATOUTPUT,POSTROUTING

-jSNAT --to-source

-jMASQUERADE

DNATPREROUTING

PNAT

-jDNAT --to-destination IP[:PORT]

 

iptables(4)

 

TARGET:

ACCEPT

DROP

REJECT

 

SNAT

DNAT

MASQUERADE

 

LOG:日志

REDIRECT:端口重定向;

RETURN: 返回至调用者;

MARK:防火墙标记

 

 

练习:INPUTOUTPUT默认策略为DROP

                        iptables -P INPUT DROP

           iptables -P OUTPUT DROP

 

1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;

                      #iptables -A INPUT  -d 172.16.18.1 -p tcp --dport 80 -m time ! --weekdays Mon  limit --limit10/minute --limit-burst 5   

                         ! string --string "admin" --algo kmp -j ACCEPT                

 

                      #iptables -AOUTPUT -s 172.16.18.1 -p tcp --dport 80 -m time ! --weekdays Mon   limit --limit 10/minute --limit-burst 5

                             ! string --string "admin" --algo kmp -j ACCEPT   

 

2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;

                      

                        # iptables -A INPUT  -s 172.16.0.0/16 -d 172.16.18.1 -ptcp --dport 21 -m time--timestart 08:30 --timestop 18:30

                         --weekdays  Mon,Tue,Wed,Thu,Fri  connlimit--connlimit-above 5  -j REJECT

                       

                       #iptables -A  OUTPUT  -s 172.16.18.1 -d 172.16.0.0/16 -p tcp --dport 21 -m time --timestart 08:30 --timestop18:30

                         --weekdays  Mon,Tue,Wed,Thu,Fri  connlimit--connlimit-above 5  -j REJECT

   

 

3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;

iptables -A INPUT -s 172.16.18.1-172.16.18.100  -m  connlimit --connlimit-above 5  -state RELATED -j REJECT

iptables -A OUTPUT -d 172.16.18.1-172.16.18.100  -m  connlimit --connlimit-above 5  -state RELATED -j REJECT

 

4、拒绝TCP标志位全部为1及全部为0的报文访问本机;

                       iptables -A INPUT -d172.16.18.1 -p tcp --tcp-flags  allnone  -j REJECT

                   

 

5、允许本机ping别的主机;但不开放别的主机ping本机;

iptables -A INPUT -d 172.16.18.1 -p tcp --dport 22  -j REJECT

iptables -A OUTPUT -s 172.16.18.1 -p tcp --dport 22 -j ACCEPT

 

练习:判断下述规则的意义:

#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.7 -j RETURN

 

 

#iptables -A INPUT -d 172.16.100.7 -j clean_in

 

#iptables -A INPUT  -i lo -j ACCEPT

#iptables -A OUTPUT -o lo -j ACCEPT

                        运行从lo端口进入以及出去

 

#iptables -A INPUT  -i eth0 -m multiport-p tcp --dports 53,113,135,137,139,445 -j DROP

#iptables -A INPUT  -i eth0 -m multiport-p udp --dports 53,113,135,137,139,445 -j DROP

#iptables -A INPUT  -i eth0 -p udp --dport1026 -j DROP

#iptables -A INPUT  -i eth0 -m multiport-p tcp --dports 1433,4899 -j DROP

 

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

 

 

课外任务:研究recent扩展的用法

 

利用iptablesrecent模块来抵御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 LOG--log-prefix "SSH Attack: "

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.利用recentstate模块限制单IP300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。

 

下面对最后两句做一个说明:

 

1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH

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

 

2.第三句是指SSH记录中的IP300s内发起超过3次连接则拒绝此IP的连接。

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

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

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

 

3.iptables的记录:/proc/net/xt_recent/SSH


防火墙及netfilter基础iptables基本用法