一、机制
部队大院、高档私人住宅区都是在一个被保护起来的范围内,要想进入只能从各个大门进入,在进入的时候还在门口出示证件、或者是指纹识别、或者是保安身份认证等,只有通过了这些检查才能进入到大院、住宅区内部。
Linux系统也是这么一个大院,netfilter就是这个大院的围墙,prerouting、input、output、forward、postrouting就是南大门、北大门、西大门、东大门、西南门。要想从这几个门进入到内部来,就得过门禁。但是每大门上的门禁制度和方法不一样,raw(刷指纹)、mangle(打卡)、filter(出示有效证件)、nat(保安确认)。
于是便有了哪些门禁制度制用在哪些大门上的事情了。
南大门(prerouting),可以通过刷指纹(raw)、mangle(打卡)、保安确认(nat)其中的一种便可以进入。
其他大门上也各有各的门禁制度,这些大门被称为链(chain)、这些门禁制度被称为表(tables).
具体分布如下图:
需要说明的是,这是centos6.x系列的,7.x系列的input链增加了nat
报文的流向可以分为以下三种情况:
到本机某进程的报文:PREROUTING –> INPUT
由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING
由本机的某进程发出报文:OUTPUT –> POSTROUTING
二、对链的操作
总结起来就是:增、删、改、查
iptables -t 表名 {-E,-F,-N,-P,-X,-Z} 链名
-P:定义链的默认策略;其target一般可使用ACCEPT或DROP;
举例:iptables -P INPUT drop iptables -t nat -P INPUT drop
-N:自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数;
实例:iptables –t 表名 –N 链名(自己定义的链的链名)
-X:只能删除自定义的空的引用计数为0的链;
实例:iptables -t 表名 -X 链(名)
-F:清空指定的链,或删除指定链上的规则;
实例:iptables –t 表名 –F 链名或者是链名 规则编号
-E:重命名自定义的引用计数为0的链;
实例:iptables –t 表名 –E 旧的链名 新的链名
-Z:清空所有链或指定链上的计数器或者是指定链上的指定规则的计算器
实例:iptables –t 表名 –Z [链名或链名 规则编号]
三、对表的操作
处理动作也可以总结为:增、删、改、查
4个参数
iptables -t 表名 {-A,-D,-I,-R} 链名 其他操作 –à固定格式 不加-t 表名 默认 –t filter
-A:追加规则到指定的链尾部;
实例:iptables -t 表名 –A 链名 规则定义 –à追加到链尾部
-I:插入规则到指定的链中的指定位置,默认为链首;
实例:iptables -t 表名 -I 链名 规则编号 规则定义 à指定插入到链的指定位置
当规则编号不写的时候表示插入成为第一行
-D:删除指定的链上的指定规则;
实例:iptables –t 表名 -D 链名 规则定义
实例:iptables –t 表名 -D 链名 规则编号
-R:将指定的链上的指定规则替换为新的规则;
实例:iptables –t 表名 -R 链名 规则编号 规则定义—>就是规则修改,但是修改太麻烦,于是直接替换
PS:一个链和表结合的查看的命令
查看
-L:list, iptables [-t table] -L [chain [rulenum]] [options…]
-n:数字格式;
– v:详细格式信息; -vv, -vvv :v的个数越多显示信息越详细
–line-numbers:显示链上的规则的编号;
-x:exactly,显示计数器的精确值;不做取整处理
实例:iptables –t 表名 -vnL iptables –t 表名 –vnL 链名 规则编号
一般的 –L 要和-n组合使用的
计数器:
每条规则以及链的默认策略分别有各自的两个计数器:
(1) 匹配到的报文的个数:pkts
(2) 匹配到的所有报文的大小之积:bytes
[root@localhoast ~]# iptables –nvL
Chain INPUT (policy ACCEPT 4538 packets, 454K bytes)第一个是报文个数 第二个是报文的大小
pkts bytes target prot opt in out source destination
四、对iptables规则的制定操作
固定的格式
iptables -t 表名 大写字母的命令 链名 匹配标准 -j 目标(规则)
匹配条件的分类:
基本匹配条件
扩展匹配条件
隐式扩展
显式扩展
基本匹配条件
前面的!表示取反 包括:源、目标ip、网卡名称、协议名称
-s指定一个源ip的范围 不写-s就表示所有的ip
实例:iptable -t 表名 –A 链名 -s 192.168.2.0/24
匹配指定主机之外的地址。
#iptables -A FORWARD -s !192.168.0.19
-d指定一个目标ip的范围 不写-d表示所有的ip
-p:检查报文中传输层的协议类型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 "all";
实例:iptables –t表名 –A 链名 -p 协议名
iptables -t 表名 -A 链名 -p !协议名à除了这个协议之外的全部的协议
-i:检查报文进入本机时的接口是否符合本处指定的接口;INPUT, FORWARD and PREROUTING ;
实例:iptables –t 表名 –A 链名 –i 网卡名称
-o:检查报文即将离开本机时经由的接口是否符合本处指定的接口;FORWARD, OUTPUT and POSTROUTING;
实例:iptables –t 表名 –A 链名 –o 网卡名称
-m:显式指明要使用的扩展模块;
-j:跳转目标;
扩展匹配条件
调用netfilter额外模块实现特殊检查机制,(使用到相关功能,要使用iptables命令的-m选项来指定调用哪个模块)
隐式扩展:
-p tcp [-m tcp]
–sport PORT[-PORT]
–dport
–tcp-flag 要检查标志位列表(用逗号分隔) 必须为1的标志位列表(逗号分隔)
-p icmp [-m icmp]
–icmp-type
0: echo-reply, ping响应
8: echo-request, ping请求
iptables -t filter -A INPUT -p icmp –icmp-type 8 -j DROP iptables -t filter -A INPUT -p tcp –tcp-flags syn,ack,rst,fin syn -j DROP iptables -t filter -A INPUT -p tcp –dport 80 –tcp-flags all none -j DROP |
显式扩展:
-m 扩展模块名称
模块:iptables,netfilter各拥有一部分代码
multiport: 多端口匹配,可用于匹配非连续或连续端口;最多指定15个端口;
–source-ports, –sports port[,port,port:port]
–destination-ports, –dports
–ports
iptables -I INPUT -d 192.168.19.128 -p tcp -m multiport –dports 22,80 -j ACCEPT iptables -I OUTPUT -s 192.168.19.128 -p tcp -m multiport –ports 22,80 -j ACCEPT |
iprange: 匹配指定范围内的地址,匹配一段连续的地址而非整个网络时有用;
[!] –src-ragne IP[-IP]
[!] –dst-range
iptables -A INPUT -d 192.168.19.128 -p tcp –dport 23 -m iprange –src-range 192.168.19.129-192.168.19.135 -j ACCEPT iptables -A OUTPUT -s 192.168.19.128 -p tcp –sport 23 -m iprange –dst-range 192.168.19.129-192.168.19.135 -j ACCEPT |
string: 字符串匹配,能够检测报文应用层中的字符串
–algo {kmp|bm}
–string "STRING"
–hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串;
iptables -I OUTPUT -m string –algo bm –string "sex" -j DROP
time: 基于时间做访问控制
–datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
–datestop
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
–weekdays day[,day]
iptables -I INPUT -d 192.168.19.128 -p tcp –dport 80 -m time –timestart 08:20 –timestop 18:00 –weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit: 连接数限制,对每IP所能够发起并发连接数做限制;
[!] –connlimit-above
iptables -A INPUT -d 172.16.100.7 -p tcp –dport 22 -m connlimit –connlimit-above 2 -j DROP
limit: 速率限制
–limit n[/second|/minute|/hour|/day]
–limit-burst n
iptables -A INPUT -d 192.168.19.128 -p icmp –icmp-type 8 -m limit –limit 20/minute –limit-burst 5 -j ACCEPT
state: 状态检查
–state 连接追踪中的状态:
NEW: 新建立一个会话
ESTABLISHED:已建立的连接
RELATED: 有关联关系的连接
INVALID: 无法识别的连接
iptables -t filter -A OUTPUT -p tcp –sport 22 -m state –state NEW -j DROP
放行被动模式下的FTP服务:
1、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
模块:nf_conntrack_ftp
modprobe nf_conntrack_ftp lsmod | grep nf_conntrack_ftp nf_conntrack_ftp 12913 0 nf_conntrack 79758 3 nf_conntrack_ftp,nf_conntrack_ipv6,xt_state |
2、放行请求报文:
(1)放行NEW状态对21端口请求的报文;
iptables -A INPUT -p tcp –dport 21 -m –state NEW -j ACCEPT
(2) 放行ESTABLISHED以及RELATED状态的报文
iptables -A INPUT -m –state ESTABLISHED,RELATED -j ACCEPT
3、放行响应报文:
(1) 放行ESTABLISHED以及RELATED状态的报文
iptables -A OUTPUT -m –state ESTABLISHED,RELATED -j ACCEPT
由于系统对调整连接追踪功能所能容纳的连接有最大数目,视具体清空调整最大连接数目,或者不启用此功能
cat /proc/sys/net/nf_conntrack_max
65536
其中当前追踪的所有连接在/proc/net/nf_conntrack中
/proc/net/nf_conntrack
不同协议或连接类型追踪时的属性,/proc/sys/net/netfilter目录:
TARGET: (-j target)
ACCEPT, REJECT, DROP, SNAT, DNAT, MASQERADE, RETURN, LOG, REDIRECT, MARK
SNAT:
–to-source SIP
DNAT
–to-destination
iptables -t nat -A POSTROUTING -p tcp –dport 23210 -j SNAT –to-source 192.168.19.129 iptables -t nat -A PREROUTING -p tcp –dport 23220 -j DNAT –to-destination 192.168.19.129 iptables -A INPUT -d 192.168.19.128 -p tcp –dport 80 -j LOG –log-prefix "from iptables: |
原创文章,作者:hanlln1,如若转载,请注明出处:http://www.178linux.com/66533