Firewall : 防火墙,隔离工具;工作于主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检测规则作匹配,对于能够被规则所匹配到的报文做出相应处理的组件;有主机防火墙和网络防火墙
Iptables: 包过滤型防火墙,对报文首部进行匹配完成过滤功能
功能:
filter: 过滤,防火墙
nat: network address translation, 网络地址转换
mangle: 拆解报文,做出修改,封装报文
raw:关闭nat表上启用的连接追踪机制
链(内置)
PREROUTTING
INPUT
FORWARD
OUTPUT
POSTROUTING
报文一般流向:
流入: PREROUTTING --> INPUT 流出: OUTPUT --> POSTROUTTING 转发: PREROUTTING --> FORWARD --> PSTROUTTING
各功能的分别实现:
filter: INPUT, FORWARD, OUTPUT
nat: PREROUTTING(DNAT), OUTPUT, POSTROUTTING(SNAT)
mangle: PREROUTTING, INPUT, FORWARD, OUTPUT,POSTROUTING
raw: PREROUTTING, OUTPUT
iptables: 四表五链
添加规则时的考量点:
1. 要实现哪种功能: 判断添加在哪张表上 2. 报文流经的路径,判断添加在哪个链上
链: 链上规则的次序,即为检查的次序,因此隐含一定的法则:
1. 同类规则(访问同一应用),匹配范围小的放上面 2. 不同类规则(访问不同应用),匹配到报文频率较大的放上面 3. 将那些可由一条规则描述的多个规则合并为一个 4. 设置默认策略
功能的优先级次序:
raw --> mangle --> net --> filter
数据流向和优先级示意图如下:
iptables: 规则管理工具
可以实现添加、修改、删除、显示等功能
规则和链有计数器
pkts: 由规则或链所匹配到的报文的个数
bytes: 由规则或链匹配到的所有报文大小之和
iptables命令:
iptables [-t table] {-A|-C|-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
链(chain)管理: -F: flush, 清空规则链;省略链,表示清空指定表上的素有的链 -N: new, 创建新的自定义规则链; -X: drop, 删除用户自定义的空的规则链 -Z: zero, 清零,置零规则计数器; -P: Policy, 为指定链设置默认策略;对filter表中的链而言,默认策略通常有ACCEPT,DROP, REJECT
-E: rEname, 重命名自定义链,引用计数不为0的自定义链,无法改名,也无法删除
-L: list, 列出指定链上的所有规则
-n: numberIC,以数字格式显示地址和端口号
-v: v erbose,显示详细信息
-vv, -vvv
--line-numbers: 显示规则编号
-x: exactly,显示计数器计数结果的精确值
规则管理: -A: append, 将新规则追加于指定链的尾部 -I: insert, 将新规则插入至指定链的位置 -D: delete, 删除指定链上的指定规则 有两种指定方式: 1. 指定匹配条件 2. 指定规则编号
# iptables -D OUTPUT 1 //删除OUTPUT链上的第一条策略 -R: replace, 替换指定链上的指定规则
规则:
匹配条件:根据协议报文特征指定 基本匹配条件 扩展匹配条件 处理动作: 内建处理机制 自定义处理机制 注意: 报文不会经过自定义链,只能在内置链上通过规则进行引用后生效
匹配条件:
基本匹配:
[!] -s, --src, --source IP|Netaddr: 检查报文中源IP地址是否符合此处指定的地址范围 [!] -d, --dst, --destination IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围 -p, --protocol {tcp|udp|icmp}:检查报文中的协议,即ip首部中protocols所标识的协议 -i,--in-interface IFACE: 数据报文的流入接口;仅能用于PREROUTTING,INPUT,FORWARD -o, --out-interface IFACE: 数据报文的流出接口,仅能用于FORWARD,OUTPUT及POSTROUTTING
基本匹配条件的示例:
1.访问本机的报文属于tcp协议都放行,从本机出去的tcp报文也要放行
# iptables -t filter -A INPUT -d 192.168.1.3 -p tcp -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.1.3 -p tcp -j ACCEPT
2. 允许别的电脑ping自己的主机
# iptables -A INPUT -d 192.168.1.3 -p icmp -j ACCEPT
# iptables -A OUTPUT -s 192.168.1.3 -p icmp -j ACCEPT
3. 假设有三块网卡,对第一块网卡eth0进行流控制
# iptables -t filter -A INPUT -d 192.168.1.3 -i eth0 -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.1.3 -o eth0 -j ACCEPT
扩展匹配:
-m match_name --spec_options 例如: -m tcp --dport 22
隐式扩展: 对 -p protocol指明的协议进行的扩展,可省略-m选项
-p tcp --dport PORT[-PORT]: 目标端口,可以是单个端口或连续多个端口 --sport PORT[-PORT]:源端口 --tcp-flags LIST1 LIST2: 检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1。而余下的必须为0;没有LIST1中指明的,不作检查 常用标志位:SYN,ACK,FIN,RST,PSH,URG
示例:--tcp-flags SYN,ACK,FIN,RST SYN:意为标志位SYN为1,ACK,FIN,RST全为0,三次握手第一次连接 --syn: 效果和上面--tcp-flags示例一样
-p udp --dport --sport -p icmp --icmp-type 可用数字表示其类型 0: echo-reply,回送应答(ping应答) 8: echo-request,请求回送(ping请求)
隐式扩展示例:
1. 来自tcp协议22号端口的报文允许访问
# iptables -I INPUT -d 192.168.1.3 -p tcp --dport 22 -j ACCEPT
# iptables -I OUTPUT -s 192.168.1.3 -p tcp --sport 22 -j ACCEPT
2. 比如让主机可以ping别人,别人不能ping自己
# iptables -A OUTPUT -s 192.168.1.3 -p icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -d 192.168.1.3 -p icmp --icmp-type 0 -j ACCEPT
显式扩展:必须使用-m选项指定使用扩展,还要指明使用的扩展模块(rpm -ql iptables | grep "\.so")
获取显示扩展帮助文档:
CentOS 6: man iptables CentOS 7: man iptables-extensions
1. multiport扩展
以离散方式定义多端口匹配,最多指定15个端口
[!] --source-ports,--sports port[,port|,port:port]... :指明多个源端口
[!] --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 -t filter -I INPUT -d 192.168.1.3 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 192.168.1.2-192.168.1.200 -j ACCEPT
# iptables -t filter -I OUTPUT -s 192.168.1.3 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 192.168.1.2-192.168.1.200 -j ACCEPT
3. string扩展
检查报文中出现的字符串
--algo {bm|kmp}
bm = Boyer-Moore
kmp = Kunth-Pratt-morris
[!] --string pattern
# iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT
4. time扩展
根据报文到达的时间与指定的时间范围进行匹配
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--monthdays day[,day...]
--weekdays day[,day...]
# iptables -I INPUT -d 192.168.1.3 -p tcp --dport 80 -m time --timestart 23:00 --timestop 23:30 -j REJECT
5. connlimit扩展
根据每客户端IP(也可以是地址块)做并发数数量匹配
--connlimit-above n: 连接的数量大于n
--connlimit-upto n: 连接的数量小于等于n
# iptables -I INPUT -d 192.168.1.3 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
6. limit扩展
基于收发报文的速率做检查
--limit rate[/second|/minute|/hour|/day] //速率 --limit-burst number //峰值
# iptables -A OUTPUT -s 192.168.1.3 -p icmp --icmp-type 0 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
# iptables -A OUTPUT -s 192.168.1.3 -p icmp --icmp-type 0 -j ACCEPT
7. state扩展
根据连接追踪机制检查连接的状态
--state STATE1,STATE2,...
调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/nf_contrack_max
已经追踪到并记录下的连接
/proc/net/nf_conntrack
不同协议或连接类型追踪时长
/proc/sys/net/netfiler/
可追踪的连接状态:
NEW: 新发出的请求:连接追踪模板中不存在此连接相关的信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态
RELATED:相关的连接:如ftp协议的命令连接与数据连接之间的关系
INVALIED:无法识别的连接
示例:
1.出去的已建立的连接都放行,进来的新连接是tcp协议22,80端口的也放行
# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
# iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT
# iptables -I INPUT -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
目标:
-j TARGET: jump至指定的TARGET
ACCEPT:接受
DROP:丢弃
REJECT: 拒绝
RETURN: 返回调用链
REDIRECT: 端口重定向
LOG: 记录日志
MARK: 做防火墙标记
DNAT:目标地址转换
SNAT: 原地址转换
MASQUERADE: 地址伪装
。。
自定义链: 由自定义链上的规则进行匹配检查
问题:如何开放被动模式的ftp服务?
(1)装载ftp追踪时的专用的模块(路径为/lib/modules/2.6.32-754.el6.x86_64/kernel/net/netfilter)
# modprobe nv_conntrack_ftp
(2) 放行请求报文
命令连接: NEW, ESTABLISHED
数据连接: RELATED, ESTABLISHED
修改上面的规则:
# iptables -R INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -R INPUT 2 -d 192.168.1.3 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
为ftp写的专用规则:
# 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) 放行响应报文
ESTABLISHED
# iptables -A OUTPUT -s localIP -p tcp -m state --state ESTEALISHED -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
关于firewalld:
参考文档: http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html