iptables: 程序

iptables:规则编写工具

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

hooks function:钩子函数 

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

input:到达本机内部

output: 由本机发出

forward: 由本机转发

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

报文流向经由的位置:

到本机内部:prerouting, input

由本机发出:output, postrouting

由本机转发:prerouting, forward, postrouing

规则的功能:

过滤:firewall,

地址转换:NAT Server:Network Address Translation

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

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

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

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

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

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

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

(3) 应该设置默认策略

iptables有四表五链

filter, input, forward, output

添加规则时的考量点:

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

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

功能的优先级由高而低:raw --> mangle --> nat --> filter

iptables:规则管理工具可以自动实现规则的语法检查,并送往netfilter。iptables命令生成规则,送往netfilter 。规则通过内核接口直接送至内核,因此,会立即生效,但不会永久有效,如果期望有永久有效,需要保存至配置文件中,此文件还开机时加载和由用户手工加载。

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

-t TABLE:默认为filter, 共有filter, nat, mangle, raw四个可用;

SUBCOMMAND:

链:

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

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

-X:drop,删除用户自定义的空链;非空自定义链和内置链无法删除;

-Z:zero,将规则的计数器置0;

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

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

-E:rename,重命名自定义链;

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

规则:

-A:append,在链尾追加一条规则;

-I:insert,在指定位置插入一条规则;

-D:delete,删除指定的规则;

-R:replace,替换指定的规则;

查看:

-L:list,列出指定链上的所有规则;

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

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

-vv:

-vvv:

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

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

pkts bytes target  prot opt in   out  source   destination

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

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

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

prot: 协议 {tcp, udp, icmp}

opt: 可选项

in: 数据包流入接口

out: 数据包流出接口

source: 源地址

destination: 目标地址;

CRETERIA: 匹配条件

检查IP首部,检查TCP、UDP或ICMP首部;

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

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

匹配条件:

通用匹配:

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

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

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

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

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

实例1,允许主机192.168.2.101 和192.168.2.114 进行连接。

[root@lys ~]# iptables -t filter -A INPUT -s 192.168.2.101 -d 192.168.2.114 -j ACCEPT

实例2,允许主机192.168.2.101 和192.168.2.114通过tcp协议进行连接。

[root@lys ~]# iptables -t filter -R INPUT 1 -s 192.168.2.101 -d 192.168.2.114 -p tcp -j ACCEPT

实例3.将INPUT链的规则改为DROP,测试WEB服务,并尝试ping主机192.168.2.114。结果可以正常访问web服务,但是无法ping通主机192.168.2.114。

[root@lys ~]# iptables -t filter -P INPUT DROP

可以看到INPUT链的第一条规则起了作用,对tcp协议的包是放行的,所以可以正常访问web服务。而icmp协议默认则是DROP。为了能够ping通,进行如下操作就行。

[root@lys ~]# iptables -t filter -A INPUT -s 192.168.2.101 -d 192.168.2.114 -p icmp -j ACCEPT 

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

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

tcp:

--dport PORT[-PORT]

--sport

--tcp-flags LIST1 LIST2

LIST1: 要检查的标志位;

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

实例4.禁止主机 192.168.2.101 和 192.168.2.114基于TCP的22端口连接

[root@lys ~]# iptables -I INPUT 1 -s 192.168.2.101 -d 192.168.2.114 -p tcp -m tcp --dport 22 -j REJECT

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

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

udp:

--sport

--dport

icmp:--icmp-type

8: echo request

0:echo reply

实例5.允许本机ping其他任何主机,而其他主机无法ping通本机

[root@lys ~]# iptables -I INPUT 1 -d 192.168.2.114 -p icmp --icmp-type 0 -j ACCEPT 

[root@lys ~]# iptables -I OUTPUT -s 192.168.2.114 -p icmp  --icmp-type 8 -j ACCEPT

[root@lys ~]# ping 192.168.2.101

PING 192.168.2.101 (192.168.2.101) 56(84) bytes of data.

64 bytes from 192.168.2.101: icmp_seq=1 ttl=64 time=0.382 ms

64 bytes from 192.168.2.101: icmp_seq=2 ttl=64 time=0.427 ms

64 bytes from 192.168.2.101: icmp_seq=3 ttl=64 time=0.465 ms

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

-m 模块名称

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

想知道有哪些模块可用:rpm -ql iptables

小写字母,以.so结尾;

multiport扩展:

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

专用选项:

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

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

--ports PORT[,PORT,...]

例子:

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

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

iprange扩展:

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

专用选项:

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

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

示例:

iptables -A INPUT -d 192.168.2.114 -p tcp --dport 23 -m iprange --src-range 192.168.2.1-192.168.2.100 -j ACCEPT

iptables -A OUTPUT -s 192.168.2.114 -p tcp --sport 23 -m iprange --dst-range 192.168.2.1-192.168.2.100 -j ACCEPT

string扩展:

检查报文中出现的字符串,与给定的字符串作匹配;

字符串匹配检查算法:

kmp, bm

专用选项:

--algo {kmp|bm}

--string "STRING"

--hex-string "HEX_STRING":HEX_STRING为编码成16进制格式的字串;

示例:

iptables -I OUTPUT 1 -s 192.168.2.114 -p tcp --sport 80 -m string --string "kill" --algo kmp -j REJECT

time扩展:

基于时间区间做访问控制

专用选项:

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

--dattestop

--timestart

--timestop

--weekdays DAY1[,DAY2,...]

示例:

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

connlimit扩展:

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

专用选项:

--connlimit-above [n]

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

注意:已打开的终端,不计算在内。

limit扩展:

基于发包速率作限制;

     专用选项:令牌桶算法

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

--limit-burst n

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

state扩展:

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

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

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

专用选项:

--state STATE

[root@lys ~]# iptables -I INPUT -d 192.168.2.114 -m state --state ESTABLISHED -j ACCEPT 

[root@lys ~]# iptables -I INPUT -d 192.168.2.114 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT 

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

/proc/sys/net/nf_conntrack_max

当前追踪的所有连接:

/proc/net/nf_conntrack

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

/proc/sys/net/netfilter/

如何保存及重载规则:

保存:

(1) service iptables save

/etc/sysconfig/iptables文件;

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

重载:

(1) service iptables reload

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

NAT:Network Address Translation

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

源地址转换:SNAT

目标地址转换:DNAT

端口转换:PNAT

NAT Server: 能根据需要实现所谓的SNAT、DNAT或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

注意:要确保本机开通了基于ip的转发

[root@lys ~]# cat /proc/sys/net/ipv4/ip_forward

0

[root@lys ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

[root@lys ~]# cat /proc/sys/net/ipv4/ip_forward

1

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

注意:要定义在PREROUTING链

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

FULLNAT: 全地址转换,在请求报文到时:既修改源地址,又修改目标地址。