20171018 Linux防火墙
- 防火墙的概念
- iptables的简介
- iptables命令
- 网络防火墙
- NAT
- firewalld服务
一、防火墙的概念
(一)安全技术简介
(1)入侵检测与管理系统(Intrusion Detection System)
- 特点:不阻断任何网络访问
- 功能:提供报告和事后监督
- 旁路部署
(2)入侵防御系统(Intrusion Prevention System)
- 特点:透明模式工作,分析数据包
- 功能:判定为攻击时,立即阻断攻击连接
- 在线部署
(3)防火墙(Firewall)
- 特点:默认关闭所有通过访问,只开放允许访问的策略
- 功能:基于设置的规则对进出网络或主机的数据包进行审查,并在符合相关规则时执行规则定义的某些行为
- 工作在网络或主机的边缘,起到隔离的作用
(二)防火墙的分类
(1)按照服务范围分
- 主机防火墙:服务范围为当前主机
- 网络防火墙:服务范围为防火墙一侧的局域网
(2)按照实现方式分
- 硬件防火墙:在专用硬件级别实现部分功能的防火墙,另一个部分功能基于软件实现,Checkpoint,NetScreen
- 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件
(3)按照工作的网络层次分
- 网络层防火墙:OSI下面第三层
- 应用层防火墙/代理服务器:代理网关,OSI七层
(三)网络层防火墙
- 包过滤防火墙
- 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过
- 优点:对用户来说透明,处理速度快且易于维护
- 缺点:无法检查应用层数据,如病毒等
(四)应用层防火墙/代理服务型防火墙
- 将所有跨越防火墙的网络通信链路分为两段
- 内外网用户的访问都是通过代理服务器上的“链接”来实现
- 优点:在应用层对数据进行检查,比较安全
- 缺点:增加防火墙的负载
二、iptables的简介
(一)Netfilter组件
- 内核空间,集成在linux内核中
- 扩展各种网络服务的结构化底层框架
- 内核中选取五个位置放了五个hook(勾子) function(INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则
- 由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上
- 三种报文流向:
流入本机:PREROUTING --> INPUT-->用户空间进程
流出本机:用户空间进程-->OUTPUT--> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING
(二)防火墙工具
- iptables
命令行工具,工作在用户空间
用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包 - firewalld
CentOS 7引入了新的前端管理工具
(三)iptables的组成
-
主要由四个表、五个链以及一些规则组成
-
四个表(table): filter, nat, mangle, raw
- filter: 过滤规则表,根据预定义的规则过滤符合条件的数据包
- nat: network address translation 地址转换规则表
- mangle: 修改数据标记位规则表
- raw: 关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
- 优先级由高到低的顺序为: raw-->mangle-->nat-->filter
-
五个内置链chain
- INPUT
- OUTPUT
- FORWARD
- PREROUTING
- POSTROUTING
(四)内核中数据包的传输过程
-
当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
-
如果数据包就是进入本机的,数据包就会经过INPUT链供有关进程接收。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出
-
如果数据包是要转发出去的,且内核允许转发,数据包就会经过FORWARD链,然后到达POSTROUTING链输出
(五)iptables规则
-
规则(rule):根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理
-
匹配条件:默认为与条件,同时满足
基本匹配:IP,端口,TCP的Flags(SYN, ACK等)
扩展匹配:通过复杂高级功能匹配 -
处理动作(target):
内建处理动作:ACCEPT, DROP, REJECT, SNAT, DNAT, MASQUERADE, MARK, LOG...
自定义处理动作:自定义chain,利用分类管理复杂情形 -
链(chain):
内置链:每个内置链对应于一个钩子函数
自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制
只有Hook钩子调用自定义链时,才生效
(六)iptables添加要点
-
iptables规则添加时考量点
要实现哪种功能:判断添加在哪张表上
报文流经的路径:判断添加在哪个链上
报文的流向:判断源和目的
匹配规则:业务需要 -
链上规则的次序,即为检查的次序,因此隐含一定的法则
同类规则(访问同一应用),匹配范围小的放上面
不同类规则(访问不同应用),匹配到报文频率较大的放上面
可由一条规则描述的多个规则合并为一个
设置默认策略
三、iptables命令
- 实验环境准备
// CentOS 7关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
// CentOS 6关闭系统默认iptables策略
service iptables stop
chkconfig iptables off
(一)规则格式
iptables [-t table] SUBCOMMAND chain rule-specification
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
- -t table:raw|mangle|nat|[filter]:指定表,filter表为默认
- chain:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
(二)SUBCOMMAND
(1)查看
-
选项:
- -L:list, 列出指定链上的所有规则,本选项须置后
- -n:numberic,以数字格式显示地址和端口号
- -v:verbose,详细信息
- -vv:更详细
- -x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
- --line-numbers:显示规则的序号
- -S:selected,以iptables-save命令格式显示链上规则
-
常用组合:
--vnL
--vnxL --line-numbers -
查看当前的策略
![](https://img.haomeiwen.com/i6851458/4a893b25c27510f0.png)
- 查看当前的策略,并详细显示了策略编号以及计数器的精确值
![](https://img.haomeiwen.com/i6851458/4665015cbb195555.png)
(2)规则管理
-
选项:
- -A:append,追加
- -I #:insert,插入,要指明插至的规则编号,默认为第一条
- -D:delete,删除,后接:
指明规则序号,或者
指明规则本身 - -R #:replace,替换指定链上的指定编号规则
- -F:flush,清空指定的规则链
- -Z:zero,置零
-
iptables的每条规则都有两个计数器
- 匹配到的报文的个数
- 匹配到的所有报文的大小之和
-
实验:iptables规则管理
// 添加策略:阻止来自192.168.136.130主机的访问 iptables -A INPUT -s 192.168.136.130 -j REJECT // 插入策略:阻止来自192.168.25.0/24网段的访问,并且此策略编号为1 iptables -I INPUT 1 -s 192.168.25.0/24 -j REJECT // 替换策略:将策略2改为阻止来自192.168.136.129主机的访问 iptables -R INPUT 2 -s 192.168.136.129 -j REJECT // 删除策略:删除策略1 iptables -D INPUT 1 // 清空策略,并将计数器归零 iptables -F iptables -Z
- 添加策略
- 插入策略
- 替换策略
- 删除策略
- 清空策略,并且计数器归零
(三)匹配条件
- 分类:
基本:通用的,PARAMETERS
扩展:需加载模块,MATCH EXTENTIONS
(1)基本匹配条件:无需加载模块,由iptables/netfilter自行提供
-
选项:
- -s, --source address[/mask][,...]:源IP地址或范围
- -d, --destination address[/mask][,...]:目标IP地址或范围
- -p, --protocol protocol:指定协议
protocol: tcp, udp, icmp, 参看:/etc/protocols - -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT, FORWARD, PREROUTING链
- -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD, OUTPUT, POSTROUTING链
-
实验:阻止来自192.168.136.0/24网段主机的icmp连接
// 设置策略(IP: 192.168.136.230)
iptables -A INPUT -s 192.168.136.0/24 -p icmp -j REJECT
// 在其他主机测试(IP: 192.168.136.130)
ping -c 5 192.168.136.230
curl 192.168.136.230
![](https://img.haomeiwen.com/i6851458/c864e471cef871c1.png)
(2) 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效
- 查看帮助:man iptables-extensions (CentOS 7),man iptables (CentOS 6)
1)隐式扩展:
- 在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块
- tcp协议的扩展选项
--source-port, --sport port[:port]
匹配报文源端口,可为端口范围
--destination-port, --dport port[:port]
匹配报文目标端口,可为端口范围
--tcp-flags mask comp
mask:需检查的标志位列表(例如SYN,ACK,FIN,RST),用","分隔
comp:在mask列表中必须为1的标志位列表,无指定则必须为0,用","分隔
- 实验:拒绝telnet和ssh服务的建立新连接,旧连接保持原状
分析:拒绝telnet和ssh服务可以封禁端口,只拒绝建立新连接即拒绝TCP状态位中只有SYN=1的状态
// 设置策略(IP: 192.168.136.230),以下两条命令等价
iptables -A INPUT -p tcp --dport 22:23 --tcp-flags SYN,ACK,FIN,RST SYN -j REJECT
iptables -A INPUT -p tcp --dport 22:23 --syn -j REJECT
// 在其他主机测试(IP: 192.168.136.130)
ssh 192.168.136.230
telnet 192.168.136.230
![](https://img.haomeiwen.com/i6851458/ac88d1125c28f208.png)
-
udp协议的扩展选项
--source-port, --sport port[:port]
匹配报文的源端口,可以是端口范围
--destination-port, --dport port[:port]
匹配报文的目标端口,可以是端口范围 -
icmp协议的扩展选项
--icmp-type {type[/code]|typename}
type/code
0/0 echo-reply:icmp应答
8/0 echo-request:icmp请求
- 实验:阻止对本机的icmp请求
iptables -A INPUT -p icmp --icmp-type 8 -j REJECT
设定策略前ping本机ip正常,设定策略后ping本机ip全部失败
![](https://img.haomeiwen.com/i6851458/9edde91675d03e50.png)
2)显式扩展:
- 必须使用-m选项指明要调用的扩展模块的扩展机制,需要手动加载扩展模块
[-m matchname[per-match-options]]
- multiport扩展:以离散方式定义多端口匹配,最多指定15个端口
--source-ports, --sports port[,port|,port:port]...
指定多个源端口
--destination-ports, --dports port[,port|,port:port]...
指定多个目标端口
--ports port[,port|,port:port]...多个源或目标端口
- 实验:阻止来自192.168.136.0/24网段主机在TCP的20-25, 80端口的访问请求
// 设置策略(IP: 192.168.136.230)
iptables -A INPUT -s 192.168.136.0/24 -p tcp -m multiport -dports 20:25,80 -j REJECT
// 在其他主机测试(IP: 192.168.136.130)
ftp 192.168.136.230
ssh 192.168.136.230
telnet 192.168.136.230
curl 192.168.136.230
设置策略前
![](https://img.haomeiwen.com/i6851458/216a939a9b3ab570.png)
设置策略后
![](https://img.haomeiwen.com/i6851458/62973137fdc999ff.png)
- iprange扩展:指明连续的(但一般不是整个网络)ip地址范围
--src-range from [-to] 源IP地址范围
--dst-range from [-to] 目标IP地址范围
- 示例:阻止IP在192.168.136.129-192.168.136.229范围内的主机建立tcp连接
iptables -A INPUT -p tcp -m iprange --src-range 192.168.136.129-192.168.136.229 -j REJECT
- mac扩展:指明源MAC地址
适用于:PREROUTING, FORWARD, INPUT chains
--mac-source XX:XX:XX:XX:XX:XX
- 示例:阻止来自MAC地址为00:50:56:3f:60:3c的主机建立icmp连接
iptables -A INPUT -p icmp -m mac --mac-source 00:50:56:3f:60:3c -j REJECT
- string扩展:对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp}:字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset:开始偏移
--to offset:结束偏移
--string pattern:要检测的字符串模式
--hex-string pattern:要检测字符串模式,16进制格式
- 实验:阻断http服务器返回报文中包含google字样的连接
// 设置策略(IP: 192.168.136.230)
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT
// 在其他主机测试(IP: 192.168.136.130)
curl 192.168.136.230
curl 192.168.136.230/index2.html
前两行为设置策略前,后两行为设置策略后
![](https://img.haomeiwen.com/i6851458/a938d2390e7167a5.png)
- 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...]:星期几
CentOS 7使用UTC时间,CentOS 6使用本地时区时间
- 实验:设置工作日指定时间段禁止http连接
// 当前策略设置的时间段为UTC 01:00-10:00,当前时间不在范围中,故可以访问http服务
iptables -A INPUT -p tcp --dport 80 -m time --timestart 01:00 --timestop 10:00 ! --weekdays Sat,Sun -j REJECT
// 更新策略后,时间范围改为UTC 01:00-14:00,当前时间在范围中,故访问被拒绝
iptables -R INPUT 1 -p tcp --dport 80 -m time --timestart 01:00 --timestop 14:00 ! --weekdays Sat,Sun -j REJECT
![](https://img.haomeiwen.com/i6851458/e5a51a94fdf1c783.png)
- connlimit扩展:根据每客户端IP做并发连接数数量匹配
可防止CC(Challenge Collapsar挑战黑洞)攻击
--connlimit-upto n:连接的数量小于等于n时匹配,与默认的拒绝策略配合使用
--connlimit-above n:连接的数量大于n时匹配,与默认的允许策略配合使用
- 示例:只允许来自192.168.136.130主机发起最多2个并发ssh连接
iptables -A INPUT -s 192.168.136.130 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
- limit扩展:基于收发报文的速率做匹配
令牌桶过滤器
--limit rate [/second|/minute|/hour|/day]:限速
--limit-burst number:前多少个报文不做限速
- 示例:对icmp发起的请求进行限速,前5个请求不限速,之后的请求每10秒允许一个
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 6/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
![](https://img.haomeiwen.com/i6851458/52fed3db398b3d5a.png)
- 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服务的被动模式
分析:ftp服务的被动模式端口不固定,一般指定端口的方法不适用,通过放行21端口的相关端口的方法设置相关策略
modprobe nf_conntrack_ftp // 装载ftp连接追踪模块
iptables -F
// 放行已经建立的命令连接、数据连接以及新发起的数据连接
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
// 放行新发起的命令连接
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
// 阻止其他无关连接
iptables -A INPUT -j REJECT
![](https://img.haomeiwen.com/i6851458/8576d1f7289a8170.png)
(四)Target:处理动作
-
语法:
-j targetname [per-target-options]
-
简单:
ACCEPT:放行
DROP:丢弃 -
扩展:
REJECT:拒绝
RETURN:返回调用链
REDIRECT:端口重定向
LOG:记录日志,dmesg
MARK:做防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE:地址伪装 -
LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则前并将日志记录在/var/log/messages系统日志中
--log-level level 级别:emerg, alert, crit, error, warning, notice, info or debug
--log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符 -
实验:将新发起的ssh和http请求记录在系统日志中,日志条目以"new connections: "作为前缀存储
iptables -A INPUT -p tcp -m multiport --dports 22,80 -m state --state NEW -j LOG --log-prefix "new connections: "
![](https://img.haomeiwen.com/i6851458/ae335e559ce64e27.png)
(五)链管理
-
选项:
-N:new,自定义一条新的规则链
-X:delete,删除自定义的空规则链
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
-E:重命名自定义链 -
注意:
引用计数不为0的自定义链不能够被重命名,也不能被删除
不建议修改链默认策略,可以设置策略兜底 -
实验:自定义链"deny_icmp_ssh",作用为拒绝icmp和ssh连接。关联"deny_icmp_tcp"链至INPUT链,实现拒绝来自192.168.136.100-192.168.136.200范围内主机的icmp和ssh连接
// 新建自定义链
iptables -N deny_icmp_ssh
iptables -A deny_icmp_ssh -p icmp -j REJECT
iptables -A deny_icmp_ssh -p tcp --dport 22 -j REJECT
// 关联自定义链至INPUT链
iptables -A INPUT -m iprange --src-range 192.168.136.100-192.168.136.200 -j deny_icmp_ssh
// 其他主机上测试
ping -c 5 192.168.136.230
ssh 192.168.136.230
// 清除自定义链
iptables -F deny_icmp_ssh // 清除deny_icmp_ssh链的策略
iptables -F //清除INPUT关联deny_icmp_ssh链的策略
iptables -X deny_icmp_ssh //删除策略为空的deny_icmp_ssh链
设置完毕的策略:自定义链下两条策略,INPUT链的策略关联了自定义链
![](https://img.haomeiwen.com/i6851458/96a7f5a79d83b298.png)
在IP: 192.168.136.130主机测试ping和ssh登录,均失败
![](https://img.haomeiwen.com/i6851458/f5bf60fe6845419c.png)
在IP: 192.168.136.229主机测试ping和ssh登录,均成功
![](https://img.haomeiwen.com/i6851458/0aa6afb052e00b8c.png)
(六)iptables规则安排的基本原则
-
任何不允许的访问,应该在请求到达时给予拒绝
-
规则在链接上的次序即为其检查时的生效次序
-
基于上述,规则优化
- 安全放行所有入站和出站的状态为ESTABLISHED状态连接
- 谨慎放行入站的新请求
- 有特殊目的限制访问功能,要在放行规则之前加以拒绝
- 同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理
- 不同类的规则(访问不同应用),匹配范围大的放在前面
- 应该将那些可由一条规则能够描述的多个规则合并为一条
- 设置默认策略,建议白名单(只放行特定连接)
- 修改默认策略时不建议
iptables -P
,建议在规则的最后定义规则做为默认策略
(七)iptables规则的保存和生效
-
规则有效期限:
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限 -
保存规则至指定的文件:
- CentOS 6环境
// 将规则覆盖保存至/etc/sysconfig/iptables文件中 service iptables save // 自动从/etc/sysconfig/iptables重新载入规则 service iptables start
- CentOS 7环境
// 规则文件重定向至文件,以下两条命令等效 iptables -S > /PATH/TO/SOME_RULES_FILE iptables-save > /PATH/TO/SOME_RULES_FILE // 重新载入预存规则文件中的规则 iptables-restore < /PATH/FROM/SOME_RULES_FILE
- iptables-restore 选项:
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交
-
开机自动重载规则文件中的规则:
-
CentOS 6:设置iptables开机启动
chkconfig --list iptables
-
CentOS 7:在/etc/rc.d/rc.local文件添加规则恢复命令
vim /etc/rc.d/rc.local iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE chmod +x /etc/rc.d/rc.local
-
四、网络防火墙
-
iptables/netfilter网络防火墙:
- 充当网关
- 使用filter表的FORWARD链
-
注意的问题:
- 请求-响应报文均会经由FORWARD链,要注意规则的方向性
- 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行
-
允许内网(192.168.136.0/24)的主机访问外网(172.18.0.0/16)的ftp, ssh服务,但外网的主机不允许访问内网主机的所有服务
modprobe nf_conntrack_ftp iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s 192.168.136.0/24 -p tcp --dport 21:22 -j ACCEPT iptables -A FORWARD -j REJECT
- 内网访问外网的ftp, ssh服务均成功
- 外网访问内网的ftp, ssh服务均失败
五、NAT
(一)NAT基本概念
-
NAT:network address translation
链:PREROUTING,INPUT,OUTPUT,POSTROUTING
请求报文:修改源/目标IP,由定义如何修改
响应报文:修改源/目标IP,根据跟踪机制自动实现 -
SNAT:source NAT
链:POSTROUTING, INPUT
让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装
请求报文:修改源IP -
DNAT:destination NAT
链:PREROUTING, OUTPUT
把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP
请求报文:修改目标IP -
PNAT:port NAT,端口和IP都进行修改,发生在多台本地网络主机的端口冲突时
(二)SNAT配置:通过net表的target配置
-
SNAT:固定IP
--to-source [ipaddr[-ipaddr]][:port[-port]] -
MASQUERADE:动态IP,如拨号网络
-
实验:通过SNAT实现本地网络主机访问外网,而不会暴露本地网络主机IP
-
当外网IP为固定IP时
iptables -t nat -A POSTROUTING -s 192.168.136.0/24 -j SNAT --to-source 172.18.251.164
-
当外网IP为动态IP时,
iptables -t nat -A POSTROUTING -s 192.168.136.0/24 -j MASQUERADE
-
测试:内网主机访问外网服务器http服务
curl 172.18.250.44
外网服务器httpd服务日志显示源地址为172.18.251.164,实现了SNAT功能
-
(三)DNAT配置:通过net表的target配置
-
格式:DNAT --to-destination [ipaddr[-ipaddr]][:port[-port]]
-
实验:实现本地网络主机通过外网的指定网址提供http服务,具体如下:
外网指定IP:172.18.251.164,内网主机IP:192.168.136.230
外网IP端口80指向内网主机的80端口,外网IP端口8080指向内网主机的8000端口iptables -t nat -A PREROUTING -d 172.18.251.164 -p tcp --dport 80 -j DNAT --to-destination 192.168.136.230:80 iptables -t nat -A PREROUTING -d 172.18.251.164 -p tcp --dport 8080 -j DNAT --to-destination 192.168.136.230:8000
- 外网主机通过指定外网IP的不同端口成功访问内网主机不同端口提供的http服务
- 内网主机的访问日志,可以看到外网主机IP
(四)转发:通过改变目标IP和端口,将接受的包转发至不同地址
-
格式:REDIRECT --to-ports port[-port]
-
作用于NAT表,可用于:PREROUTING, OUTPUT, 自定义链
-
实验:实现将对主机1314,9527端口的访问转发至主机的80端口
iptables -t nat -A PREROUTING -d 192.168.136.230 -p tcp -m multiport --dports 1314,9527 -j REDIRECT --to-ports 8000
![](https://img.haomeiwen.com/i6851458/c08c593bc6541527.png)
六、firewalld服务
(一)基本概念
(1)简介
- firewalld是CentOS 7.0新推出的管理netfilter的工具
- firewalld是配置和监控防火墙规则的系统守护进程,可以实现iptables,ip6tables,ebtables的功能
- firewalld服务由firewalld包提供
(2)zone:区域
- firewalld支持划分区域zone,每个zone可以设置独立的防火墙规则
- 归入zone顺序:
- 先根据数据包中源地址,将其纳为某个zone
- 纳为网络接口所属zone
- 纳入默认zone,默认为public zone,管理员可以改为其它zone
- 网卡默认属于public zone,lo网络接口属于trusted zone
- firewalld zone分类
zone名称 | 默认配置 |
---|---|
trusted | 允许所有流量 |
home | 拒绝除和传出流量相关的,以及ssh,mdsn,ipp-client,samba-client,dhcpv6-client预定义服务之外其它所有传入流量 |
internal | 和home相同 |
work | 拒绝除和传出流量相关的,以及ssh,ipp-client,dhcpv6-client预定义服务之外的其它所有传入流量 |
public | 拒绝除和传出流量相关的,以及ssh,dhcpv6-client预定义服务之外的其它所有传入流量,新加的网卡默认属于publiczone |
external | 拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量,属于external zone的传出ipv4流量的源地址将被伪装为传出网卡的地址。 |
dmz | 拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量 |
block | 拒绝除和传出流量相关的所有传入流量 |
drop | 拒绝除和传出流量相关的所有传入流量(甚至不以ICMP错误进行回应) |
(二)firewalld配置
- firewall-cmd --get-services 查看预定义服务列表
- /usr/lib/firewalld/services/*.xml预定义服务的配置
(1)三种配置方法
- firewall-config:图形工具(firewall-config包)
- firewall-cmd:命令行工具(firewalld包)
- /etc/firewalld:配置文件,一般不建议
(2)firewall-cmd 命令选项
- --get-zones
列出所有可用区域 - --get-default-zone
查询默认区域 - --set-default-zone=<ZONE>
设置默认区域 - --get-active-zones
列出当前正使用的区域 - --add-source=<CIDR> [--zone=<ZONE>]
添加源地址的流量到指定区域,如果无--zone= 选项,使用默认区域 - --remove-source=<CIDR> [--zone=<ZONE>]
从指定区域中删除源地址的流量,如果无--zone= 选项,使用默认区域 - --add-interface=<INTERFACE> [--zone=<ZONE>]
添加来自于指定接口的流量到特定区域,如果无--zone= 选项,使用默认区域 - --change-interface=<INTERFACE> [--zone=<ZONE>]
改变指定接口至新的区域,如果无--zone= 选项,使用默认区域 - --list-all [--zone=<ZONE>]
列出指定区域的所有配置信息,包括接口、源地址、端口、服务等,如果无--zone= 选项,使用默认区域 - --add-service=<SERVICE> [--zone=<ZONE>]
允许服务的流量通过,如果无--zone= 选项,使用默认区域 - --add-port=<PORT/PROTOCOL> [--zone=<ZONE>]
允许指定端口和协议的流量,如果无--zone= 选项,使用默认区域 - --remove-service=<SERVICE> [--zone=<ZONE>]
从区域中删除指定服务,禁止该服务流量,如果无--zone= 选项,使用默认区域 - --remove-port=<PORT/PROTOCOL> [--zone=<ZONE>]
从区域中删除指定端口和协议,禁止该端口的流量,如果无--zone= 选项,使用默认区域 - --reload
删除当前运行时配置,应用加载永久配置 - 示例:
// 查看默认zone
firewall-cmd --get-default-zone
// 默认zone设为dmz
firewall-cmd --set-default-zone=dmz
// 在internalzone中增加源地址192.168.0.0/24的永久规则
firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24
// 在internalzone中增加协议mysql的永久规则
firewall-cmd --permanent --zone=internal --add-service=mysql
// 加载新规则以生效
firewall-cmd --reload
(三)rich规则
- 当基本firewalld语法规则不能满足要求时,可以使用以下更复杂的规则
- rich-rules:富规则,功能强,表达性语言
- direct configuration rules:直接规则,灵活性差
帮助:man 5 firewalld.direct
(1)rich规则简介
- rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和auditd,也可以实现端口转发,伪装和限制速率
- rich语法:
rule
[source]
[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]
- man 5 firewalld.richlanguage
(2)rich规则生效顺序
- 该区域的端口转发,伪造规则
- 该区域的日志规则
- 该区域的允许规则
- 该区域的拒绝规则
- 每个匹配的规则生效,所有规则都不匹配,该区域默认规则生效
(3)rich规则选项
- --add-rich-rule='<RULE>'
添加rich规则至指定zone,若未指明zone则为默认zone - --remove-rich-rule='<RULE>'
从指定zone删除rich规则,若未指明zone则为默认zone - --query-rich-rule='<RULE>'
查询指定zone中是否有RULE规则,若未指定zone则为默认zone
返回值0代表存在,返回值1代表不存在 - --list-rich-rules
列出指定zone的所有rich规则,若未指定zone则为默认zone - 示例:
// 拒绝从192.168.0.11的所有流量,当address选项使用source或destination时,必须用family=ipv4|ipv6.
firewall-cmd --zone=classroom --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'
// 限制每分钟只有两个连接到ftp服务
firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'
// 抛弃esp(IPsec 体系中的一种主要协议)协议的所有数据包
firewall-cmd --add-rich-rule='rule protocol value=esp drop'
// 接受所有192.168.1.0/24子网端口范围7900-7905的TCP流量
firewall-cmd --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept'
(4)rich日志规则
-
log [prefix="<PREFIX TEXT>" [level=<LOGLEVEL>] [limit value="<RATE/DURATION>"]
- <LOGLEVEL>
可以是emerg, alert, crit, error, warning, notice, info, debug - <DURATION>
s:秒,m:分钟,h:小时,d:天
- <LOGLEVEL>
-
audit [limit value="<RATE/DURATION>"]
-
示例:
接受ssh新连接,记录日志到syslog的notice级别,每分钟最多三条信息
firewall-cmd --zone=work --add-rich-rule='rule service name="ssh" log prefix="ssh" level="notice" limit value="3/m" accept
(5)伪造和端口转发
-
NAT网络地址转换,firewalld支持伪造和端口转发两种NAT方式
-
伪造NAT
- 格式:firewall-cmd --zone=<ZONE> --add-masquerade
- 示例:将来自192.168.0.0/24网段的IP伪造为外网动态IP
firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'
-
端口转发:将发往本机的特定端口的流量转发到本机或不同机器的另一个端口。通常要配合地址伪造才能实现
- 格式:firewall-cmd --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=<IPADDR>]
说明:toport=和toaddr=至少要指定一个 - 示例:
转发传入的连接513/TCP,到访火墙的132/TCP到public zone 的192.168.0.254
firewall-cmd --zone=public --add-forward-port=port=513:proto=tcp:toport=132:toaddr= 192.168.0.254
- 格式:firewall-cmd --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=<IPADDR>]
-
rich规则语法:
- 格式:forward-port port=<PORTNUM> protocol=tcp|udp [to-port=<PORTNUM>] [to-addr=<ADDRESS>]
- 示例:
转发从192.168.0.0/26来的,发往80/TCP的流量到防火墙的端口8080/TCP
firewall-cmd --zone=work --add-rich-rule='rule family=ipv4 source address=192.168.0.0/26 forward-port port=80 protocol=tcp to-port=8080'