1、防火墙基础
linux防火墙主要工作在网络层,针对TCP/IP数据包实施过滤和限制(包过滤防火墙或网络层防火墙),linux防火墙
是基于内核编码实现,具有非常稳定的性能和高效率
(1)netfilter:包过滤防火墙:包过滤防火墙是用一个软件查看所流经的数据包的包头(header),由此决定整个包的命运。
它可能会决定丢弃(DROP)这个包,可能会接受(ACCEPT)这个包(让这个包通过),也可能执行其它更复杂的动作。
工作于网络层,能对IP数据报进行首部检查。例如:IP源地址,目的地址,源端口和目的端口等。
内核态防火墙体系
(2) iptables:指的是用于管理linux防火墙的命令程序
用户态防火墙体系
(3)iptables的表链结构
表
1)filter表:用来对数据包进行过滤,根据规则确定如何处理一个数据包
filter表对应的内核模块是iptable_filter,表内包含3个链
INPUT FORWARD OUTPUT
2) net表:nat(Network Address Translation)网络地址转换
主要用来修改IP地址、端口号等信息
net表对应的内核模块是iptable_nat
PREROUTING POSTROUTING OUTPUT
3) mangle表:mangle表用来修改数据包的TOS服务类型、TTL生存周期、或者为数据包设置Mark标记
以实现流量×××、策略路由等高级应用
mangle表对应的内核模块为iptable_mangle,表内含5个链
PREROUTING POSTROUTING INPUT OUTPUT FORWARD
4) raw表:主要用来决定是否对数据包进行状态跟踪
raw表对应的内核模块为iptable_raw,表内包含两个链
OUTPUT PREROUTING
链
1) INPUT链: 当收到访问防火墙本机地址的数据包(入站)时,应用此链中规则
2)OUTPUT链: 当防火墙本机向外发送数据包(出站)时,应用此链中规则
3)FORWARD链: 当接收到需要通过防火墙中转发给其他地址的数据包(转发)时,应用此链中规则
4)PREROUTING链:在对数据包做路由选择之前,应用此链中规则
5)POSTROUTING链:在对数据包做路由器选择之后,应用此链中规则
4表5链
INPUT OUTPUT 主要用在“主机型防火墙”主要针对服务器本身进行保护
FORWARD PREROUTING POSTROUTING 多用在“网络型防火墙”中,可以做linux防火墙的网管服务器
在公司内网与互联网之间进行安全控制
规则之间的顺序
raw mangle nat filter
1)入站数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING链处理然后进行路由选择
(判断该数据包应该发往何处),如果数据包的目标地址是防火墙本机,那么
内核将其传递给INPUT链处理
2)转发数据流向:如果数据包的目标地址是其它外部地址,则内核将其传递给FORWARD链进行处理
(允许转发或拦截、丢弃),最后交给POSTROUTING(是否修改数据包地址等)进行处理
3)出站数据流向:首先OUTPUT链处理,然后进行路由选择,再交给POSTROUTING链
(是否修改数据包的地址等),进行处理
4)每条链内的规则(匹配即停止)如果第一条通过了后续的规则将失效
2、编写防火墙规则
iptables -t 表名 管理选项 链名 匹配条件 -j 控制类型
ACCEPT 允许数据包通过
DROP 丢弃数据包
REJECT 拒绝数据包,必要时会给数据端发送一个相应信息
LOG 在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则
因为LOG只是一种辅助动作,所以“匹配即停止”,对LOG是个特例,还会继续匹配
iptables 命令的常用的几个管理选项
-A 在指定链的末尾添加一条新的规则
-D 删除指定链中的规则,可指定序号或具体内容
-I 在指定链中插入一条新的规则,未指定序号默认作为第一条规则
-R 修改、替换
-L 列出规则 list
-F 清空规则
-P 设置指定链的默认规则
-n 使用数字形式显示输出结果
-v 查看规则列表显示详细信息
-h 查看命令帮助信息
--line-numbers 查看规则列表时,同时显示规则在链中的序号
1、其它主机无法ping通主机
iptables -t filter -I INPUT -p icmp -j REJECT
2、在INPUT链末尾添加一条允许tcp协议通过的规则
iptables -t filter -A INPUT -p tcp -j ACCEPT
3、在filter表INPUT链添加位于表中排序第一的规则和排序第二的规则
iptables -t filter -I INPUT -p udp -j ACCEPT
iptables -t filter -I INPUT 2 -p icmp -j ACCEPT
4、查看规则列表
iptables -L INPUT --line-numbers
iptables -n -L INPUT (数据多用这个减少解析时间)
5、删除清空列表
iptables -D INPUT 3 #删除filter表INPUT链的第3条信息
iptables -F INPUT #清空file表INPUT链中的所有信息
iptables -F #清空filter表
iptables -t nat -F #清空nat表
iptables -t mangle -F #清空mangle表
6、设置默认策略
filter表FORWARD默认策略为丢弃,OUTPUT链默认策略为允许
iptables -t filter -P FORWARD DROP
iptables -P OUTPUT ACCEPT
7、通用匹配
协议匹配
若要丢弃通过icmp协议访问防火墙本机的数据包,允许转发经过防火墙出icmp以外的的数据包
iptables -I INPUT -p icmp -j DROP
iptables -A FORWARD ! -P icmp -j ACCEPT
地址匹配
若要拒绝转发源地址为192.168.1.11的数据,允许转发源地址位于192.168.7.0/24网段的数据
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.7.0/24 -j ACCEPT
若检测到来自某个网段(10.20.30.0/24)的频繁扫描添加防火墙进行封锁
iptables -I INPUT -s 10.20.30.0/24 -j DROP
iptables -I FORWARD -s 10.20.30.0/24 -j DROP
网络接口匹配
若要丢弃外网接口(eth1)访问防火墙本机且源地址为私有地址的数据包
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
端口匹配
若要允许为网段192.168.4.0/24转发DNS查询数据包
iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
构建vsftpd服务器时,若要开放20.21端口,以及用于被动模式的端口范围24500~24600
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT
ICMP类型匹配 #icmp-type检查icmp协议
iptables -A INPUT -p icmp --icmp-type 8 -j DROP #拒绝其他请求但是自己可以ping其它机器
iptables -A INPUT -p icmp --icmp-type 0 -j DROP #我ping其它的主机返回来的信息我接收
iptables -A INPUT -p icmp --icmp-type 3 -j DROP #对方不存在返回值我接收
iptables -A INPUT -p icmp -j DROP #禁止所有机器ping
显示匹配
若要允许本机开放25.80.110.143端口
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
IP范围匹配
若要禁止转发源IP地址位于192.168.4.21与192.168.4.28之间的tcp数据包
iptables -A FORWARD -p tcp -m iprange -src-range 192.168.4.21-192.168.4.28 -j REJECT
MAC地址匹配 -m 模块
若要根据MAC地址封锁主机,禁止其访问本机的任何应用
iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -DROP
状态匹配
若要禁止转发与正常TCP连接无关的非--syn请求的数据包
iptables -A FORWARD -m state --state NEW -p tcp !--syn -j DROP #无正常连接的状态是NEW
#NEW状态模块的非syn选项
若只开放本机的web服务(80端口)
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT #插入行首一条将有关联的包放行
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #紧随其后添加一条允许80端口开放
iptables -P INPUT DROP #当前两条规则都没匹配上执行默认规则丢弃数据包