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

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

Machine generated alternative text:raw: PREROUTING mange: PREROUTING nat: PREROUTING raw: OUTPUT mangle: OUTPUT nat OUTPUT filter: OUTPUT mange: POSTROUTING mangle tilter: INPUT INPUT tilter: FO WARD nat: POSTROUTING

 

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

(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, 新建一个用户自定义的链;自定义链只能作为默认链上的跳转对象,即在默认链通过引用来生效自定义链;

例:

Machine generated alternative text:Crcct@LccaLhcst Crcct@LccaLhcst Chain INPUT (policy rpt ab Les rpt ab Les ACCEPT) s cur ce —N —L cd chen —n target prot opt de st ion de st ion de st ion de st ion Chain FORWARD (policy ACCEPT) target prot opt source Chain OUTPUT (policy ACCEPT) target p rot opt source references) opt source Chain cdchen (O target p rot

 

-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,显示计数器的精确值;

                                                          

Machine generated alternative text:Cha Ln pkts Chain pkts Chain pkts Chain pkts Crcct@LccaLhcst (policy ACCEPT 1645 bytes target rpt ables —L prot opt -n packets, 163K bytes) In cut scurce de st ion de st ion de st ion de st ion FORWARD (policy ACCEPT o packets, O bytes) bytes target prot opt 172 opt opt In cut s curce OUTPUT (policy ACCEPT packets, 1566B bytes) bytes target prot In In cut cut s cur ce s curce cdchen (O references) bytes target p rot

 

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