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: 全地址转换,在请求报文到时:既修改源地址,又修改目标地址。