规则文件(配置文件):/etc/sysconfig/iptables
保存启用中的规则于配置文件中:
1、#iptables -save > /etc/sysconfig/iptables
2、#service iptables save
生效规则文件(配置文件)中的规则
1、#iptables-restore < /etc/sysconfig/iptables
2、#service iptables restart
执行的操作,清空现有规则,读取并生效规则文件中的规则
基本语法格式:
iptables [ -t TABLES ] COMMAND CHAIN CRETIRIA -j TARGET
表 规则 链 匹配条件 动作
-t TABLES:
nat,mangle,raw,filter
COMMAND:(CHAIN)
链:(链中的规则):
-F:flush,清空规则连:
-N:new,自建一条链
-X:delete,删除一条自定义链
-P:policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP:
-E:重命名自定义链
-A:链尾部增加一条规则
-D:删除一条规则 iptables [ -t table ] -D chain rulenum
-R:替换一条规则 iptables [ -t table ] -R chain rulenum rule-specification
-I:插入一条规则 iptables [ -t table ] -I chain rulenum rule-specification
查询:
-L:list
-n:数字格式显示主机地址和端口
-v:详细格式,-vv,-vvv
--line-number:显示规则编号
-x:exactly,精确显示数值
pkts bytes target prot opt in out source destination
包数 字节数 目标 协议 流入借口 流出借口 原地址 目标地址
CRETIRIA(匹配条件):
匹配条件:
通用匹配:
-s 地址:指定报文源IP地址匹配的范围:(可以是IP也可以是网络地址:可以使用!取反)
--src, --source
-d 地址:指定报文目标IP地址匹配的范围:
--dis,--destination
-p 协议:指定匹配报文的协议类型,一般有三种tcp,udp和icmp
-i interface:数据报文流入的接口:入方向(prerouter,input,forward)
-o interface:数据报文流出的接口:出方向(output,forward,postrouter)
扩展匹配:调用netfilter额外模块实现特殊检查机制,(使用到相关功能,要使用iptables命令 -m
来调用相关模块)
隐式扩展:当使用 -p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项
-p tcp [ -m tcp ]
--sport PORT[-PORT]
--dport
--tcp-flag 要检查标志位列表(用逗号分隔) 必须为1的标志位列表(逗号分隔)
例如: --tcp-flags syn,ack,rst,fin syn
检查 syn,ack,rst,fin 标志位,syn必须为1。其他为0
--syn
all 为所有位,none 为没有
iptables -I INPUT -p -tcp --tcp-flags all all -j drop (标志位全1 drop)
iptables -I INPUT -p -tcp --tcp-flags all none -j drop (标志位全0 drop)
-p udp [ -m udp ]
--sport
--dport
显示扩展:必须明确说明使用那个模块进行扩展
-m 扩展模块名称
模块:iptables,netfilter各拥有一部分代码,必须都拥有对应模块,才能使用。
multiport:多端口匹配
可用于匹配非连续或连续端口
专用选项:
--source-ports,--sports port[,port,port:port]
--destination-ports,--dports
--ports
iprange:匹配指定范围内的地址:
匹配一段连续的地址而非整个网络时有用
专用选项: !取反
[!]--src-ragne IP [IP]
--dst-range
string:字符串匹配。能够检查报文应用层中的字符串。
字符匹配检查高效算法
kmp,bm
专用选项:
--algo {kmp|bm}
--string "STRING" 检查(匹配)字串
--htx-string "HEX_STRING: HEX_STRING为编码为16进制的字串
time:基于时间做访问控制
专用选项:
--datestart YYYY[-MM][-DD[Thh][:mm][:ss]]
--datestop
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day]
mon,tue
connlimit:连接数限制,对每个IP所能够发起并发连接数做限制:
专用选项:
[!]--connlimit-above [n] :连接数限定 !可取反
limit:速率限制
专用选项:
--limit n[/second|/minute/hour/day]
--limit-burst n
state:状态检查。(内核中划一段空间存储条目,来识别报文是否来访问过)
(并发大的不建议开启此功能,会导致条目空间满载从而拒绝访问)
专用选项:--state [new| ESTABLISHED|RELATED| INVALID}
链接追踪中的状态:
NEW:新建立一个回话
ESTABLISHED:已建立的连接
RELATED:有关联关系的连接
INVALID:无法识别的连接
调整链接追踪功能所能容纳的连接的最大数目
/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以及RALATED状态的报文
3、放行响应报文
(1)放行ESTABLISHED以及RALATED状态的报文
-j TARGET
ACCEPT:允许通过
DROP:拒绝通过
REJEDT:拒绝通过,并给予回应
自定义链
自定义链使用方法:
建立一个定义链,在主链中使用一条匹配规则跳转到自定义链,自定义链开始生效,按顺序匹配自定义链,如果自定义链中有RETURN就会返回主链继续匹配下去。
创建自定义链:
iptables [-t table ] -N chain
删除自定义链(零引用):
iptables [ -t table ] -X chain
重命名自定义链(零引用):
iptables [-t table ] -E old_name new_name
主链指向自定义链:
iptables [ -t TABLES ] COMMAND CHAIN CRETIRIA -j TARGET
-j chain(自定义链)
TARGET填写自定义链名
自定义链返回主链: -j RETURN
iptables [ -t TABLES ] COMMAND CHAIN CRETIRIA -j TARGET
列子:iptables -A httpd_in -j RETURN
自定义链中插入规则 -j RETURN,返回主链,继续匹配
列子
优化规则:
1、尽量减少规则条目
2、访问量大的规则尽量放前面
3、统一服务的规则,规格更加严格的放在前面,尽早剔除。
列子:
1、设定默认规则
iptables -t filter -P INPUT DROP
1、通过ssh的tcp三次握手的第一次
iptables -I INPUT 3 -d xx.xx.xx.xx -p tcp --dport 22 --tcp-flags sys, ack,rst,fin sync -j ACCEPT
2、允许本机器dns解析 172.16.100.7
iptables -A OUTPUT -s 172.16.100.7 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -d 172.16.100.7 -p udp --sport 53 -j ACCEPT
3、本机可ping其他主机,不允许其他主机ping本机
iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 172.16.100.74 -p icmp --icmp-type 0 -j ACCEPT
4、写一条规则允许22,80端口访问
iptables -I INPUT -d 172.16.100.7 -p -tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT
5、允许172.16.100.1-172.16.100.100 的地址访问本机23端口
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport23 -m iptange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
6、禁止含有sex字符串流出。
iptables -I OUTPUT -m string -- algo kmp --string "sex" -j DROP
7、周一、二、四、五,上午8点20分到下午6点40拒绝访问web服务。
iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT
8、本机的ssh服务,仅限制每个IP发起两个链接请求。
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-ablove 2 -j DROP
此规则匹配发现超过两个ssh链接后就拒绝,一般此规则后续规则里面放行ssh服务。
9、设置ping的速率
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
iptables -A OUTPUT -d 172.16.100.7 -p icmp --icmp-type 8 -j ACCEPT
10、通过22,80端口且状态为NEW或者ESTABLISHED。
iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dport 22,80 -m state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
结合下面这一条规则使用,可以极大的提升防火墙匹配性能。
iptables -I INPUT -d 172.16.100.7 -m multiport -m state ESTABLISHED -j ACCEPT (放在第一条)
iptables -I OUTPUT -s 172.16.100.7 -m multiport -m state ESTABLISHED -j ACCEPT
11、给FTP放行。
iptables -A INPUT -d 172.16.100.7 -p tcp -m state --state RELATED -j ACCEPT
iptables -R OUTPUT 1 -s 172.16.100.7 -m state ESTABLISHED,RELATED -j ACCEPT (output第一行)
12、自定义链