大纲
一、什么是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