本文主要介绍linux上的防火墙工具iptables,顺便介绍硬件防火墙
什么是防火墙
- 用来保护内部网络不受外部网络恶意攻击和入侵的网络安全技术,通常是内部网络和外部网络的边界,根据定义的规则,对管理的网络内的数据包进行分析和过滤,限制访问
分为硬件防火墙和软件防火墙
- 硬件防火墙是由厂商设计好的主机设备
- 软件防火墙就是用来保护系统网络的一套工具软件,如linux下的iptables和TCP Wrappers
硬件防火墙
具体功能
- 安全隔离,访问控制,VPN,内容过滤,病毒防护
三种类型
- 包过滤防火墙(路由)
- 应用代理:代理服务
- 状态检测:基于状态化检测
五种模式
- 透明模式(交换模式)
- 旁听模式
- 路由模式
- 多模式:多实例防火墙,主要用于IDC数据中心
- failover:状态化切换,备份
区域部署
- 双区域
- 三区域:inside、outside、DMZ
软件防火墙
iptables:是netfilter提供的一种网络资源访问控制的机制,一种编写防火墙的工具,在内核版本centos 2.4之后才出现的,以前类似的机制叫ipchains
netfilter:数据包过滤机制
- 是工作在内核 Tcp/ip 棧上的一个 包过滤机制:所谓的包过滤,就是将数据包头部数据提取出来进行分析
netfilter框架中定义了默认的五条内置的链(chain)和多张表(table)
- 五条内置链作为数据包过滤的点
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
- 常用的表
filter:过滤(INPUT、FORWARD、OUTPUT)
nat:用于nat地址转换(PREROUTING、POSTROUTING、OUTPUT)
mangle:修改报文元数据(可以作用在所有链上),修改TTL或做防火墙标记都是利用mangle做的
访问和转发图解
数据包过滤规则
- 根据预先定义的规则,按顺序从第一条到最后一条进行匹配
- 若数据包数据与规则匹配,则执行动作,不匹配则进行下一条规则对比
- 若都不匹配则使用默认的策(policy)动作
iptables的语法和使用
iptables可以基于 端口、ip、协议、接口、mac模块、状态、时间、包速率等做匹配和过滤,还能实现nat功能(水好深)
查看
- iptables [-L 列出table规则,默认filter] [-t 指定table] [-n 不进行ip和hostname反查速度快] [-v 列出更详细信息]
- iptables-save 列出完整的规则(我们写入的命令会列出)
删除
- iptables [-t table] [-F 清除所有规则] [-X 清除自定义的table] [-Z 将所有的chain的流量统计和计数都归0]
定义默认策略(policy)
- iptables [-t table] -P [chain] [策略 ACCEPT DROP REJECT LOG]
保存
- /etc/init.d/iptables save 保存
添加规则
- iptables [-t table] [-A 在当前后面添加] [-I 在最前面添加规则] [-p 协议TCP/UDP] [-i 进接口] [-o 出接口] [-s 来源ip] [-d 目的ip] [--sport 来源端口号协议名] [--dport] [-j 操作]
- ip格式:192.168.0.1 192.168.0.0/24
- 对口格式:单个 23 连续 1024:65535 直接名 ssh
- 操作:ACCEPT DROP REJECT LOG
mac和state状态模块
- [-m state mac] [--state 状态]
- -m mac aa:bb:cc:dd:ee:ff
- -m state --state [INVALID 无效包] [NEW 新建连接的数据包] [ESTABLISHED 已连接成功] [RELATED 表示是和主机发出去的数据包相关]
icmp类型
- [-p icmp] [--icmp-type 类型] :类型8是echo request,一般主机不是作为路由器(不需要进行ping测试)可以去掉回复
基于时间time模块
- -m time [--timestart 开始时间] [--timestop结束时间] [--days 日期] -j 动作 (简单介绍这几个参数)
- 例子:在每个星期一到星期五的12:00到14:00开放网络
iptables -t filter -A FORWARD -m time --timestart 12:00 --timestop 14:00 --day Mon,Tue,Wed,Thu,Fri -m state --state ESTABLISHED,RELATED -j ACCEPT
基于包速率匹配recent模块
- -m recent [--name 设定列表名] [--resource 源地址] [--rdest 目标地址] [--second 指定时间内] [--hitcount 命中次数] [--set 将地址添加进列表并更新包括时间戳等] [--rcheck 检测地址是否在列表内,从第一次匹配起算时间] [--update 和rcheck一样从最后一个匹配开始算时间] [--remove 从列表中删除地址,后接表名和地址]
NAT功能
SNAT:修改数据包的源ip(ip地址转换)在内网出口进行私网地址到公网地址的映射
过程(转发)/proc/sys/net/ipv4/ip_forward
- 数据包到达主机,进入NAT 的PREROUTING链
- 经过FILTER 的FORWARD链
- 通过NAT 的POSTROUTING链,在这个链上,将数据包的源ip修改为公网ip,并将对应关系做缓存记录
- Internet上的主机返回数据包时,在PREROUTING链上,将数据包的目标ip从公网ip根据之前的记录做修改
- 例子1:192.168.1.0/24做端口转换
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
- 例子2:web服务器有192.168.1.10到1.15六个地址需要转为公网ip,public ip设置在eth1上(直接指定修改)
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.1.10-192.168.1.15
DNAT:主要用于外部主动访问内部服务器(DMZ区域),基本是SNAT的逆过程
- 可以做端口的映射,即将实际端口隐藏,例如:利用8080来开启web服务,然后在转发的linux主机上的OUTPUT/PREROUTING链上转成80端口
- 例子:开放web服务器地址192.168.1.10,linux边缘设备public ip设置在eth1网卡,通过nat将外部访问进行转发到内部服务器
iptables -nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80 // 可以修改一下这个端口成其他不知名端口