防火墙的分类
包过滤型防火墙
工作在OSI参考模型的网络层 它根据数据包头源地址、目的地址、端口号和协议类型 等标志确定是否允许数据包通过
代理型防火墙
主要工作在OSI的应用层 代理服务在确认客户端连接请求有效后接管代理 代为向服 务器发出连接请求
代理型防火墙可以允许或拒绝特定的应用程序或服务,还可以实施数据流监控、过滤、 记录和报告功能
代理服务器通常有高速缓存功能
代理防火墙的最大缺点是速度较慢(客户机请求的地址没有存在于缓存中)
状态检测型防火墙
可以动态地根据实际应用需求 自动生成或删除包过滤规则
不但能根据数据包的源地址、目标地址、协议类型、源端口、目标端口等对数据包进行 控制 而且能记录通过防火墙的连接状态 直接对包里的数据进行处理
网关防火墙
DMZ网关防火墙
netfilter
位于Linux内核中的包过滤防火墙功能体系
称为Linux防火墙的”内核态”
iptables
位于/sbin/iptables 是用来管理防火墙的命令工具
为防火墙体系提供过滤规则/策略 决定如何过滤或处理到达防火墙主机的数据包
成为Linux防火墙的”用户态”
-------习惯上 上述两种称呼都可以代表Linux防火墙
规则链
规则的作用在于对数据包进行过滤或处理 根据处理时机的不同 各种规则被组织在不 同的”链”中
规则链是防火墙规则/策略的集合
默认的5种规则链
INPUT 处理入站数据包 (外网入 内网出 箭头指向防火墙 进入防火墙)
OUTPUT 处理出站数据包
FORWARD 处理转发数据包
POSTROUTING 在进行路由选择后处理数据包
PREROUTING 在进行路由选择前处理数据包
规则表
具有某一类相似用途的防火墙规则 按照不同处理时机区分到不同的规则链以后 被归 置到不同的”表”中
规则表是规则链的集合
默认的4个规则表
raw 表 确定是否对该数据包进行状态跟踪
mangle 表 为数据包设置标记
nat 表 修改数据包中的源、目的IP地址或端口(网关型防火墙 至少两个网卡)
filter表 确定是否放行该数据包(过滤)
iptables 的规则表、链结构
规则表间的优先顺序
raw、mangle、nat、filter
规则链间的匹配顺序
入站数据 PREROUTING、INPUT
出站数据 OUTPUT、POSTROUTING
转发数据 PREROUTING、FORWARD、POSTROUTING
规则链内的匹配顺序
按顺序依次进行检查 找到相匹配的规则即停止(LOG策略会有例外)
若在该链内找不到相匹配的规则 则按该链的默认策略处理
iptables命令的语法格式
ipatables [-t 表名] 管理选项 [链名] [条件匹配] [-j目标动作或跳转]
不指定表名时 默认为filter表
不指定链名时,默认表示该表内所有链
除非设置规则链的缺省策略(如果不是设置默认规则) 否则一定需要条件匹配
设置规则内容:
-A在链尾追加一条新的规则
-I 在指定位置(或链首)插入一条新的规则
-R 修改、替换指定位置或内容的规则
-P 设置指定链的默认策略
列表查看规则
-L 列表查看各规则信息
--line-numbers 查看规则信息时显示规则的行号
-n以数字形式显示IP地址、端口等信息
-v 显示数据包个数、字节数等详细信息
清除规则
-D 删除指定位置或内容规则
-F 清空规则链内的所有规则
自定义规则链
-N 创建一条新的规则链
-X 删除自定义的规则链
-h 查看iptables命令的使用帮助
删除指定位置的规则
清空所有规则
指定表格清空规则
创建一条新的规则链
设置匹配数据包的条件
通用条件匹配
可直接使用 不依赖于其他的条件或扩展模块
包括网络协议、IP地址、网络接口等匹配方式
隐含条件匹配
一般需要以特定的协议匹配作为前提
包括端口、TCP标记、ICMP类型等匹配方式
显式条件匹配
需要使用”-m扩展模块”的形式明确指定匹配方式
包括多端口、MAC地址、IP地址范围、数据包状态等匹配方式
通用条件匹配
可直接使用,不依赖于其他的条件或扩展模块
包括网络协议、IP地址、网络接口等匹配方式
协议匹配
使用"-p协议名"的形式
协议名可使用在"/etc/protocols"文件中定义的名称
常用的协议包括tcp、udp、icmp等
地址匹配
使用"-s源地址"、"-d目标地址的形式"
地址可以使单个IP地址、网络地址(带掩码长度)
接口匹配
使用"-i网络接口名"、"-o网络接口名"形式 分别对应接收、发送数据包的网络接口
拒绝进入防火墙的所有ICMP包
允许防火墙转发除ICMP以外的所有包
拒绝转发来自192.168.1.11主机的数据
丢弃从外网接口(eth1)进入防火墙主机的源地址为172.16.0.0/12的数据包
拒绝转发从eth1口出去的目标地址为61.35.4.3的数据包
隐含条件匹配
一般需要以特定的协议匹配作为前提
包括端口、TCP标记、ICMP类型等匹配方式
端口匹配
使用"-sport源端口"、"-dport"目的端口的形式
采用"端口1:端口2"的形式可以指定一个范围的端口
允许转发使用22端口的ssh数据包
允许本机开放从TCP端口20-80出去的端口
禁止其他主机ping
允许ping其他主机
或者 iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -I INPUT -i eth1 -p tcp - -tcp-flags SYN,RST,ACK SYN -j REJECT
iptables -I INPUT -i eth1 -p tcp - -syn -j REJECT
ICMP类型匹配
使用”--icmp-type ICMP类型”的形式
ICMP类型可以使用类型字符串或者对应的数值 例如Echo-Request、Echo-Reply
TCP标记匹配
使用”--tcp-flags 检查范围 被设置的标记”的形式
如”--tcp-flags SYN,RST,ACK SYN”表示检查SYN,RST,ACK这3个标记 只有SYN为1时满足条件
显式条件匹配
需要使用“-m 扩展模块”的形式明确指定匹配方式
包括多端口、MAC地址、IP地址范围、数据包状态等匹配方式
MAC地址匹配
使用“-m mac”结合“--mac-source MAC地址”的形式来表示数据包的源MAC地址
多端口匹配
使用“-m multiport”结合“--sports 源端口列表”或者“--dports 目标端口列表”的形式
多个端口之间使用逗号“,”分隔 连续的端口也可以使用冒号“:”分隔
IP地址范围匹配
使用“-m iprange”结合“--src-range 源IP范围”或者“--dst-range 目标IP范围”的形式
以“-”符号连接起始IP地址、结束IP地址
数据包状态匹配
使用“-m state”结合“--state 状态类型”的形式
同时表示多种状态时以逗号“,”分隔
常见的数据包状态包括:NEW、ESTABLISHED、RELATED、INVALID
禁止转发来自MAC地址为00:0C:29:27:55:3F的主机的数据包
允许防火墙本机对外开放端口20 21 25 110以及被动模式FTP端口1250-1280
禁止转发源地址为192.168.1.20-192.168.1.99的TCP数据包
禁止转发与正常TCP连接无关的非—syn请求数据包
拒绝访问防火墙的新数据包 但允许响应连接或与已有连接相关的数据包
“ESTABLISHED”表示已经响应请求或者已经建立连接的数据包,”RELATED”表示与已建立的连接有相关性的,比如FTP数据连接等
常见的数据包处理方式
ACCEPT 放行数据包
DROP 丢弃数据包
REJECT 拒绝数据包
LOG 记录日志信息 并传递给下一条规则处理(防止SSH爆破)
用户自定义链名 传递给自定义链内的规则进行处理
SNAT 修改数据包的源地址信息
DNAT 修改数据包的目标地址信息
导入、导出防火墙规则
导出规则 iptables-save
结合重定向输出”>”符号保存规则信息
导入规则 iptables-restore
结合重定向输入”<”符号恢复规则信息
编写防火墙脚本文件
预先加载扩展模块 设置环境参数
引入可控变量 增强脚本的可移植性、可重用性
通过shell语句灵活控制防火墙策略
防火墙的一般结构
设置网段、网卡、IP地址等变量
加载包过滤相关的内核模块 FTP相关: ip_nat_ftp、ip_conntrack_ftp
用于添加的具体防火墙规则内容
清空原有规则,建立新的规则
确认开启路由转发功能
方法1 /sbin/sysctl -w net.ipv4.ip_forward=1
方法2 echo 1 > /proc/sys/net/ipv4/ip_forward
方法3 修改/etc/sysctl.conf,设置net.ipv4.ip_forward=1
设置iptables脚本中的自定义变量
定义变量名对应内外网卡对应的ip和接口名称
INTERNET_IP=”212.13.24.23”
INTERNET_IF=”eth1”
LAN_IP=”192.168.200.1”
LAN_IF=”eth0”
加载模块
加载支持ftp连接跟踪的功能模块:/sbin/modprobe ip_conntrack ftp
加载支持对ftp连接进行NAT转换的功能模块:/sbin/modprobe ip_nat_ftp
iptables脚本开头初始化语句
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -t raw -F
/sbin/iptables -X
/sbin/iptables -t nat -X
/sbin/iptables -t mangle -X
/sbin/iptables -t raw -X
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
综合实验
1 配置入站链默认拒绝,其它链都是允许
允许入站接口是本地回环接口的任何数据
允许所有客户机访问Linux服务器的Samba共享
允许响应所有客户机的DNS请求
只允许一台客户机ping通服务器
2 配置入站和出站链默认是拒绝,其它链都是允许
禁止某一个客户机访问Linux服务器的共享(只能使用--tcp-flag实现)
但允许服务器访问那个客户机上的共享(只能使用--tcp-flag实现)
禁止服务器ping那台客户机,但允许那台客户机ping通服务器(只能使用--icmp-type)
3 配置服务器出站链默认是拒绝,其它链都是允许
客户机不能访问服务器上任何资源
要求服务器能访问任意客户机上的所有资源,例如能ping通客户机,也可以ssh和http 访问客户机(只能使用--state实现)