iptables是系统安全必不可少的,对防范外来入侵,起着巨大的作用.

    iptables 只是防火墙的通告规则,是系统 netfilter 在内核中完成具体功能实现的.

防火墙分两大类.网络层防火墙,应用层防火墙.

防火墙的原理是在报文与主机通讯的必经之路设立通过规则,以实行安全放行.一般主机通讯的必经之路有五个,分别对应五个勾子函数.

hook function

PREROUTING:路由前

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

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

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

POSTROUTING:路由后

防火墙,分四大规则功能表raw, mangle, nat, filter 

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

nat: 地址转换,启用connection_track;

SNAT

DNAT

PNAT

mangle: 

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

iptables 规则的应用_功能表

表和链的对应关系:

filter: INPUT, FORWARD, OUTPUT

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

mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

raw: PREROUTING, OUTPUT


iptables只是用户空间的工具,写规则,并自动发往netfilter,立即生效;所以在编写规则之前,一定要注意的是,写的规则,千万要确保放行自己的连接,以免自己的ssh远程连接都不予放行,将自己挡在外面.

netfilter: 接收并生效规则;


 基本语法:    

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

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

加在哪个表上        命令选项           链接      匹配标准       处理       处理办法

[以上语法格式,只是比较通用,不同的命令,用法不尽相同]


-t TABLE: 

nat, mangle, raw, filter

默认为filter


管理链的命令: 

-F:flush, 清空规则链;

-N:new, 自建一条链

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

-Z:zero,计数器归零

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

-E:重命名自定义链


管理链中的规则

-A :添加

-I :插入

-D : 删除

-R :修改  =>如果要修改一条规则的话,语法顺序要和写的时候对应,所以一般我不使用,通常是新写一条规则在要修改的规则之后,把要改的规则删除


查询规则:

-L

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

-v: 详细格式,-vv, -vvv

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


pkts bytes  target     prot opt in        out         source               destination

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


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


所有命令的使用,如果不带 -t table[指定的表] 则默认使用的是filter表


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

匹配条件:

    通用匹配

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

--src, --source

-d 地址:指定报文目标IP地址匹配的范围;

--dst, --destination

-p 协议:指定匹配报文的协议类型,一般有三种tcp, udp和icmp;

-i INTERFACE: 数据报文流入的接口;PREROUTING, INPUT, FORWARD

-o INTERFACE: 数据报文流出的接口;OUTPUT, FORWARD, POSTROUITING


    扩展匹配

隐式扩展:当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项;

 -p tcp:

--sport PORT[-PORT]: 指定源端口

--dport PORT[-PORT]: 指定目标端口

--tcp-flags 

 -p udp:

--sport 

--dport

-p icmp [-m icmp]    =>网络报文探测协议

--icmp-type   0: echo-reply, ping响应  8: echo-request, ping请求 

iptables


处理目标:

内置目标:

   DROP    一般不给通行的报文悄悄丢弃就好,最好不要使用reject

   REJECT

   ACCEPT


例,写一条规则,允许接收本机ping其它主机的请求回应

[root@apache_13 ~]# iptables -A INPUT -d 172.16.26.13 -p icmp --icmp-type 0 -j ACCEPT

放行本机对其它主机的ping请求

[root@apache_13 ~]# iptables -A OUTPUT -p icmp -j ACCEPT



  显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项;

-m state --state  ==>切记,每一个不同的扩展都要使用一次 -m参数  

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

    multiport: 多端口匹配

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


专用选项:

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

--destination-ports, --dports

--ports


[root@apache_13 ~]# iptables -I INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT 

放行所有访问22,80端口的报文


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

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

专用选项:

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

[!] --dst-range

[root@apache_13 ~]# iptables -I INPUT -p tcp -m multiport --dports 22,80 -m iprange --src-range 172.16.26.1-172.16.26.10 -j ACCEPT 

放行172.16.26.1-10访问本机22,80端口的报文 



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

如,不允许字串里包含有 admin

[root@apache_13 ~]# iptables -A OUTPUT  -m string --string  'admin' --algo kmp -j DROP 


time: 基于时间做访问控制 

专用选项:

--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]

--datestop 

例如,在8-19 至8-20不许访问

[root@apache_13 ~]#iptables -A INPUT -m time --datestart 2014-08-19 --datestop 2014-08-20 -j DROP


--timestart hh:mm[:ss]

--timestop hh:mm[:ss]

例如,在12:00 至 14:00 不许访问

[root@apache_13 ~]# iptables -A OUTPUT -m time --timestart 12:00 --timestop 14:00 -j DROP

--weekdays day[,day]

Mon, Tue,

例如,周一,二不许访问

[root@apache_13 ~]# iptables -A OUTPUT -m time --weekdays Mon,Tue -j DROP


connlimit: 连接数限制,对每IP所能够发起并发连接数做限制;

专用选项:

[!] --connlimit-above [n] 


例如,限制176主机,最大只能有3个ssh连接

[root@apache_13 ~]# iptables -I INPUT 1 -s 172.16.26.176 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP


limit: 速率限制

专用选项:

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

--limit-burst n


例子:每个ip每分钟只能ping 我20下,而且每次只能并发5个ping包

[root@apache_13 ~]# 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 

[root@apache_13 ~]# iptables -I INPUT 3 -s 172.16.10.0/24 -d 172.16.26.13  -p tcp -m multiport --destination-ports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -I OUTPUT 1 -m state --state ESTABLISHED  # 对于所有established状态的包全部放行,那么OUTPUT链上的其他的放行的规则都可以删除了


连接追踪中的状态:

NEW: 新建立一个会话

ESTABLISHED:已建立的连接

RELATED: 有关联关系的连接

INVALID: 无法识别的连接


综合练习1

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

iptables -A OUTPUT -m time --weekdays Mon -m limit --limit 100/s  -m string --string  'admin' --algo kmp -j DROP

 限速        限制每秒100个   过滤字串 过滤 admin     使用 kmp算法  

 



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

/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 规则的应用_功能表_02

配置apache_13有ssh,httpd服务的路由规则

-A INPUT -p tcp -m tcp --dport 80 -m time --weekdays Tue  --datestop 2038-01-19T11:14:07 -m string --string "admin" --algo kmp --to 65535 -j DROP 

-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP 

-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP 

-A INPUT -d 172.16.26.13/32 -p udp -m udp --sport 53 -j ACCEPT 

-A INPUT -d 172.16.26.13/32 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 

-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT 

-A INPUT -s 172.16.26.14/32 -j ACCEPT 

-A INPUT -s 172.16.26.16/32 -j ACCEPT 

-A OUTPUT -s 172.16.26.13/32 -p udp -m udp --dport 53 -j ACCEPT 

-A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT 

-A OUTPUT -p icmp -j ACCEPT 

-A OUTPUT -p tcp -m multiport --sports 22,80 -j ACCEPT 

-A OUTPUT -d 172.16.26.14/32 -p tcp -m tcp --dport 9000 -j ACCEPT 



iptables的规则保存与读取

service iptables save ==>规则保存到了/etc/sysconfig/iptables

还可以保存到自定义的位置

iptables-save > /tmp/iptables.cnf .

哪天想读进来了,可以 iptables-restore <  /tmp/iptables