0x00前言
本章节纯属抒发感情,单纯想了解 iptables 知识的可以忽略和跳过本章节的,纯属作者乱喷。因为之前学习路线混乱纯属瞎学,没有一个明确的知识体系的架构和行动指南,所以很长一段时间都没有留下什么文章,经过最近经历的影响想从今开始好好学习,重新做人,每学必写,留下自己学习的知识,一来可以为之后学习工作做铺垫,二来可以总结了解自己学习的知识,并且还有利于自己在忘了之后温故知新。何乐而不为?经过这几年的学习和积累,已经明确自己学习的方向,不过也为此丢了很多东西,最近时间段,上课平时都是感觉有用的听,自己感觉没用的就大致了解,为此深感自责。虽然所有知识学会都会有用,不过这样深感自己精力有限,这也算自己的选择叭,所以我还是决定跟随自己的意愿,不过作为学习网络安全的小辣鸡,深知防火墙的重要性,所以这次好好学习一下系统总结,为此写此文。其实还是想好好做一次实验,顺便留下点东西。哈哈哈哈哈哈!!!!
0x01防火墙介绍
一、防火墙的发展
- 包过滤防火墙
- 应用级网关防火墙
- 动态包过滤防火墙
- 自适应代理防火墙(结合应用和包过滤)
二、不同类型与 osi 之间的关系
- 应用级(应用层)
- 电路级(会话层)
- 包过滤(网络层)
三、什么是 Iptables 防火墙
Netfilter / Iptables(后期简称Iptables)是 Unix / Linux 自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,可以对流入和流出服务器的数据包进行控制,是 Linux2.4 及 2.6 内核中集成的服务,它主要工作在 OSI 七层模型的二、三、四层,如果对内核进行重新编译,Iptables 也可以支持七层控制。
四、Netfilter 和 Iptables 组件介绍
(1)netfilter
- netfilter 组件称为内核空间(kernelspace),集成于 Linux 内核。它的思想在于设计生成一个模块结构,使之能比较容易扩展,新特性加入内核而无须重启内核。它主要由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集合。根据规则所处理的数据包类型,从而使内核对来自某些源、前往某些目的地或者具有某些协议类型的信息包处理方法。
(2)iptables
- iptables 组件称为用户空间(userspace),它是一种工具,用户通过它来插入、删除和修改规则链中的规则。
(3)两者关系
- 实际上防火墙是 linux 的 Netfilter 组件,它工作在 Linux 内核中,在 Linux 内核中选取五个位置,放置了五个 hook function (INPUT、 OUTPUT、FORWARD、PREROUTING、POSTROUTING),用户可以通过一个命令工具(iptables)向其写入规则。
五、Iptables 中的重要成员
(1)成员间包含关系
- (Iptables 防火墙(表(链(规则)))):防火墙中有若干表,表中有若干链,链由规则组成。
(2)表
- filter 表:实现防火墙安全过滤功能,仅允许对数据包接受或丢弃而不修改。
- nat 表: 用于NAT,网络地址转换。
- mangle 表:对指定的包数据标记位进行修改,因某些特殊原因要改写数据包的一些传输特性。
- raw 表:Iptables 中实际有四张表,不过此表在此文章中不做讨论。
(3)链
- input 链:处理进入数据包
- output 链: 处理本地创建的数据包
- forward 链:处理流经本地 / 转发的数据包
- prerouting 链:用来修改目的地址,用来做DNAT
- postrouting 链:用来修改源地址,用来做SNAT
六、链表之间关系
(1)表对应的链
filter 表 | nat 表 | mangle 表 |
prerouting 链 | prerouting 链 | |
input 链 | input 链 | |
forward 链 | forward 链 | |
output 链 | output 链 | output 链 |
postrouting 链 | postrouting 链 |
(2)链对应的表
prerouting 链 | input 链 | forward 链 | output 链 | postrouting 链 |
filter 表 | filter 表 | filter 表 | ||
nat 表 | nat 表 | nat 表 | ||
mangle 表 | mangle 表 | mangle 表 | mangle 表 | mangle 表 |
七、匹配规则
(1)表间的优先顺序
- 优先级由高到低的顺序为:raw、mangle、nat、filter
(2)链间的优先顺序
- 入站数据:PREROUTING、INPUT
- 出站数据:OUTPUT、POSTROUTING
- 转发数据:PREROUTING、FORWARD、POSTROUTING
(3)规则的优先级顺序
- 防火墙是层层过滤的,按照配置规则的顺序从上到下,从前到后进行过滤
- 如果匹配规则,表明明确的阻止或通过,则数据包就不再向下重新匹配规则,使用匹配上的规则进行过滤
- 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则
- 防火墙的默认规则是所有规则执行完才执行
八、数据包流向介绍
- 数据包会依次经过每一个表的所有链
- 流入本机:PREROUTING --> INPUT–>用户空间进程
- 流出本机:用户空间进程 -->OUTPUT–> POSTROUTING
- 转发:PREROUTING --> FORWARD --> POSTROUTING
- 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去,如果数据包就是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链 ,然后到达POSTROUTING链输出。如果数据包是要转发出去的,且内核允许转发,数据包就会向右 移动,经过FORWARD链,然后到达POSTROUTING链输出。
0x02Iptables 防火墙命令简介
1.Iptables 基本命令
[命令格式]: iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-targetoptions]
[命令简介]
-P #设置默认策略
-L #查看规则链
-A #在规则链末尾加入新规则
-I num #在规则链指定位置加入新规则;默认为首部
-F #清空策略;参数暂时清空防火墙规则,需要注意的是暂时清空后下次登陆后依旧会恢复回来.
-D num #在规则链指定位置删除一个规则
-R num #修改指定位置的规则
-s #匹配来源地址 IP / MASK;加 ! 表示除这个IP外
-d #匹配目标地址
-i 网卡名称 #匹配从这块网卡流入的数据
-o 网卡名称 #匹配从这块网卡流出的数据
-p #匹配协议;如 TCP,UDP,ICMP
--dport num #匹配目标端口
--sport num #匹配来源端口
-t #指定规则表;默认为 filter
-Z #将数据包计数器和流量计数器置为零
-v # 显示信息,以详细信息显示
[链管理]
-N #自定义一条新的规则链
-X #删除自定义的空的规则链
-P #设置默认策略;对 filter 表中的链而言,其默认策略有: ACCEPT:接受 DROP:丢弃
-E #重命名自定义链;引用计数不为0的自定义链不能够被重命名, 也不能被删除
[查看规则]
-L #列出所有规则项目
-n #以数字形式显示地址,端口等信息
-v #详细信息显示
-x #显示计数器结果的精确值,而非单位转换后的易读值
--line-numbers #查看规则时,显示规则序号
[修改规则]
-P #设置默认策略
-A #在规则链末尾加入新规则
-I num #在规则链指定位置加入新规则;默认为首部
-D num #在规则链指定位置删除一个规则
-F #清空策略
-R num #替换指定链上的指定规则编号
[匹配条件]
-p 协议名 #匹配协议;如TCP,UDP,ICMP
-s 源地址 #匹配来源地址IP/MASK;加!表示除这个IP外
-d 目标地址 #匹配目标地址
-i 入站网卡 #匹配从这块网卡流入的数据
-o 出站网卡 #匹配从这块网卡流出的数据
--dport 目的端口 #匹配目标端口号
--sport 源端口号 #匹配源端口号
--tcp-flags 检查范围 #tcp标记匹配
--icmp-type ICMP类型 #icmp类型匹配
[动作] -j
ACCEPT #允许数据包通过本链而不拦截它
DROP #丢弃,组织数据包通过本链,丢弃它
SNAT #源地址转换,SNAT支持单地址转换,也支持 IP 到 IP 地址池
DNAT #目的地址转换,SNAT支持单地址转换,也支持 IP 到 IP 地址池
MASQUERADE #动态源地址转换
LOG
REJECT
[附加模块] -m
按包状态匹配 (state)
按来源 MAC 匹配(mac)
按包速率匹配 (limit)
多端口匹配 (multiport)
0x03配置
1.iptables 的 rules 添加法则
- 所有规则配置后,立即生效,不需要重启服务。
- 规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。
- 设置默认策略
- 将那些可由一条规则描述的多个规则合并为一个
- 同类规则(访问同一应用),匹配范围小的放上面
- 不同类规则(访问不同应用),匹配到报文频率较大的放上面
2.配置案例
3.常见问题
(1)问题一
- [问题]:我设置了iptables -A OUTPUT -d 202.xx.xx.xx -j DROP 为何内网用户还是可以访问那个地址?
- [回答]:filter 表的OUTPUT 链是本机访问外面的必经之路,内网 数据不经过该链
(2)问题二
- [问题]:我添加了iptables -A FORWARD -d 202.xx.xx.xx -j DROP 为何内网用户还是可以访问那个地址?
- [回答]:检查整个规则是否存在逻辑错误,看是否在DROP 前有 ACCEPT
(3)问题三
- [问题]:iptables -t nat -A POSTROUTING -i eth1 -o eth2 -j MASQUERADE 这条语句为何报错?
- [回答]:POSTROUTING 链不支持“流入接口” -i 参数 同理,PREROUTING 链不支持“流出接口” -o 参数
(4)问题四
- [问题]:我应该怎么查看某个模块具体该如何使用?
- [回答]:iptables -m 模块名 -h
(5)问题五
- [问题]:执行iptables -A FORWARD -m xxx -j yyy 提示iptables: No chain/target/match by that name
- [回答]:/lib/modules/
uname -r
/kernel/net/ipv4/netfilter 目 录中,缺少与xxx 模块有关的文件,或缺少与yyy 动作有关的文件 名字为ipt_xxx.o(2.4内核) 或ipt_yyy.ko(2.6内核)
(6)问题六
- [问题]:脚本写好了,内网上网没问题,FTP 访问不正常,无法列出目录,为什么?
- [回答]:缺少ip_nat_ftp 这个模块,modprobe ip_nat_ft