基于Linux的三种防火墙(IPtables、Firewall、UFW)
学而不思则罔,思而不学则殆。
导航
IPtables部分
1、IPtables 四表五链。
- 四表:raw(决定数据包是否被状态跟踪机制处理)、mangle(修改数据包的服务类型、TTL、并且可以配置路由实现QOS)、nat(用于网络地址转换IP或端口)、filter(过滤数据包)。【通常我们只需要关注 filter、nat 表对应的链即可】
- 五链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
- 表可以理解为修改TCP/IP包头的不同位置、链可以理解为包被路由转换的不同阶段。iptables 命令配置参数中遵循 “表-->链-->规则”,但以 “链-->表-->规则” 的方式更便于理解。【链相当于流量包要走的道路,而表相当于道路上的一些关卡,不同的表对应不同的关卡要负责检查各自的事情(有管放行、有管导航)】
2、规则中处理动作:ACCEPT(接受)、REJECT(拒绝但会回复被拒原因)、DROP(直接丢弃无响应)、REDIRECT(端口重定向)、MASQUERADE(源地址动态伪装)、LOG(记录日志而后继续向下匹配规则)、DNAT(目的IP转换)、SNAT(源IP转换)、MIRROR、QUEUE、RETURN、MARK。【详细介绍】
这些动作也并非可以应用于所有表中的所有链,它们也有各自的适用范围。例,REDIRECT动作只能作用于nat表的PREROUTING链、OUTPUT链。
3、常用模块。
- 模块使用技巧:(1)iptables -m mod -h可在帮助末尾查询对应模块支持的参数帮助。(2)man iptables-extensions可查看多种iptables模块的功能介绍及参数说明。(3)linux命令行中通过tab加载不出来的模块并不代表该模块就无法使用,可能是tab补全功能并不完善。(4)模块存放路径在ls /lib/modules/
uname -r
/kernel/net/netfilter/目录下,可通过lsmode | grep tcpudp查找对应模块完整名称,再通过modeinfo xt_tcpudp查看模块详细情况。(5)模块通常都是在使用iptables -m mod时自动被系统insmod安装,若某些系统不支持自动安装时需通过手工的方式进行安装。 - 模块【参考自博客朱双印个人日志】:
- tcp、udp:默认的链规则匹配条件只支持-sd(源/目的IP)、-p(协议)、-lo(网卡输入/输出接口),加载该模块后可以支持--dport、--sport匹配条件,使用模块对应的功能时通常需要携带-m mod参数,但该模块的使用可以不携带-m参数,iptables默认会根据-p指定的tcp/udp来隐式加载对应的模块。例,iptables -t filter -I INPUT ! -s 192.168.1.0/24-p tcp -m tcp --dport 22:25 -j REJECT【匹配所有非 源地址为192.168.1.0网段且目的端口为22-25的包】;
- multiport:该模块支持--sports、--dports匹配条件,允许指定多个不连续的端口号,增强了--sport/--dport匹配条件只能指定单个端口或连续端口的缺陷。 例,iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT;
- iprange:该模块支持--src-range、--dst-range匹配条件,允许指定一段连续的IP地址范围。例,iptables -t filter -A INPUT -m iprange --src-range 192.168.1.1-192.168.1.10 -j DROP;
- string:该模块支持--string、--hex-string匹配条件,允许指定字符串来匹配包含对应字符串的数据包。例,iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT【在tcp报文中搜索OOXX的字符串,通常用于搜索http包中包含的数据】;
- time: 该模块支持--timestart、--timestop匹配条件,允许根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件。例,iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT【限制在早9晚7的时间段内不允许访问80网站】;
- connlimit:该模块支持--connlimit-above、--connlimit-mask 条件,可以限制每个IP地址同时链接到server端的链接数量,注意:我们不用指定IP,其默认就是针对”每个客户端IP”,即对单IP的并发连接数限制。例,iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT【限制在一个C类网段中254个ip总共只允许20个ssh连接】;
- limit:该模块支持--limit 速率、--limit-burst条件,可以限制单位时间内流入的包的数量【connlimit模块是对连接数量进行限制的,limit模块是对”报文到达速率”进行限制的。】例,iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT【令牌桶容量为3,限制每分钟只允许放行10个icmp包】;
- state:该模块支持--state 状态 参数,实现了“连接追踪”机制,可以判断接收到的这些报文是为了回应我们之前发出的报文,还是主动向我们发送的报文。【(1)state中的“连接”与tcp中的“连接”不能混为一谈,该连接可以面向tcp、udp、icmp等,属于一种状态连接。(2)state有5种连接状态,分别是NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED。】例,iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT【放行所有有连接状态的报文】;
4、规则配置技巧。
- 黑白名单机制。【该机制非传统意义上的黑白名单,它只是通过规则和默认策略之间动作的严格配合来达到传统黑白名单的效果,若配合不严格则黑白名单只是名存实亡。】(1)当链的默认策略为ACCEPT时,链中的规则对应的动作应该为DROP或者REJECT,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是“黑名单”机制。(2) 当链的默认策略为DROP时,链中的规则对应的动作应该为ACCEPT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是“白名单”机制。(3)若默认策略已经为ACCEPT,而我们在设置规则时,对应动作仍然为ACCEPT,那么所有报文就都会被放行。因为不管报文是否被规则匹配到都会被ACCEPT,所以该配置方法也就失去了访问控制的意义。
- 自定义链,即规则组。当针对各种服务(HTTP、SSH、FTP)的访问规则全部都写在一个链中时,规则的维护将变得异常复杂,此时最好的办法就是对规则进行分门别类,自定义链的出现很好的解决了此问题。(1)创建自定义链。iptables -t filter -N IN_WEB(2)引用自定义链。iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB(3)重命名自定义链。iptables -E IN_WEB WEB(4)删除自定义链。iptables -X WEB【只有自定义链不被引用且内部规则被清空之后,自定义链才能被删除。】
- 同类型服务,访问最苛刻的规则放在较宽松规则之前,否则报文都会通过宽松的规则直接处理而不会再匹配后面苛刻的规则,这样就会导致苛刻的规则相当于没配。如,规则1:iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT规则2:iptables -t filter -A INPUT -p tcp --dport 80 -s 192.168.1.11-j DROP,想达到除了192.168.1.11以外的其它人都可以访问web服务的效果,结果192.168.1.11还是可以访问web服务。
- 将命中频率更高的规则放在前面,这样可以提升防火墙处理包的效率。如,一天内访问web的次数是1000次,而ftp的次数是100次。若web规则序号是1,ftp序号是2,则完成这1100次过滤,防火墙需要匹配10001+1002=1200次;若ftp规则序号是1,web序号是2,则完成这1100次过滤,防火墙需要匹配1001+10002=2100次;
- 在配置IPTABLES白名单时,往往会将链的默认策略设置为ACCEPT,通过在链的最后设置REJECT规则实现白名单机制。而不是将链的默认策略设置为DROP,如果将链的默认策略设置为DROP,当链中的规则被清空时(清空前规则中肯定是已经配置了远程连接放行的规则),管理员的连接请求也将会被DROP掉。
5、辅助命令。
- iptables-save/iptables-restore:支持将配置的iptables规则导出及导入。【因iptables中配置的规则在主机重启之后就会丢失,因此规则的导入导出很重要。 似乎大多数iptables版本都不支持将规则保存在默认位置或默认在末位置进行加载。(关注目录/etc/sysconfig/iptables)】
- iptables-apply:类似于mysql事务一样,支持回滚、提交。【当通过ssh远程修改iptables时,错误的配置可能会导致远程连接被拒绝,此时在一定时间内因无动作或未提交,iptables规则将会回滚至某个正常的点。】
- iptables-xml:支持将导出的iptables规则文件转换为xml格式。
6、杂项。
- 处理动作 REDIRECT 似乎不止针对本机的端口重定向,在开启ip包转发之后,接收到的那些目的地址非本机ip的包,如果条件满足重定向规则,那么系统似乎直接就将该包递送到了本机的重定向端口处,而不去理会包的目的ip是否是本机。【根据对https劫持工具 sslstrip 使用过程分析得出此结论】
- 默认重定向都是本地端口重定向,即不管收到的包的目的地址是否是本机ip,动作REDIRECT都会直接将目的ip/port改为127.0.0.1/redictport。【REDIRECT动作作用于PREROUTING链、OUTPUT链,均是本地localhost的端口重定向。】
- 出站的数据包方向已定,能更改的表已不能再决定其走向;进站的数据包方向待定,可以通过更改而决定是入站还是转发;转发的数据包同出站类似,方向已定。
*、规则配置示例。
- NAT源地址转换:iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source 192.168.1.1【仅该命令即可实现NAT上网,将拥有2块网卡且开启ip路由转发的linux主机变成一个路由器来使用。不必考虑返程数据包是否需要再进行DNAT的转换,iptable似乎已智能跟踪生成返程数据包的DNAT转换规则。】
- NAT目的地址转换:iptables -t nat -A PREROUTING -d 192.168.100.1 -p tcp --dport 1234 -j DNAT --to-destination 192.168.1.1:3389【同上述一样,一条命令可实现将内网主机暴露在公网并提供内网服务。】
- MASQUERADE动态源地址转换:iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE【该规则适用于可上网网卡的ip地址不固定的NAT上网场景。】
- REDIRECT端口重定向:iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-ports 22【服务端并未有监听2222的端口,但是客户端却可以通过 ssh -p 2222 root@192.168.250.150来连接服务端的ssh服务】【wireshark在本机捕获到的是访问2222端口的报文,而非是重定向后22的端口,由此可得:网卡捕获的进出数据包的位置是在prerouting链之前和postrouting链之后这两个位置。】
- 流量包过滤:iptables -A INPUT -p all -s 1.1.1.1 -j DROP 【丢弃1.1.1.1 主机到访的所有协议的流量】
- 规则查看:iptables -L INPUT -t filter --line-numbers -n【查看 INPUT 链 filter 表的所有规则】
Firewall部分
1、Firewall 防火墙属于智能化的iptables规则管理服务,它的底层功能实现依旧还是iptables。它引进了zone的概念(相当于单张网卡的多个配置文件),并支持以网卡为单位进行zone规则的应用(使得不同信任级别的网卡可以分别对应不同级别的zone规则,而在iptables管理中,网卡之间的规则通常都是混为一谈的)。2、firewall中的zone相当于策略集,不同类型的zone分别对应不同的策略。如,internal和block区域中默认的target动作、预设的服务均不同。
- 丢弃区域(Drop Zone,信任级别1):丢弃所有无连接状态并主动连入的报文,有连接状态的包可进入,向外连接的包可放行。target为REJECT,无服务选中则允许连接特性,即选不选无效果。
- 阻塞区域(Block Zone,信任级别2):拒绝所有无连接状态并主动连入的报文,并返回 icmp-host-prohibited,有连接状态的包可进入,向外连接的包可放行。target为DROP,无服务选中则允许连接特性,即选不选无效果。
- 信任区域(Trusted Zone,信任级别9):允许所有网络连接通过。target为ACCEPT,无服务选中则允许连接特性,即选不选无效果。
- 隔离区域(DMZ Zone,信任级别5):如果想要只允许给部分服务能被外部访问,可以在 DMZ 区域中定义。target为default,支持只允许选中连接特性,即 ssh。
- 外部区域(External Zone,信任级别4):该区域与公共区域几乎无区别,仅是启用了伪装(masquerading)选项。target为default,支持只允许选中连接特性,默认只允许连接 ssh服务。
- 公共区域(Public Zone,信任级别3)/工作区域(Work Zone,信任级别6)/家庭区域(Home Zone,信任级别7)/内部区域(Internal Zone,信任级别8):这四个区域几乎无区别,target均为default,均支持只允许被选中的连接,默认只允许连接ssh、dhcpv6-client、mdsn、samba-client服务。
- 注意:以上各区域之间的特性在firewall-conf图形化界面来看似乎无多大差别,具体细节可以通过iptables -Lnv来详细对比区别。
3、firewall两种配置类型。
- Runtime:临时存在,立即生效。在Runtime模式下进行的修改,当执行重载(firewall-cmd --reload)或主机重启之后,修改将全部丢失,再次同Permanent配置保持一致。
- Permanent:长久存在,手动触发生效(重载/重启)。在Permanen模式下进行的修改,只有执行重载或重启之后,修改项才会在本机生效。
4、zone面向绑定的3种类型。
- Connections:根据网卡绑定zone。当前正处在连接状态的有线网络、无线网络,即桌面状态栏处可以看的见的连接网卡。
- Interfaces:根据虚拟网卡绑定zone。一些虚拟的网络适配器,如本地回环lo、docker桥等。若指定的是一个未在线的有线网络,那么当连接在线时此处的配置自动消失,有线网络绑定的zone依旧以Connections处的zone为主。
- Sources:根据收到的包的源地址进行zone的匹配。一些ip/mask格式的网段。Source与Connections/Interfaces难免会存在交集的地方,于是Source的优先级会高于另外2中类型。依据这一特性,可以实现黑白名单的效果(通常rich rule看起来更灵活一些)。例,活动的Connection绑定到DROP区域,将Source 条目绑定到TRUST区域。
5、全局基础组件介绍。
- Services:服务管理。支持自定义一些常见服务或第三方的服务,可根据服务的特性进行 Port(监听端口/目的端口)、Source Port(限定连接主机的源端口不可太随意)、Protocols(未知)、Modules(根据Helpers中定义的项进行下拉选择,通常都是类似于ftp这样的多通道服务才会用到)、Destination(限定服务绑定的IP范围/目的ip)的自定义,通常只需设置Port即可。
- IPSets:IP集合。实现一条规则处理多个ip,可重复使用而且便于管理。通常供Rich Rule所调用。
- ICMP Type:ICMP类型管理。通常来说预定义的icmp类型都已包含,不需要再进行添加删除更改。
- Helpers:连接追踪助手。针对多连接通道服务,通过对应的追踪模块进行连接追踪。如,通过监听ftp 21端口的第一通道可以得知第二通道的连接端口号。
6、附带功能。
- Direct Configuration:相当于iptables的GUI操作界面,可直接以iptables“表-链-规则”的方式配置防火墙。
- Lockdown whitelist:表示进行SELinux规则的配置,防止其它应用或用户对防火墙规则进行更改。
7、Zone中的过滤类型。
- Services、Ports、Protocols、Source Ports、ICMP Filter,这5种过滤类型互相之间是“或”关系,且面向所有来源ip和目的ip。优先级相等。
- Rich Rules,该过滤类型较灵活,可以为不同的规则分别配置不同的target 动作,支持IPSet、Log、Audit功能,面向个例。优先级高于前5种过滤类型。
8、Zone中的功能类型。
- Masquerading:源ip伪装。
- Port Forwarding:端口转发,支持本地端口转发和远程端口转发。
9、辅助命令。(1)firewall-cmd 命令行的防火墙管理器。(2)firewall-config 图形界面的防火墙规则管理器。10、杂项。
- panic模式开启之后,所有进来出去的包都会被丢弃,此时不在以所在zone的策略规则进行限制。
*、规则配置示例。
- 列出当前区域的配置信息。firewall-cmd --list-all;
- 检查指定区域指定服务是否被标记。firewall-cmd --zone=public --query-service=ssh;
- 重载 Permanent 配置到 Runtime 。firewall-cmd --reload;
- 放行指定端口。firewall-cmd --add-port=80/tcp [--permanent];
UFW部分
1、UFW是为轻量化配置iptables而开发的一款工具,它的底层功能依旧还是iptables实现,最大的亮点就是简单,仅支持报文过滤、日志记录、转发。
2、命令介绍。
- ufw enable/disable 防火墙启用/禁用,同时也代表开机自启启用或禁用。
- ufw default allow/deny/reject [incoming/outgoing/routed] 三条通道的默认策略。
- ufw allow/deny/reject/limit/route/ rule 新增规则并设定动作,limit限制访问速率、route针对性路由转发。
- ufw delete/insert rule 规则管理。
- ufw reload/reset/status 规则重载/重置/查看。
- ufw app list/info ser-name 包含相关端口信息的服务应用列表。相当于firewall中的services管理部分。
3、辅助命令。(1)ufw 命令行防火墙管理器。(2)gufw 图形界面防火墙管理器,通常只有ufw命令行会被安装。4、杂项。
- 规则中使用的service名称,ufw是根据/etc/services得来的对应服务的端口信息。
- 增删改防火墙规则之后,通常是不会立即生效的,需要重载或重启ufw来生效。默认策略的更改却会立即生效。
- 进站(incoming)的默认策略设置为deny之后,却依然无法阻挡icmp的请求。需在ufw配置文件/etc/ufw/before.rules添加-A ufw-before-input -p icmp --icmp-type echo-request -j DROP才能达到禁ping的效果。
*、规则配置示例。
- 基本格式:ufw [ --dry-run ] [ rule ] [ delete ] [ insert NUM ] [ preend ] allow | deny | reject | limit [ in | out [ on INTERFACE ]] [ log | log-all ] [ proto PROTOCOL ] [ from ADDRESS [ port PORT | app APPNAME ]] [ to ADDRESS [ port PORT | app APPNAME ]] [ comment COMMENT ]
- 允许一个tcp25的端口进入。ufw allow 25/tcp comment 'test';允许连接ssh服务。ufw allow ssh;允许连接apache服务。ufw allow Apache(app-name);
- 允许一个从eth0网卡进入到eth1网卡出去,且来源地址在192.168.0.0/16目的地址在10.0.0.0/8的包通过。如下图第三行。
对比总结
1、netfilter、iptables、firewall、ufw之间的关系:netfilter-->iptables-->[ firewall | ufw ]。netfilter处在最底层(内核),负责根据上层下达的规则对报文进行处理【实际干活的】;iptables属于一个应用层临时命令工具,负责制定一系列的规则然后提交给netfilter【部门领导】;firewall和ufw属于一个应用层常驻服务工具,负责用人性化的语言制定最齐全的规则并将其转换为iptables理解的规则,然后让iptables再提交给netfilter进行处理【公司领导】。
- iptables属于一个应用层临时命令工具:规则制定之后iptables便不再参与什么活动,等系统重启之后之前配置的规则全部都丢失,只能再次通过iptables-restore来手动恢复之前通过iptables-save保存的规则。(有些linux发行版中,iptables也属于一种常驻服务,可以通过服务管理工具统一对其进行管理。但是似乎不支持规则动态加载。)
- firewall和ufw属于一个应用层常驻服务工具:服务在启用之后便将自身此前存储的规则自动通过iptables进行加载,而后如果有新的规则变动,它们都可以支持规则的动态加载让其立即生效(ufw存疑)。
2、应用平台。iptables是红帽系列6及以下的默认防火墙(如CentOS6.x),firewall 是红帽系列7及以上的默认防火墙(如CentOS7.x),UFW是Debian系列的默认防火墙。虽然都是在不同平台下的默认防火墙,但并非ufw就不能再红帽系列使用。3、兼容性。iptables是linux防火墙的基石,所以存在firewall、ufw的地方就一定会看到iptables。而在不启用firewall、ufw服务的情况下,也依旧可以通过iptables来使用防火墙。不过firewall和ufw同时存在并启的情况下,规则会很混乱。4、Firewall防火墙与华为下一代USG防火墙 区域对比。USG也使用了区域的概念,不过在使用上与firewall有很大的区别。
- Firewall 区域:多规则的集合,将区域与流量通道(网络接口)进行绑定,达到对过往流量的控制。【面向单主机】 例,当一个报文从网卡进入时,系统便根据网卡绑定的区域进行对应区域规则的逐条匹配。
- USG 区域:多接口的集合,将区域当做规则五元组(源/目的区域、源/目的ip-port、动作)的一部分。整体使用上就是:接口划区-->进入策略-->创建规则。【面向多网络】 例,当一个报文从网卡进入时,系统根据网卡的来源得知其来源区域,又根据目的ip路由得出其去往网卡的目的区域,然后根据得到的信息(源/目的区域、源/目的ip-port)开始逐条匹配策略中的规则。