防火墙
防火墙介绍
-
防火墙:在计算机领域,防火墙是用于保护内网信息安全的设备,其会依照用户定义的规则,允许或限制数据的传输
-
分类
-
逻辑:
- 主机防火墙:针对单个主机
- 网络防火墙:针对网络进行防护,处于网络边缘,防火墙背后是局域网
-
物理:
-
硬件防火墙:在硬件级别实现防火墙,另一部分基于软件实现,性能高,成本高。常处于网络边缘
- 如cisco(思科)ASA
-
软件防火墙:单独使用 具备配置数据包通过规则 的软件来实现数据包过滤,其性能相较于硬件防火墙低,成本低,在一定程度上会影响到主机系统性能。对于Linux系统已自带,直接使用即可。多见于单主机系统,个人计算机或网络安全组
-
-
web应用防火墙(WAF):Web应用防火墙是对web防护(网页保护)的安全防护设备(软件),主要用于截获所有HTTP数据或仅仅满足某些规则的会话,多见于云平台中。
-
-
防火墙性能指标:
- 吞吐量:在没有帧丢失的情况下,设备能接受并转发的最大数据速率,与防火墙的网卡速率,背板(主板)转发能力有关
- 并发连接数:越大越好
- 新建连接数:适宜
- 时延:越小越好
- 抖动:抖动会影响防火墙正常工作
iptables介绍
介绍
- iptables不是防火墙,是防火墙用户代理,用于把用户的安全设置添加到“安全框架”中
- “安全框架”是防火墙,名称为netfifilter
- netfifilter位于内核空间中,是Linux操作系统核心层内部的一个数据包处理模块
- iptables是用于在用户空间对内核空间的netfifilter进行操作的命令行工具
功能
- netfifilter/iptables可简称为iptables,为Linux平台下的包过滤防火墙。作用在OSI七层参考模型的第三层,可过滤源IP,目的IP,相关传输协议(TCP,UDP等)
- 具体功能
- 数据包过滤(防火墙)
- 数据包重定向(转发)
- 网络地址转换(NAT)
规则(rules)
-
规则是iptables的工作依据
-
iptables是按照运维人员所定义的条件(规则rules)来工作的
-
规则存储在内核空间的数据包过滤表中,这些规则分别指定了源地址、目的地址,传输协议(TCP、UDP、ICMP)和服务类型(HTTP、FTP)等
-
当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,比如放行(ACCEPT)、拒绝(REJECT)、丢弃(DROP)等
-
配置防火墙主要工作就是对iptables规则进行增删改
链
-
当客户端访问服务器端的web服务时,客户端发送访问请求报文至网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的请求报文会通过内核的TCP协议传输到用户空间的web服务,而客户端报文的目标地址为web服务器所监听的套接字(ip:port)上,当web服务器响应客户端请求时,web服务所回应的响应报文的目标地址为客户端地址,我们说过,netfifilter才是真正的防火墙,属于内核的一部分,所以,我们要想让netfifilter起到作用,我们就需要在内核中设置“关口”,所有进出的数据报文都要通过这些关口,经检查,符合放行条件的准允放行,符合阻拦条件的则被阻止,于是就出现了input和output关口,在iptables中我们把关口叫做链(链由很多规则组成)
-
如果客户端发到本机的报文中包含的服务器地址并不是本机,而是其他服务器,此时本机就应该能够进行转发(内核支持的IP_FORWARD功能),此时我们的主机类似于路由器,所以我们会看到在iptables中,所谓的关口并只有上面所提到的input及output这两个,应该还有“路由前”,“转发”,“路由后”,它们所对应的英文名称分别为“prerouting”, “forward”, “postrouting” 这就是我们说到的==5链==
表
-
把不同的“规则链”组合成能够完成某一特定功能集合分类,而这个集合分类我们就称为表
-
iptables中共有5张表
- fifilter: 过滤功能,确定是否放行该数据包,属于真正防火墙,内核模块:iptables_fifilter
- nat: 网络地址转换功能,修改数据包中的源、目标IP地址或端口;内核模块:iptable_nat
- mangle: 对数据包进行重新封装功能,为数据包设置标记;内核模块:iptable_mangle
- raw: 确定是否对数据包进行跟踪;内核模块:iptables_raw
- security:是否定义强制访问控制规则(后来添加,我们常说的四表,不包括这个)
-
我们在应用防火墙时是以表为操作入口的,只要在相应的表中的规则链上添加规则即可实现某一功能
-
表中的链
- CentOS7中,nat表新增INPUT规则链
-
表的优先级
raw>mangle>nat>fifilter(由高至低)
-
数据包流经iptables流程
匹配规则分类
基本匹配
-
无需加载扩展模块,可以匹配源地址,目标地址,源端口,目标端口等
-
常用选项
-p 指定规则协议,tcp|udp|icmp|all -s 指定数据包的源地址,ip|hostname -d 指定目的地址 -i 输入接口 -o 输出接口 ! 取反
扩展匹配
-
需要加载扩展模块,匹配规则才能生效。分为显示匹配和隐式匹配
-
显示匹配:必须使用**-m选项指明要调用的扩展模块的扩展机制以及需要手动**加载扩展模块
常用选项
- multiport:多端口
iptables -I INPUT -d 192.168.139.20 -p tcp -m multiport --dports 22,80 -j ACCEPT #在INPUT链中开放 目标地址 192.168.139.20的 tcp 22,tcp80 端口 iptables -I OUTPUT -s 192.168.139.20 -p tcp -m multiport --sports 22,80 -j ACCEPT #在OUTPUT链中开放 源地址 192.168.139.20的 tcp 22,tcp80 端口
- iprange:多ip地址
iptables -A INPUT -d 192.168.139.20 -p tcp --dport 23 -m iprange --src-range 192.168.139.10-192.168.139.20 -j ACCEPT iptables -A OUTPUT -s 192.168.139.20 -p tcp --sport 23 -m iprange --dst-range 192.168.139.10-192.168.139.20 -j ACCEPT
- time:指定访问时间
iptables -A INPUT -d 192.168.139.20 -p tcp --dport 888 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 17:00:00 -j ACCEPT
- string:字符串,对报文中的应用层数据做字符串模式匹配检测(通过算法实现)
--algo { bm|kmp} 字符匹配查找时使用算法 --string "STRING" 要查找的字符串 --hex-string "HEX-STRING" 要查找的字符,先编码成16进制格式
- connlimit:连接限制
--connlimit-upto n 连接数小于等于n时匹配 --connlimit-above n 连接数大于n时匹配
- state:追踪本机上的请求和响应之间的数据报文的状态
--state state NEW 新连接请求 ESTABLISHED 已建立的连接(连接态) INVALID 无法识别的连接(无效态) RELATED 相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接(衍生态) UNTRACKED 未追踪的连接
-
对于进入的状态为ESTABLISHED都应该放行
-
对于出去的状态为ESTABLISHED都应该放行
-
严格检查进入的状态为NEW的连接
-
所有状态为INVALIED都应该拒绝
-
隐式匹配:使用**-p**选项指明协议时,无需再同时使用-m选项指明扩展模块以及不需要手动加载扩展模块
常用选项
-
-p tcp --sport 匹配报文源端口(可以是多个连续范围的端口) --dport 匹配报文目标端口(可以是多个连续范围的端口) --tcp-flags mask|comp 匹配报文中的tcp协议的标志位 -p udp --sport 匹配报文源端口(可以是多个连续范围的端口) --dport 匹配报文目标端口(可以是多个连续范围的端口) --icmp-type 0/0:echo reply 允许其他主机ping 8/0:echo request 允许ping其他主机
-
动作(target)
-
ACCEPT:允许数据包通过
-
DROP:直接丢弃数据包,不回应信息
-
REJECT:拒绝数据包通过,回应信息给客户端
-
SNAT:源地址转换
-
修改数据包源地址,当内网数据包到达防火墙后,防火墙会使用外部地址替换掉数据包的源IP地址(目的IP地址不变),使网络内部主机能够与网络外部主机通信
-
iptables -t nat -A POSTROUTING -s 192.168.139.20 -o eth1 -j SNAT --to-source 202.12.10.100
-
-
DNAT:目标地址转换
-
修改数据包目的地址,当防火墙收到来自外网的数据包后,会将该数据包的目的IP地址进行替换(源IP地址不变),重新转发到内网的主机
-
iptables -t nat -A PREROUTING -d 202.12.10.100 -p tcp --dport 80 -j DNAT --to- destination 192.168.139.20
-
-
MASQUERADE:伪装。类似于SNAT,适用于动态的、临时会变的ip地址上,例如:家庭使用的宽带。用发送数据的网卡上的IP来替换源IP,对于IP地址不固定场合使用
-
REDIRECT:在本机做端口映射
-
LOG:在/var/log/message文件中记录日志信息,然后将数据包传递给下一条规则
制定规则策略
-
黑名单:没有被拒绝的流量都可以通过,这种策略下管理员必须针对每一种新出现的攻击,制定新的规则(不推荐)
-
白名单:没有被允许的流量都要拒绝,根据需要,将主机逐渐开放,目前一般都采用白名单策略(推荐)
-
制定iptables规则的思路
选表,此表决定了数据报文处理的方式
选链,此链决定了数据报文流经哪些位置
制定匹配条件
制定合适的动作,也就是相应的防火墙规则
语法结构
iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作]
表名:不指定表名时,默认filter表
管理选项:如A表示追加
链名:不指定链名时,默认表示该表内所有链,除非设置规则链的默认策略
条件匹配:如匹配源地址:-s 192.168.139.20
目标动作:如-j ACCEPT表允许数据包通过
# 案例:
iptables -t nat -A POSTROUTING -s 192.168.139.20 -o eth1 -j SNAT --to-source 202.12.10.100
- 规则管理
-A|--append chain 追加新规则于指定链的尾部
-I|--insert chain [rulenum] 插入新规则于指定链的指定位置,默认为首部
-D|--delete chain rulenum 根据规则编号删除规则
- 链管理
-N|--new chain 新建一个自定义的规则链
-X|--delete chain 删除用户自定义的引用计数为0的空链
-F|--flush [chain] 清空指定的规则链上的规则
-E|--rename-chain old-chain new-chain 重命名链
-P|--policy chain target 制定链表的默认策略(ACCEPT|DROP|REJECT),不建议更改!
- 规则显示
-L|--list [chain [rulenum]] 列出规则
-v|--verbose 详细信息(常与L连用:-vL)
-n|--numeric 数字格式显示主机地址和端口号(常与L连用:-nL)
--line-numbers 列出规则时,显示其在链上的相应的编号
-S|--list-rules [chain [rulenum]] 显示指定链的所有规则
- 查看端口
/etc/services文件记录了所有端口信息
[root@server2 ~]# cat /etc/services |grep ssh
ssh 22/tcp # The Secure Shell (SSH) Protocol
ssh 22/udp # The Secure Shell (SSH) Protocol
x11-ssh-offset 6010/tcp # SSH X11 forwarding offset
ssh 22/sctp # SSH
sshell 614/tcp # SSLshell
sshell 614/udp # SSLshell
netconf-ssh 830/tcp # NETCONF over SSH
netconf-ssh 830/udp # NETCONF over SSH
sdo-ssh 3897/tcp # Simple Distributed Objects over SSH
sdo-ssh 3897/udp # Simple Distributed Objects over SSH
snmpssh 5161/tcp # SNMP over SSH Transport Model
snmpssh-trap 5162/tcp # SNMP Notification over SSH Transport Model
tl1-ssh 6252/tcp # TL1 over SSH
tl1-ssh 6252/udp # TL1 over SSH
ssh-mgmt 17235/tcp # SSH Tectia Manager
ssh-mgmt 17235/udp # SSH Tectia Manager
- 常见端口及协议(空格的地方表示同上)
服务 | 协议 | 端口 |
---|---|---|
ftp | ftp | 20/tcp :数据端口 21/tcp :控制端口 |
sshd | ssh | 22/tcp |
telnet | telnet | 23 /tcp |
smtp | 25/tcp | |
smtps | 465/tcp | |
pop3 | 110/tcp | |
pop3s | 995/tcp | |
imap | 143/tcp | |
imaps | 993/tcp | |
dns | domain | 53/tcp 53/udp |
dhcp | bootps | 67/udp |
httpd | http | 80/tcp |
https | 443/tcp | |
nginx | nginx | 80/tcp |
ntp | ntp | 123/udp |
smaba | \ | 137,138,139/tcp |
rsyslog | rsyslog | 514/udp |
rsync | rsync | 873/tcp |
nfsd | nfs | 2049/tcp |
mysqld | mysql | 3306/tcp |
redis | redis | 6379/tcp |
tomcat | tomcat | 8080访问web的端口, 8005tomcat本身自己的端口, 8009与http等服务器建立连接的端口 |
php | php-fpm | 9000/tcp |
zabbix | zabbix-agent | 10050/tcp |
zabbix-server | 10051/tcp | |
memcached | memcached | 11211/tcp |
iptables应用
iptables-services
centos7系统中默认存在iptables命令,但此命令仅为简单查询及操作命令,不包含配置文件,安装iptables-services后,将直接生成配置文件,便于配置与保存
为防止firewalld影响,建议先关闭firewalld
在云平台,非必要时,不建议安装iptables-services。云平台自带安全组,安装iptables-services会降低性能
- 安装
[root@server2 ~]# yum install -y iptables-services.x86_64
[root@server2 ~]# rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service