计算机防火墙用于保护内部网络,主机和网络安全,有硬件防火墙和软件防火墙两种,软件主要是用对数据包进行分析过滤来保证软件层面安全。
此外还有根据对数据封包形式确定的分类方法,
如代理服务器,类似网关的形式监控整个区域流量,
和封包过滤机制,直接分析最底层的封包表头数据来进行过滤。
针对如REHL和centos这些红帽类Linux操作系统,我们常用的防火墙主要有iptables和firewalld两种,
IP tables是用规则表和规则链控制数据包的流向并进行处理
firewalld则是采用区域和服务的概念来管理防火墙规则。
但上述二者都只是防火墙的管理工具,并非防火墙本身,防火墙的具体功能是由内核中的netfilter
网络过滤器实现。
IPtables
iptables过滤数据包的方式:
允许/拒绝让 Internet 的封包进入 Linux 主机的某些 port
允许/拒绝让某些来源 IP 的封包进入
允许/拒绝让带有某些特殊标志( flag )的封包进入
分析硬件地址(MAC)来提供服务
五链
具体的处理策略为规则,多个规则合成一条链,根据处理数据包的位置不同分为不同的链,
在路由判断前的规则prerouting
进入路由的规则input
出路由的规则output
转发规则forward
路由判断后进行的规则postrouting
四表
规则表用于容纳链,表允许则链禁止,表设置如下:
raw
表,确定是否对该数据包进行状态跟踪
mangle
表,为数据包设置标记(较少使用)
filter
确定是否放行该数据包(过滤)
nat
修改数据包中的源、目标IP地址或端口
规则表的先后顺序:raw->mangle->nat->filter
规则链的先后顺序:
入站顺序
PREROUTING→INPUT
出站顺序
OUTPUT→POSTROUTING
转发顺序
PREROUTING→FORWARD→POSTROUTING
一个包可能经过多个表的同一条链,在不同事件触发相同动作的链
基本选项和用法
iptables参数和作用如下表:
-P 设置默认策略:iptables -P INPUT (DROP\ ACCEPT)类似于黑白名单
-F 清空规则链
-A:添加规则,跟要添加规则的链
-I num 在规则链的头部加入新规则
-D num 删除某一条规则
-s 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如tcp,udp,icmp
--dports num 匹配目标端口号
--sports num 匹配来源端口号
-L 查看规则链
-n 不进行IP与主机名的反查,显示信息的速度会快很多
-v 列出更多的信息,包括封包数,相关网络接口等
--line-numbers 显示规则的序号
-t table指定表
raw
mangle
nat
filter 默认
-j:设置处理策略
accept:接受
drop:丢弃
reject:拒绝
-s:指定数据包的来源地址
-p:指定数据包协议类型
tcp
udp
icmp
通用手段为iptables 匹配 处理动作
匹配条件:
基本匹配条件:sip、dip
扩展匹配条件:sport、dport
扩展条件也是条件的一部分,只不过使用的时候需要用-m参数声明对应的模块
处理动作
accept:接受
drop:丢弃
reject:拒绝
snat:源地址转换,解决内网用户同一个公网地址上上网的问题
masquerade:是snat的一种特殊形式,使用动态的、临时会变的ip上
dnat:目标地址转换
redirect:在本机作端口映射
log:记录日志,/var/log/messages文件记录日志信息,然后将数据包传递给下一条规则
自定义规则链
可以通过自定义链实现规则分组重复调用的目的,使用-N 新链名
添加链,-E 旧链名 新链名
修改链名称,通过-A 链名 规则
的方式给自定义链添加规则,因为数据包指挥经过五个系统链,所以自定义的链需要关联到表中才能使用,iptables -t 表名-A 链名 -s 源地址 -j 新链名
将新的链关联到系统链上,示例如下:
iptables -t filter -N web_chain # 添加名为web_chain的自定义规则链
iptables -t filter -A web_chain -p tcp -m multiport --dports 80,443 -j ACCEPT # 创建的自定义链中添加规则,开放80端口上的服务
iptables -t filter -A INPUT -s 192.168.88.1 -j web_chain # 只允许指定IP访问,其他的拒绝
删除自定义规则链,首先要清空链上的规则iptables -t 表名 -F 链名
,再使用iptables -t 表明 -X 链名
删除自定义链。
其他用法——模块
使用模块可以极大拓展iptables的功能,对数据报的各种内容加以限制和筛选,常用示例如下:
tcp/udp
--dport:指定目的端口
--sport:指定源端口
iprange
--src-range
--dst-range
string
--algo:指定匹配算法,可以是bm/kmp
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--string:指定需要匹配的字符串
--from offset:开始偏移
--to offset:结束偏移
time:指定匹配报文的时间
--timestart
--timestop
--weekdays
--monthdays
--datestart
--datestop
connlimit:限制每个ip连接到server端的数量,不需要指定ip默认就是针对每个ip地址,可防止Dos(Denial of Service,拒绝服务)攻击
--connlimit-above:最大连接数
limit:对报文到达的速率继续限制,限制包数量
10/second
10/minute
10/hour
10/day
--limit-burst:空闲时可放行的包数量,默认为5,前多少个包不限制
规则持久化
命令行中执行的规则在重启后消失,要使规则永久生效需要写入到规则文件中,使用 iptables-save > /etc/sysconfig/iptables-config
保存到文件中,再使用iptables-restore < /etc/sysconfig/iptables-config
从文件中导入规则,也可以yum -y install iptables-services
下载服务,让其帮助我们自动管理iptables服务。
禁止访问特定网站
为防止iptables和firewalld冲突,在此处先使用systemctl stop firewalld
禁用firewalld,
为了展示限制外来流量访问,我们安装yum install -y epel-release
安装扩展源和yum install -y nginx
安装web服务器nginx,然后通过systemctl start nginx
启动web服务器,此时通过浏览器打开自己的IP地址,会有如下的特定界面
此时增加iptables -A INPUT -p tcp --dport 80 -j DROP
INPUT链上的策略,丢弃掉来自80端口tcp协议的请求报文,再访问网站就无法进入。
firewalld
想要代替iptables但失败的产品,采用按区域划分管理的思想,给不同区域设置不同的防火墙规则,常用区域如下:
public 默认区域,对应普通网络环境。允许选定的连接,拒绝其他连接
drop 所有传入的网络包都会被直接丢弃,不会发送任何响应
block 所有传入的网络包会被拒绝,并发送拒绝信息
external 用于路由/NAT流量的外部网络环境。与public类似,更适用于网关、路由器等处理外部网络流量的设备
dmz 隔离区域,只允许选定的连接,适用于部署公开服务的网络区域,如 Web 服务器,可以最大限度地降低内部网络的风险
work 适用于工作环境,开放更多服务,如远程桌面、文件共享等。比 public 区域更加信任
home 适用于家庭环境,开放更多服务,比如默认情况下会开放一些如:3074端口(Xbox)、媒体、游戏数据等待
trusted 信任区域,允许所有连接
规则匹配顺序为,根据数据包源地址确定区域,再根据端口细化区域,默认为public zone
。
Linux中使用firewall-cmd
作为管理工具,简单用法示例如下:
firewall-cmd --zone=public --add-service=http public区域允许http访问请求
firewall-cmd --zone=public --add-port=80/tcp publci区域允许80端口通过
firewall-cmd --zone=public --remove-service=http --permanent public区域永久关闭http
firewall-cmd --set-default-zone=public 默认区域设置为public
firewall-cmd --zone=public --list-all 查看public区域的详细配置
firewall-cmd --panic-on 打开紧急模式,默认策略为drop,除了 ssh 和 ICMP 回送(ping)请求,拒绝所有网络连接
firewall-cmd --reload 重启服务,一般用于修改规则后
端口转发firewall-cmd --permanent --add-forward-port=port=原端口:proto=tcp:toport=新端口
富规则,用于支持更复杂的规则匹配和操作,通常方法为firewall-cmd --permanent --add-rich-rule='富规则'
,
其中富规则定义为rule family="ipv4" source address="" port port="80" protocol="tcp" accept
,字段解释如下:
family: 指定地址族,可以是 ipv4 或 ipv6
source/destination: 指定源/目标地址
port: 指定端口号
protocol: 指定协议,如 tcp、udp 等
icmp-block-inversion: 反转 ICMP 阻止规则
forward-port: 端口转发规则
masquerade: 启用地址伪装
log: 日志记录规则,可指定前缀、日志级别、限速
accept/reject/drop: 动作,分别表示允许、拒绝、丢弃
服务访问控制 TCP Wrapper
用于限制特定网络服务的访问,配置文件在/etc/hosts.allow
和/etc/hosts.deny
中,可以通过指定主机名或网段来限制网络服务,通用方法为服务名称:限制目的
编写规则要注意一下两点:
编写拒绝策略规则时,填写的是服务名称,而非协议名称
建议先编写拒绝策略规则,再编写允许策略规则
此时远程连接退出再连就连不上了。
该服务已经落后了,并且生产中不常用,只做简单了解。
安全子系统SELinux
建立在内核上,基于角色和类型的识别访问控制,最大限度减小系统中服务进程可访问的资源,遵循最小权限原则,即指授予程序运行所需的最小权限。
子系统的三个状态分别为:
enforcing 1 完全执行策略
permissive 0 只记录
disable 关闭系统功能
当前状态可通过getenforce
查看,并使用setenforce 序号
更改,这种更改方式临时生效,且不能调到关闭模式,永久调整需要更改/etc/selinux/config
文件中的SELINUX
字段。
自主访问控制DAC
主体是用户,检查用户是否有资源的各种权限,但root用户不作任何管制,系统中的任何资源都能无限制访问,针对这种情况,提出了强访问控制。
强访问控制MAC
主体是进程,首先判断进程是否有访问资源的权限,再判断对资源的具体读写权限,使用这种方法可以避免root用户在系统内无法无天,即使在被恶意劫持后,造成的破坏也有限。
SELinux 会为 Apache 进程设置专门的安全上下文(context),限制它只能访问特定的资源。比如:
Apache 进程的安全上下文是 httpd_t
Apache 网页文件的安全上下文是 httpd_sys_content_t
Apache 日志文件的安全上下文是 httpd_log_t
semanage
SELinux策略管理工具,使用yum install -y policycoreutils-python
安装,通用格式为semanage 选项 文件
,具体选项如下:
port: 管理定义的网络端口类型
fcontext: 管理定义的文件上下文
-l: 列出所有记录
-a: 添加记录
-m: 修改记录
-d: 删除记录
-t: 添加的类型
-p: 指定添加的端口是tcp或udp协议的,port子命令下使用
-e: 目标路径参考原路径的上下文类型,fcontext子命令下使用
示例语句semanage fcontext -a -t httpd_sys_content_t /data/html
网站新的工作目录中新添加一条SELinux安全上下文,restorecon -Rv /data/html
递归检查并更新文件。
总结
本章学习了Linux防火墙管理配置方法,主要是通过工具,如iptables、firewalld和selinux限制对外对内的访问,主要在于理清数据包流向,找到过滤和限定的口,但selinux中有关安全上下文的概念并不清楚,目前只能理解到是对进程限制,无关用户,在系统内部使用不授权不可为的管理方式,子系统设置好了常用的上下文,需要时查询添加到位置即可实现保护。