计算机防火墙用于保护内部网络,主机和网络安全,有硬件防火墙和软件防火墙两种,软件主要是用对数据包进行分析过滤来保证软件层面安全。
此外还有根据对数据封包形式确定的分类方法,
如代理服务器,类似网关的形式监控整个区域流量,
和封包过滤机制,直接分析最底层的封包表头数据来进行过滤。
针对如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协议的请求报文,再访问网站就无法进入。