当前位置:首页 » Linux技术知识

Linux 防火墙之iptables/netfilter

2015-12-18 14:57 本站整理 浏览(11)
大纲
一、什么是iptables/netfilter
二、iptables的四"表"五"链"
三、iptables命令用法
四、iptables的隐含扩展与显式扩展
五、iptables实例
一、什么是iptables/netfilter
Netfilter是Linux内核中的一个框架,它提供一个标准的接口,通过该接口能够方便的进行不同的网络操作。Netfilter在内核中提供钩子(hook)函数来对不同的数据包请求作出事先定义的动作。Netfilter工作在内核空间中,而iptables则是用户空间的一个负责编写规则的管理工具,其本身仅仅只是负责编写规则,真正实现各种特定功能的则是Netfilter框架和规则。
二、iptables的四"表"五"链"
(1)、四表
raw、mangle、nat、filter(优先级从高到低排列)
①raw:对报文设置一个标志,决定数据包是否被状态跟踪机制处理
②mangle:对特定数据包修改,三类操作:TOS、TTL、MARK
③nat:地址转换功能(SNAT、DNAT),包括端口映射等等
④filter:数据报文过滤
(2)、五链
①PREROUTING:数据包进入本地网卡,即将进行路由决策之前
②INPUT: 通过路由表后到达本机内部的
③FORWARDING: 通过路由决策之后发行目的地不是本机需要转发的
④OUTPUT: 由本机出来向外的
⑤POSTROUTIONG: 经过路由决策之后,即将从本地网卡出去
(3)、表与链对应关系
①raw:PREROUTING、OUTPUT
②mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING ③nat:PREROUTING、OUTPUT、POSTROUTING ④filter:INPUT、OUTPUT、FORWARD
三、iptables命令用法
iptables ― administration tool for IPv4 packet filtering and NAT

SYNOPSIS
       iptables [-t table] {-A|-D} chain rule-specification

       iptables [-t table] -I chain [rulenum] rule-specification

       iptables [-t table] -R chain rulenum rule-specification

       iptables [-t table] -D chain rulenum

       iptables [-t table] -S [chain [rulenum]]

       iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

       iptables [-t table] -N chain

       iptables [-t table] -X [chain]

       iptables [-t table] -P chain target

       iptables [-t table] -E old-chain-name new-chain-name

       rule-specification = [matches...] [target]
       
       target = -j targetname [per-target-options]
1、新增iptables规则
iptables [-t table] {-A|-D} chain rule-specification

[root@CentOS6 ~]# iptables -A INPUT -d 172.16.1.108 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
2、插入iptables规则
iptables [-t table] -I chain [rulenum] rule-specification

[root@CentOS6 ~]# iptables -I OUTPUT -s 172.16.1.108 -m state --state ESTABLISHED,RELATED -j ACCEPT
3、替换iptables规则
iptables [-t table] -R chain rulenum rule-specification

[root@CentOS6 ~]# iptables -R INPUT 1 -d 172.16.1.108  -j clean_chain
4、删除iptables规则
iptables [-t table] -D chain rulenum

[root@CentOS6 ~]# iptables -D INPUT 2
5、查看iptables规则
iptables [-t table] -S [chain [rulenum]]

[root@CentOS6 ~]# iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP
-A INPUT -d 172.16.1.103/32 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -d 172.16.1.103/32 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT 
-A INPUT -d 172.16.1.103/32 -p icmp -m icmp --icmp-type 8 -j LOG --log-prefix "--Firewall log from icmp--" 
-A OUTPUT -s 172.16.1.103/32 -m state --state RELATED,ESTABLISHED -j ACCEPT
6、查看iptables规则表和链
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

[root@CentOS6 ~]# iptables -L -n -v --line-numbers
Chain INPUT (policy DROP 11 packets, 464 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     1066 73178 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.16.1.103        state RELATED,ESTABLISHED 
2        3   156 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.16.1.103        multiport dports 21,22,80 state NEW 
3        4   240 LOG        icmp --  *      *       0.0.0.0/0            172.16.1.103        icmp type 8 LOG flags 0 level 4 prefix `--Firewall log from icmp--' 

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      934  111K ACCEPT     all  --  *      *       172.16.1.103         0.0.0.0/0           state RELATED,ESTABLISHED
7、新增iptables自定义链
iptables [-t table] -N chain

[root@CentOS6 ~]# iptables -N clean_chain
8、删除iptables自定义链
iptables [-t table] -X [chain]

[root@CentOS6 ~]# iptables -X clean_chain
9、修改iptables默认规则
iptables [-t table] -P chain target

[root@CentOS6 ~]# iptables -P INPUT DROP
10、修改iptables自定义链名称
iptables [-t table] -E old-chain-name new-chain-name

[root@CentOS6 ~]# iptables -E clean_chain clean_table

动作(target):
ACCEPT:放行
	
	DROP:丢弃
	
	REJECT:拒绝
	
	DNAT:目标地址转换
	
	SNAT:源地址转换
	
	REDIRECT:端口重定向
	
	MASQUERADE:地址伪装
	
	LOG:日志
	
	MARK:打标记

四、iptables的隐含扩展与显式扩展
1、隐含扩展:使用-p {tcp|udp|icmp}指定某特定协议后,自动能够对协议进行的扩展
-p tcp
	--dport m[-n],匹配的目标端口,如果多个端口,只能连续表示,不能离散表示
	--sport  m[-n],匹配的源端口,如果多个端口,只能连续表示,不能离散表示
	--tcp-flags  mask comp:mask指定的标志位中,只有comp为1,其他必须为0;URG PSH RST SYN ACK FIN六种
	例如:--tcp-flags SYN,RST,ACK,FIN SYN即只有SYN位为1,其他三个位为0,三次握手第一次,简写为--syn

-p udp
	--dport m[-n],匹配的目标端口,如果多个端口,只能连续表示,不能离散表示
	--sport:m[-n],匹配的源端口,如果多个端口,只能连续表示,不能离散表示

-p icmp
 --icmp-type:8为echo-request(回显请求,即ping请求);0为echo-reply(回显应答,即ping应答)
2、显式扩展:必须要明确指定的扩展模块
(1)、multiport:多端口匹配,离散表示法逗号隔开,连续表示法冒号隔开
	--source-ports,--sports port[,port|,port:port]...  				# 指定源端口范围
    --destination-ports,--dports port[,port|,port:port]... 			# 指定目标端口范围
	--ports port[,port|,port:port]... 								# 同时匹配源端口和目标端口
	
	例如:iptables -I INPUT -d 172.16.1.103 -p tcp -m multiport --dports 80,3306,22,9000 -j ACCEPT

(2)、iprange:限制ip地址范围
	[!] --src-range ip-ip											# 指定源IP范围,可取反
	[!] --dst-range ip-ip											# 指定目标IP范围,可取反
	
	例如:iptables -A INPUT -d 172.16.1.103 -p tcp --dport 80 -m iprange --src-range 172.16.1.1-172.16.1.100 -j ACCEPT

(3)、time 指定时间范围
	--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]						# 指定起始日期
	--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]						# 指定结束日期

	--timestart hh:mm[:ss]											# 指定起始时间
	--timestart hh:mm[:ss]											# 指定结束时间

	[!] --weekdays day[,day....]									# 指定周几,可取反
	
	例如:iptables -A INPUT -d 172.16.1.103 -p tcp --dport 80 -m time --weekdays 1,2,3,4,5 --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT

(4)、string 字符串匹配
	--alog {bm|kmp} 												# 字符匹配查找时使用的算法
	--string “STRING” 												# 要查找的字符串
	--hex-string "HEX-STRING" 										# 要查找的字符,先编码成16进制格式

	例如:iptables -I OUTPUT -s 172.16.1.103 -p tcp --sport 80 -m string --algo kmp --string 'hello'  -j DROP

(5)、connlimit:每IP对指定服务的最大并发连接数
	[!] --connlimit-above											# 同一IP连接请求上限
	--connlimit-mask prefix_length									# 指定并发请求哪一类IP地址,指定掩码长度即可

	例如:iptables -I INPUT  -d 172.16.1.103 -p tcp --dport 80 -m connlimit ! --connlimit-above 5 -j ACCEPT
		  iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT

(6)、limit:报文速率控制
	--limit #[/second|/minute|/hour|/day]         					# 每单位时间内允许的连接请求数,做速率限定
	--limit-burst #                              					# 表示允许触发 limit 限制的最大次数 

	例如:iptables -I OUTPUT 5 -s 172.16.1.103 -p icmp --icmp-type 0 -m limit --limit-burst 8 --limit 10/minute -j ACCEPT
     
(7)、state:状态追踪
    --state STATE1,[STATE2...]
		NEW															# 新请求
		ESTABLISHED													# 已建立的连接
		RELATED														# 相关联的的连接
		INVALID														# 不合法的请求

	例如:iptables -A INPUT -d 172.16.1.103 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
	iptables -A INPUT -d 172.16.1.103 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
	iptables -A OUTPUT -s 172.16.1.103 -m state --state ESTABLISHED,RELATED -j ACCEPT
	
	
调整连接追踪功能所能容纳的最大连接数
    cat /proc/sys/net/nf_conntrack_max      # 定义了连接追踪的最大值,因此,建议按需调大此值
                
    cat /proc/net/nf_conntrack               # 记录了当前追踪的所有连接
                 
    cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established     #超时时间

五、iptables实例
1、自定义清理链clean.sh
ServerIP=172.16.1.108
ServerBroad=172.16.255.255
AllBroad=255.255.255.255

iptables -N clean
iptables -A clean -d $AllBroad -p icmp -j DROP
iptables -A clean -d $ServerBroad -p icmp -j DROP

iptables -A clean -p tcp ! --syn -m state --state NEW -j DROP
iptables -A clean -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean -d $ServerIP -j RETURN 

iptables -A INPUT -d $ServerIP -j clean
2、recent模块抵御DOS攻击脚本prevdos.sh
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
3、源地址转换功能实现snat.sh
LocalNet=192.168.0.0/24
InternetIP=172.16.1.105

# SNAT
iptables -t nat -A POSTROUTING -s $LocalNet -j SNAT --to-source $InternetIP

# MASQUERADE
iptables -t nat -A POSTROUTING -s $LocalNet -j MASQUERADE
4、目标地址转换功能实现dnat.sh
LocalIP=192.168.1.10
InternetIP=172.16.1.105

# DNAT
iptables -t nat -A PREROUTING -d $InternetIP -p tcp --dport 80 -m state --state NEW -j DNAT --to-destination $LocalIP
5、放行ssh、web、ftp服务脚本iptables.sh
ServerIP=172.16.1.108

# Load modules to connect track ftp service
modprobe nf_conntrack
modprobe nf_conntrack_ftp

service iptables start
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F 

iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

iptables -A INPUT -d $ServerIP -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -d $ServerIP -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -s $ServerIP -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

service iptables save

扩展阅读:Iptables 指南1.1.19
本文出自 “Hello,Linux” 博客,请务必保留此出处http://soysauce93.blog.51cto.com/7589461/1726059