首页 > 代码库 > NETFILTER/IPTABLES
NETFILTER/IPTABLES
Firewall 工作于主机或网络边缘,对进出的报文根据定义的规则作出检查,进而分为两类。iptables用来写规则并发送到netfilter,netfilter最终生效,netfilter是真正的防火墙。
主机防火墙
工作于内核的tcp/ip协议栈上,只为本机作过滤。
网络防火墙
工作于网络进出口,为网络中的主机来往数据报文做过滤,匹配到的报文作相应处理的一种套件。
IDS: Intrusion Detect System 入侵检测系统。监控进程的行为,如果可疑行为做出相应的动作。
HIDS:host ids
NIDS : network ids
IPS : Intrusion protect system 入侵防御系统
HoneyPot : 蜜罐,
bt : backtrack 专为安全的linux发行版
nessus:安装评估工具
nmap:网络扫描工具
网络层防火墙,
应用层网关。
写规则前需要:
1,确定功能(表)
2,确定报文流向
3,确定要实现的目标 ,
4 确定匹配条件
优化规则: 尽量减少规则条目,彼此不相关的规则把匹配机会较多的放在上面,属于同一功能的规则把精确匹配的放在上面。
iptables工作于传输层,网络层,链路层的防火墙。iptables是让用户生成规则,发送给工作于内核TCP/IP协议栈上的netfilter,真正实现报文过滤的是netfilter。
netfilter的五个钩子函数(5个链)
INPUT:到达本机内部报文必经之路
OUTPUT:同本机发出报文的必须之路
FORWARD:经过本机转发的报文必经之路。
PREROUTING : 路由前,进入本机报文最先经过的链
POSTROUTING:路由后,从本机出去报文最后经过的链
规则的功能: 4 张表
raw:主要目标是,让用户的请求经过nat时,nat表上启用connetion_track功能,关闭连接追踪功能
mangle : 修改tcp/ip报文中首部的参数
nat:地址转换
SNAT
DNAT
PNAT
filter:定义是否允许通过防火墙的规则
filter : INPUT, OUTPUT, FORWARD
nat: PREROUTING(DNAT), POSTROUTING(SNAT), OUTPUT(SNAT)
mangle : PREROUTING, POSTROUTING, INPUT, OUTPUT, FORWARD
raw : POSTROUTING, OUTPUT
语法格式:
iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET
-t TABLE 指定表
net , mangle , raw , filter
COMMAND
对链做管理
-F (flush)清空规则链
-N (new)自建一条链
# iptables -t filter -N http_input
-X (delete)删除一条自定义的空链,并且链没有被引用。
# iptables -X http_input
-Z (zero)把计数器归零
# iptables -t filter -Z
-P (policy)设定链默认策略,对filter默认为ACCEPT或DROP
# iptables -t filter -P INPUT DROP
-E (rename)重命名自定义链
# iptables -E http_input web_input
对链中的规则做管理
-A (append)附加规则,此规则位于最后面。用来添加规则。
-I (insert)插入一条新规则,可以指定位置,如果不指定会放在第一条
-D (delete)删除规则
# iptables -t filter -D INPUT 1 删除第一条规则
-R (replace)替换规则
# iptables -t filter -R OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -o eth0 -p tcp -sprot 22 -j ACCEPT
查询链中的规则
-L 列出链中的规则
-n 是数据字地址显示主机地址和端口
-v 显示详细
-vv 更详细
-vvv 更更详细
--line-numbers 显示规则编号
-x 显示精确值,不对计算器做单位换算,直接显示精确值。
#iptables -L -v -x --line-numbers
匹配条件
通用匹配
-s ip :检查报文源ip地址,匹配的范围。可以是ip也是可以是网络地址。!表示取反
--src --source 与-s一样
# iptables -A INPUT -s 172.16.2.0 -p tcp --dport 22 -j ACCEPT
-d ip : 检查报目标ip地址,匹配的范围。可以是ip也是可以是网络地址。!表示取反
--dst --destination 与-d一样
# iptables -A OUTPUT -d 172.16.2.5 -p tcp --sport 22 -j ACCEPT
-p 协议 : 指定匹配报文的协议类型。一般有三种 tcp udp icmp
-i 网卡名 : 指定数据报文流入的接口,可用的链有: PREROUTTING INPUT FORWARD
-o 网卡名 : 指定数据报文流出的接口 ,可用的位置有: OUTPUT , FORWARD , POSTROUTTING
扩展匹配,调用netfilter额外模块实现特殊检查机制。
隐式扩展:当使用-p {tcp|upd|icmp} 中的一种时,可以直接使用扩展专用箕。
-p tcp
--sport PORT :指定源端口,可以是一个端口范围[80-100]
--dport PORT :指定目标端口
--tcp-flags 后面格式,第一段是要检查标志位列表,用逗号分隔 。 第二位是必须为1的标志们,也用逗号分隔。如果第二段没有指定,则标志位必须为0.
# iptables -I INPUT -p tcp --tcp-flags all all -j DROP tcp标志位全为1的
# iptables -I INPUT -p -tcp --tcp-flags all none -j DROP tcp标志为全为为的
# iptables -I INPUT -P -tcp -tcp-flags --syn 只有syn为一的可以通过
-p udp
--sport PORT :指定源端口,可以是一个端口范围
--dport PORT :指定目标端口
-p icmp [-m icmp]
--icmp-type
0 : ping 响应
8 : ping 请求
示例:只允许本机ping另人,不允许其它主机ping本机。检查icmp报文的类型实现。
# iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
显示扩展 : 必须明确说明使用那个模块做扩展,而后才使用其扩展专用选项
-m 告诉iptables调用那个模块。
multiport:多端口匹配,可用于匹配非连续或连续端口,一次最多可以指定15个端口
专用选项
--source-ports , --sports 指定多个源端口,不连续端口使用逗号分隔,连接使用冒号分隔
--destination-ports , -dports 指定多个目标端口
--ports 源和目标都匹配
例如:放行22号端口和80号端口
#iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport -dports 22,80 -j ACCEPT
# iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport -sports 22,80 -j ACCEPT
iprange 匹配指定范围内的地址,或一段连续的地址而非整个网络
[!] --src-range
--dst-range
例如:只允许172.16.2.0到172.16.2.30使用ssh协议访问管理本机
# iptables -A INPUT -d 172.16.2.16 -p tcp --dport 22 -m iprange --src-range 172.16.2.0-172.16.2.30 -j ACCEPT
# iptables -A OUTPUT -s 172.16.2.16 -p tcp --sport 22 -m iprange --dst-range 172.16.2.0-172.16.2.30 -j ACCEPT
string: 字符串匹配,能够检测报文应用层中字符串过滤。
字符串比较高效算法有 kmp , bm
专用选项
--algo {kmp|bm} 比较时使用的算法
--string "string" 指定要检查的字串。效率较底。
--hex-string "HEX_STRING" 指定检查内容为转换成16进制的字串。与string只出现一次就行。
例如:从本机出去的数据中,包含了wukui字符串的的网页文件都不让通过。
# iptables -I OUTPUT -m string --algo kmp --string "wukui" -j DROP
state 状态检查,可以对tcp,udp,icmp协议做状态检查。
调整连接追踪功能所能容纳连接最大值的内核参数文件 :/proc/sys/net/nf_conntrack_max.
当前追踪的所有连接的记录文件 /proc/net/nf_conntrack
不同协议连接类型的属性位于 /proc/sys/net/netfilter 目录中所有文件
NEW:新建立第一个会话的第一次请求,tcp udp icmp都适用,但连接追踪保存时间不一样。
ESTABLISHED:已建立的连接
RELATED:有关联关系的连接
INVALID:无法识别的连接
示例: 只允许10.0.0.0/8 ping能172.16.0.0/16 ,而不允许 172.16.0.0/16 ping通 10.0.0.0/8 .FORWARD链默认为DROP
# iptables -A FORWARD -d 10.0.0.0/8 -s 172.16.2.13 -m state --state ESTABLISHED -j ACCEPT
# iptables -R FORWARD 1 -d 172.16.0.0/16 -s 10.0.0.0/8 -m state --state ESTABLISHED,NEW -j ACCEPT
示例2,为ftp服务打开连接。
# # modprobe nf_conntrack_ftp 需要此模块来识别通信进程的关联。一般不用装载。
# iptables -A INPUT -s 172.16.2.16 -p tcp --dport 21 -m state --state NEW -j ACCEPT
# iptables -A INPUT -d 172.16.2.16 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
limit 做速率限制
专用选项
--limit N [/second|/mminute|/hour|/day] 每多长时间可以发多少个包
--limit-burst N 此前没有发送数据包,第一次来最多可以一次发多少个数据包。
示例:# iptables -R FORWARD 1 -m limit --limit 60/second --limit-burst 500 -j ACCEPT 前提是FORWARD链默认规则为DROP
time 做时间段访问限制
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]] 指定起始日期和时间
--datestop 指定结束日期和时间
--timestart hh:mm[:ss] 指定起始的时间,仅能指定时间。
--timestop 指定结束时间
--weekdays day[,day] 指定以星期几限定
Mon,Tue,
例如:每周一周二和周四周五的早上8点20到下午的18点40只不允许访问本机的80端口
# iptables -A INPUT -d 172.16.2.16 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j DROP
connlimit: 连接数据限制,对每个IP所能够发起并发连接数做限制
专用选项:
--connlimit-above N ,连接小于设定,放行,超出限定,超出部分drop
示例: 经过本机转发,为一个ip最多转发3个ping进程,超出全部DROP
# iptables -A FORWARD -p icmp -m connlimit --connlimit-above 3 -j DROP
处理目标
内置目标
DROP 丢弃,没有返回值
REJECT 拒绝通过,但会给请求一个返回值
ACCEPT 允许通过
RETURN:一般用于在自定义链最后没有匹配到返回主链的命令。
自定义的链,在-j 后面加上链的名称。
iptables 检查语法后把规则送往 netfilter,规则立即生效。写之前先放行自己的ssh会话。iptables的规则文件 在/etc/sysconfig/iptables.
保存目前生效的iptables规则,会覆盖之前文件中的规则。
1, iptables-save > /etc/sysconfig/iptables
2, service iptables save
生效规则文件中的规则,会清空现运行的规则,而使规则文件中的规则生效。
1, iptables-restore < /etc/sysconfig/iptables
2, service iptables restart