Iptables防火墙配置和使用详解
防火墙( FireWall )是一套网路防御系统,具有隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上 的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略。
防火墙基础概念和原理
防火墙的分类
按服务分为:主机防火墙和网络防火墙
按实现方式分为:硬件防火墙和软件防火墙
按OSI七层网络模型可分为:网络层防火墙和应用层防火墙
其中需要说明的是对于网络层防火墙和应用层防火墙来说各有优缺点:
网络层防火墙:对数据包进行选择,选择的依据是系统内设置的过滤逻辑 ,被称为访问控制列表(ACL),通过检查数据流中每个数据的 源地址,目的地址,所用端口号和协议状态等因素,或他们的组 合来确定是否允许该数据包通过 。 优点:对用户来说透明,处理速度快且易于维护 ;缺点:无法检查应用层数据,如病毒等
应用层防火墙/代理服务型防火墙(Proxy Service):将所有跨越防火墙的网络通信链路分为两段,内外网用户的访问都是通过代理服务器上的“链接”来实现。优点:在应用层对数据进行检查,比较安全;缺点:增加防火墙的负载
现实生产环境中所使用的防火墙一般都是二者结合体 :即先检查网络数据,通过之后再送到应用层去检查
实际上防火墙是linux的Netfilter组件,工作在内核空间并集成在linux内核中 ,通过各种二进制程序或其他软件来控制。
在linux内核中选取五个位置放了五个hook(勾子) function (INPUT、 OUTPUT、FORWARD、PREROUTING、POSTROUTING),用户可以通过一个命令工具(iptables)向其写入规则
网络传输报文流向:
- 流入本机:PREROUTING --> INPUT-->用户空间进程
- 流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
- 转发:PREROUTING --> FORWARD --> POSTROUTING
iptables由四个表和五个链以及一些规则组成
四个表 table:filter、nat、mangle、raw
- filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
- nat表:network address translation 地址转换规则表
- mangle:修改数据标记位规则表
- Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
优先级由高到低的顺序为:raw-->mangle-->nat-->filter
Netfilter表和链对应关系
当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
如果数据包就是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链 ,然后到达POSTROUTING链输出
如果数据包是要转发出去的,且内核允许转发,数据包就会向右 移动,经过FORWARD链,然后到达POSTROUTING链输出
规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理
- 基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
- 扩展匹配:通过复杂高级功能匹配
处理动作:称为target,跳转目标内建处理动作:ACCEPT、DROP、REJECT、SNAT、DNAT 、MASQUERADE、MARK、LOG...
规则要添加在链上,才生效;
iptables的rules添加法则
- 同类规则(访问同一应用),匹配范围小的放上面
- 不同类规则(访问不同应用),匹配到报文频率较大的放上面
- 将那些可由一条规则描述的多个规则合并为一个
- 设置默认策略
防火墙进阶(规则设定)
规则格式: iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-targetoptions]
-t table: raw, mangle, nat, [filter]默认
SUBCOMMAND:
1、链管理:
- -N:new, 自定义一条新的规则链
- -X:delete,删除自定义的空的规则链
- -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有: ACCEPT:接受 DROP:丢弃
- -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名, 也不能被删除
2、查看:
- -L:list, 列出指定鏈上的所有规则,本选项须置后
- -n:numberic,以数字格式显示地址和端口号
- -v:verbose,详细信息
- -vv 更详细
- -x:exactly,显示计数器结果的精确值,而非单位转换后的 易读值 --line-numbers:显示规则的序号
常用组合: --vnL、 --vvnxL 、--line-numbers
-S selected,以 iptables-save 命令格式显示链上规则
3、规则管理:
- -A:append,追加
- -I:insert, 插入,要指明插入至的规则编号,默认为第一条
- -D:delete,删除 (1) 指明规则序号 (2) 指明规则本身
- -R:replace,替换指定链上的指定规则编号
- -F:flush,清空指定的规则链
- -Z:zero,置零 iptables的每条规则都有两个计数器 (1) 匹配到的报文的个数 (2) 匹配到的所有报文的大小之和
匹配条件
基本:通用的,PARAMETERS
扩展:需加载模块,MATCH EXTENTIONS 加载模块用法:-m module-name --options ...
处理动作:
-j targetname [per-target-options]
- ACCEPT,
- DROP
- REJECT:--reject-with:icmp-port-unreachable默认
- RETURN:返回调用链 REDIRECT:端口重定向
- LOG:记录日志,dmesg
- MARK:做防火墙标记
- DNAT:目标地址转换
- SNAT:源地址转换
- MASQUERADE:地址伪装 ...
示例:
iptables -A INPUT -s 172.18.64.0/24 -d 172.18.64.107 -p tcp -m multiport --dports 20:22, 80 -j ACCEPT
iptables -A INPUT -d 172.18.64.107 -p tcp --dport 80 -m iprange --src-range 172.18.64.17- 172.18.64.97 -j DROP
iptables -A INPUT -s 172.18.64.106 -m mac --macsource 40:5E:5C:6E:9D:7A -j ACCEPT
iptables -A INPUT -s 172.18.64.17 -j REJECT
iptables -A OUTPUT -s 172.18.64.106 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT
iptables -A INPUT -s 172.18.64.0/16 -d 172.18.64.107 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun -j DROP (默认以格林日志时间为准!即北京时间-8)
iptables -A INPUT -d 172.18.64.107 -p tcp --dport 22 -m connlimit --connlimit-above(upto) 2 -j REJECT
iptables -I INPUT -d 172.18.100.107 -p icmp --icmptype 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
iptables -I INPUT 2 -p icmp -j REJECT
iptables -A INPUT -d 172.18.64.107 -p tcp -m multiport -- dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.18.64.106 -p tcp -m multiport - -sports 22,80 -m state --state RELATED,INVALID -j ACCEPT
iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multimport - -dports 80,21,22,23 -m state --state NEW -j LOG -- log-prefix "new connections:"
state扩展 :根据”连接追踪机制“去检查连接的状态,较耗资源
conntrack机制:追踪本机上的请求和响应之间的关系 ,状态有如下几种:
- NEW:新发出请求;连接追踪信息库中不存在此连接的 相关信息条目,因此,将其识别为第一次发出的请求
- ESTABLISHED:NEW状态之后,连接追踪信息库中为 其建立的条目失效之前期间内所进行的通信状态
- RELATED:新发起的但与已有连接相关联的连接,如: ftp协议中的数据连接与命令连接之间的关系
- INVALID:无效的连接,如flag标记不正确
- UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
已经追踪到的并记录下来的连接信息库 /proc/net/nf_conntrack
调整连接追踪功能所能够容纳的最大连接数量 /proc/sys/net/nf_conntrack_max
不同的协议的连接追踪时长 /proc/sys/net/netfilter/
开放被动模式的ftp服务
modprobe nf_conntrack_ftp
iptables -F
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m state -- state NEW -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
使用iptables命令定义的规则,手动删除之前,其生效期限为 kernel存活期限
保存规则: 保存规则至指定的文件
CentOS 6 service iptables save 将规则覆盖保存至/etc/sysconfig/iptables文件中
CentOS 7 可用下面方法保存规则 iptables -S > /PATH/TO/SOME_RULES_FILE 或:iptables-save > /PATH/TO/SOME_RULES_FILE
载入防火墙规则:
CentOS 6: service iptables restart 会自动从/etc/sysconfig/iptables 重新载入规则
CentOS 7 重新载入预存规则文件中规则: iptables-restore < /PATH/FROM/SOME_RULES_FILE
防火墙高级应用
网络防火墙:
iptables/netfilter网络防火墙: (1) 充当网关 (2) 使用filter表的FORWARD链
注意的问题:
(1) 请求-响应报文均会经由FORWARD链,要注意规则 的方向性
(2) 如果要启用conntrack机制,建议将双方向的状态为 ESTABLISHED的报文直接放行
NAT: network address translation PREROUTING,INPUT,OUTPUT,POSTROUTING
- SNAT:source NAT POSTROUTING, INPUT 让本地网络中的主机通过某一特定地址访问外部网络,实 现地址伪装 请求报文:修改源IP
- DNAT:, OUTPUT 把本地网络中的主机上的某服务开放给外部网络访问(发 布服务和端口映射),但隐藏真实IP 请求报文:修改目标IP
- PNAT: port nat,端口和IP都进行修改
SNAT :nat表的target,固定IP iptables -t nat -A POSTROUTING - s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
示例: iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! – d 10.0.1.0/24 -j SNAT --to-source 172.18.64.6- 172.18.64.9
SNAT :MASQUERADE:动态IP,如拨号网络 iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE
示例: iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! – d 10.0.1.0/24 -j MASQUERADE
DNAT :iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
示例: iptables -t nat -A PREROUTING -s 0/0 -d 172.18.64.6 -p tcp --dport 22 -j DNAT --todestination 10.0.1.22
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --todestination 10.0.1.22:8080
转发 :REDIRECT:通过改变目标IP和端口,将接受的包转发至不同地址 --to-ports port[-port]
示例: iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIECT --to-ports 8080
CentOS 7.x补充
firewalld是CentOS 7.0新推出的管理netfilter的工具 ,firewalld是配置和监控防火墙规则的系统守护进程。可以实 现iptables,ip6tables,ebtables的功能,firewalld服务由firewalld包提供,firewalld支持划分区域zone,每个zone可以设置独立的防火墙规则
归入zone顺序:
- 先根据数据包中源地址,将其纳为某个zone
- 纳为网络接口所属zone
- 纳入默认zone,默认为public zone,管理员可以改为其它zone
网卡默认属于public zone,lo网络接口属于trusted zone
firewalld zone分类:
三种配置方法
- firewall-config (firewall-config包)图形工具
- firewall-cmd (firewalld包)命令行工具
- /etc/firewalld 配置文件,一般不建议
CentOS7.x使用firewalld同时兼容iptables,而firewalld的rich规则更加灵活,会一种即可,在此不做过多介绍。
一些常用的iptables规则样例:
iptables -N clean_in
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
iptables -A clean_in -d 172.18.255.255 -p icmp -j DROP
iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean_in -d 172.18.64.7 -j RETURN
iptables -A INPUT -d 172.16.100.7 -j clean_in
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i eth37 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
iptables -A INPUT -i eth37 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
iptables -A INPUT -i eth37 -p udp --dport 1026 -j DROP
iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
总结:防火墙原理比较复杂,但真正实现起来非常简单,iptables的一系列命令而已,非常灵活强大!平时多练习就能更好掌握其用法!