iptables: 包过滤型防火墙
Firewall: 防火墙,隔离工具;工作于主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检查规则作匹配检测,对于能够被规则所匹配到的报文做出相应处理的组件;可分为主机防火墙和网络防火墙,centos6中的配置文件为/etc/sysconfig/iptables
一. 基础介绍之4表5链
1. 4表
filter: 过滤,当防火墙;
nat: 网络地址转换,包括地址和端口;
mangle:拆解报文,做出修改,封装报文;
raw:关闭nat表上启用的连接追踪机制;有追踪机制(其实就是记忆功能),才能完成NAT转换
2. 5链(内置):
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
流入报文经由路径:PREROUTING --> INPUT
流出报文经由路径:OUTPUT --> POSTROUTING
转发报文经由路径:PREROUTING --> FORWARD --> POSTROUTING
3. 各功能可以实现的位置:
filter:INPUT, FORWARD, OUTPUT
nat: PREROUTING(DNAT), OUTPUT, POSTROUTING(SNAT)
mangle:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw:PREROUTING, OUTPUT
4. 路由发生的时刻:
报文进入本机后,用于判断目标主机;
报文发出之前,判断经由哪个接口送往下一跳;
5. 小结
iptables:主要是四表五链
1) 添加规则时的考量点:
(1) 要实现哪种功能,用来判断添加在哪张表上;
(2) 报文流经的路径,用来判断添加在哪个链上;
2) 链:链上规则的次序,即为检查的次序;依据从上到下的顺序
(1) 访问同一应用(比如都访问22端口),匹配范围小的放上面;
(2) 访问不同应用,匹配到报文频率较大的放上面;
(3) 尽量将多个规则合并为一个,进行优化;
(4) 设置默认策略;
功能的优先级次序:raw --> mangle --> nat --> filter
6. 规则说明:
组成部分:报文的匹配条件,匹配到之后处理动作
1) 匹配条件:根据协议报文特征指定,比如tcp, ip,udp等报文特征
基本匹配条件
扩展匹配条件
2) 处理动作:
内建处理机制,比如drop, reject
自定义处理机制, 用于跳转到自定义链
注意:报文不会经过自定义链,只能在内置链上通过规则进行引用后生效;
二. iptables命令:
它是一个规则生成器,相关操作有添加、修改、删除、显示等;
规则和链有计数器:
pkts:由规则或链所匹配到的报文的个数;
bytes:由规则或链匹配到的所有报文大小之和;
iptables命令:
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
-t table包括:filter, nat, mangle, raw
1. 链管理:
-F:flush,清空规则链;省略链,表示清空指定表上的所有的链;
-N:new, 创建新的自定义规则链;
-X:drop, 删除用户自定义的空的规则链;
-Z:zero,清零,置零规则计数器;
-P:Policy,为指定链设置默认策略;对filter表中的链而言,默认策略通常有ACCEPT, DROP, REJECT;
例如:iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
设定INPUT、OUTPUT的默认策略为DROP,FORWARD为ACCEPT。
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
设定INPUT、OUTPUT的默认策略为DROP,FORWARD为ACCEPT。
-E: rEname,重命令自定义链;引用计数不为0的自定义链,无法改名,也无法删除;
2. 规则管理:
-A:append,将新规则追加于指定链的尾部;
-I:insert,将新规则插入至指定链的指定位置;
-D:delete,删除指定链上的指定规则;有如下两种指定方式:
(1) 指定匹配条件;
(2) 指定规则编号;
-R:replace,替换指定链上的指定规则;
3. 查看:
-L:list,列出指定链上的所有规则,后面还可以跟如下的子参数来显示更详细的内容;
-n: numberic,以数字格式显示地址和端口号;
-v: verbose,显示详细信息;
-vv, -vvv
--line-numbers:显示规则编号;
-x: exactly, 显示计数器计数结果的精确值;
4. 匹配条件:
1)基本匹配:
[!] -s, --src, --source IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围,!表示取反;
[!] -d, --dst, --destination IP|Netaddr:检查报文中目的IP地址是否符合此处指定的地址范围;
-p, --protocol {tcp|udp|icmp}:检查报文中的协议,即ip首部中的protocols所标识的协议;
-i, --in-interface IFACE:数据报文的流入接口;仅能用于PREROUTING, INPUT及FORWARD链上;
-o, --out-interface IFACE:数据报文的流出接口;仅能用于FORWARD, OUTPUT及POSTROUTING链上;
例1:允许别人ping我(本机地址:172.16.100.9)
iptables -A INPUT -d 172.16.100.9 -p icmp -j ACCEPT
iptables -A OUTPUT -s 172.16.100.9 -p icmp -j ACCEPT
例2:对流入流出接口进行限制,只允许eth0进行流入流出
iptables -A INPUT -d 172.16.100.9 -i eth0 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.9 -o eth0 -j ACCEPT
5. 目标:
-j TARGET:jump至指定的TARGET,目标如下
ACCEPT: 接受
DROP: 丢弃
REJECT: 拒绝
RETURN: 返回调用链
REDIRECT:端口重定向
LOG: 记录日志
MARK:做防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE:地址伪装
...
自定义链:由自定义链上的规则进行匹配检查
三. 匹配条件之扩展匹配
扩展匹配:包括隐式扩展,显示扩展,基本格式为-m macth_name --spec_options,例如 -m tcp --dport 22
1. 隐式扩展:对-p protocol指明的协议进行的扩展,可省略-m选项,按协议分类如下;
1) -p tcp
--dport PORT[-PORT]:目标端口,可以是单个端口或连续多个端口;
--sport PORT[-PORT]
--tcp-flags LIST1 LIST2:检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1,而余下的必须为0;没有LIST1中指明的,不作检查
比如: --tcp-flags SYN,ACK,FIN,RST SYN 可以简写为--syn,表示检查tcp连接的第一次请求
6个标志位: SYN, ACK, FIN, RST, PSH, URG(请求同步,确认号有效,断开请求,重置连接,推送,紧急指令)
例1:打开22端口,允许远程管理。(设定了很多的附加条件:管理机器IP必须是250,并且必须从eth0网卡进入)
iptables -A INPUT -i eth0 -s 192.168.100.250 -d 192.168.100.1 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.250 -s 192.168.100.1 -p tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.250 -s 192.168.100.1 -p tcp --sport 22 -j ACCEPT
2) -p udp
--dport
--sport
例子:对于基于udp的dns服务,使用以下命令开启端口服务
iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT
3) -p icmp
--icmp-type
可用数字表示其类型:
0:echo-reply
8: echo-request
例1:允许ping别人,不允许别人ping我(本机地址:172.16.100.9)
iptables -A OUTPUT -d 172.16.100.9 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 172.16.100.9 -p icmp --icmp-type 0 -j ACCEPT
例2:在所有网卡上打开ping功能,便于维护和检测
iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -o eth+ -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -o eth+ -p icmp --icmp-type 0 -j ACCEPT
2. 显式扩展: 必须显式指明使用的扩展模块(rpm -ql iptables | grep ".so")
CentOS 6: man iptables
CentOS 7: man iptables-extensions
1) multiport扩展
以离散方式定义多端口匹配;最多指定15个端口;
[!] --source-ports,--sports port[,port|,port:port]...:指明多个离散的源端口,22:25表示连续的端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指明多个离散的目标端口;
[!] --ports port[,port|,port:port]... :源和目标都行,很少用
~]# iptables -I INPUT -s 172.16.0.0/16 -d 172.16.100.9 -p tcp -m multiport --dports 22,80 -j ACCEPT
~]# iptables -I OUTPUT -d 172.16.0.0/16 -s 172.16.100.9 -p tcp -m multiport --sports 22,80 -j ACCEPT
2) iprange扩展
指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用;
[!] --src-range from[-to]:指明连续的源IP地址范围;
[!] --dst-range from[-to]:指明连续的目标IP地址范围;
~]# iptables -I INPUT -d 172.16.100.9 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.100.1-172.16.100.120 -j ACCEPT
~]# iptables -I OUTPUT -s 172.16.100.9 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.100.1-172.16.100.120 -j ACCEPT
3)string扩展
检查报文中出现的字符串;
--algo {bm|kmp},2种比对算法
bm = Boyer-Moore
kmp = Knuth-Pratt-Morris
[!] --string pattern,从头到尾进行检查
~]# iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT (对网页中有'movie‘字符的禁止访问---允许请求此网页,但是回应不能到达本机)
4)time扩展
根据报文到达的时间与指定的时间范围进行匹配;
--datestart
--datestop
--timestart
--timestop
--monthdays
--weekdays
iptables -I INPUT -d 172.16.100.9 -p tcp --dport 80 -m time --timestart 14:00 --timestop 16:00 -j REJECT (UTC格式时间)
5)connlimit扩展
根据每客户端IP(也可以是地址块)做并发连接数数量匹配;
--connlimit-above n:连接的数量大于n,后面一般跟REJECT
iptables -I INPUT -p tcp --dport 22 -m connlimit --conlimit-above 3 -j REJECT
--connlimit-upto n: 连接的数量小于等于n,后面一般跟ACCEPT
6)limit扩展
基于收发报文的速率做检查;
基于令牌桶过滤器来实现速率匹配,理解为发令牌给人去办事,只有办完事还了令牌,才能发给下一个人去办事
--limit rate[/second|/minute|/hour|/day]
--limit-burst number(峰值,不是必须的,就是空闲的时候不限速率,先最多给几个)
例1:
iptables -A INPUT -d 172.16.100.9 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
iptables -A OUTPUT -s 172.16.100.9 -p icmp --icmp-type 0 -j ACCEPT
例2:Dos攻击防范
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
--limit 25/minute表示每分钟限制最大连接数为25
--limit-burst 100指定当总连接数超过100时,启动limit/minute限制
7)state扩展--重要
根据连接追踪机制检查连接的状态;(在指定时间内,比如6秒,记忆连接记录,需要用内核内存空间)
调整连接追踪功能所能够容纳的最大连接数量:/proc/sys/net/nf_conntrack_max
已经追踪到并记录下的连接:/proc/net/nf_conntrack
不同协议或连接类型追的时长:/proc/sys/net/netfilter/
可追踪的连接状态:
NEW:新发出的请求;连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态;
RELATED:相关的连接;如ftp协议的命令连接与数据连接之间的关系;
INVALIED:无法识别的连接;
例子1
iptables -I INPUT -d 172.16.100.9 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 172.16.100.9 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
例子2: PING只响应别人
iptables -A INPUT -d 172.16.100.9 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.9 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
例子3: 配置web流量均衡
把一台服务器作为前段服务器,利用iptables进行流量分发,配置方法如下
iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:80
iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.102:80
iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.103:80
问题:如何开放被动模式的ftp服务?
(1) 装载ftp追踪时的专用的模块:
# modprobe nf_conntrack_ftp
(2) 放行请求报文:
命令连接:NEW, ESTABLISHED,通过21端口
数据连接:RELATED, ESTABLISHED,随机端口
# iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
(3) 放行响应报文:
ESTABLISEHD
# iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
四. 如何保存及重载规则:
保存规则至指定文件:iptables-save > /PATH/TO/SOMEFILE
从指定文件重载规则:iptables-restore < /PATH/FROM/SOMEFILE
CentOS 6:
service iptables save 相当于iptables-save > /etc/sysconfig/iptables
service iptables restart 相当于iptables-restore < /etc/sysconfig/iptables
CentOS 7:
引入了新的iptables前端管理服务工具:firewalld
firewalld-cmd
firewalld-config
其实centos7中也可以使用iptables,那么需要先禁用firewalld,方法如下
禁止firewall开机启动:systemctl disable firewalld.service
关闭firewall: systemctl stop firewalld.service
启动iptables: service iptables start
五. 回顾和练习:
iptables/netfilter
netfilter: kernel framework,
iptables
四表:filter, nat, mangle, raw
五链:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
子命令:
链:-F, -X, -N, -E, -Z, -P, -L
规则:-A, -I, -D, -R
-j TARGET:
ACCEPT, DROP, REJECT, RETURN, LOG, MARK, DNAT, SNAT, MASQUEARDE, ...
匹配标准:
通用匹配:-s, -d, -p, -i, -o
扩展匹配
隐含扩展:
-p tcp: --dport, --sport, --tcp-flags, --syn (--tcp-flags SYN,ACK,FIN,RST SYN)
-p udp: --dport, --sport
-p icmp: --icmp-type
显式扩展: -m
练习:
主机防火墙:
放行telnet, ftp, web服务;
放行samba服务;
放行dns服务(查询和区域传送);
网络防火墙:
放行telnet, ftp, web服务;
放行samba服务;
放行dns服务(查询和区域传送)