Linux 常用命令及工具技术 (3) - iptables防火墙技术
Linux下的iptables防火墙技术
1.iptables防火墙介绍
iptables其实并不是真正的防火墙,我们可以理解成一个客户端代理,用户通过 IPTables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才 是真正的防火墙,这个框架的名称叫做 netfilter .
netfilter 位于内核空间,IPTables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。netfilter/iptables 组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,完成封包过滤,封包重定向和网络地址转换(NAT)等功能。
iptbales是一个基于命令行的防火墙工具,它使用规则链来允许/阻止网络流量。 当一条网络连接试图在你的系统中建立时,IPTables会查找对应的匹配规则。如果找不到,IPTbales将对其采取默许操作。 iptables 是 Linux 防火墙系统的重要组成部分,iptables 的主要功能是实现对网络数据包进出设备及转发的控制。当数据包需要进入设备、从设备中流出或者由该设备转发、路由时,都可以使用 iptables 进行控制。
iptables是集成在Linux内核中的包过滤防火墙系统。使用iptables可以添加、删除具体的过滤规则,iptables 默认维护着 4 个表和 5 个链,所有的防火墙策略规则都被分别写入这些表与链中
1.1 iptables基础
规则(rules)其实就是网络管理员预定义的条件,规则一般定义为”如果数据包头符合这样的条件,就按照规定处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址,目的地址,传输协议(如TCP,UDP,ICMP等)和服务类型(如HTTP,FTP,SMTP等)。当数据包和规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept),拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加,修改和删除这些规则。
1.2 iptables和netfilter的关系
iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构
1 | [root@localhost ~]# which iptables |
1.3 iptables中的表和链
1.3.1 iptables中的表
iptables中的规则表用于容纳多个规则链。规则表默认是允许通过状态,因此规则表中的规则链需要设置禁止的规则用来限制规则表,从而达到数据包过滤的效果。 反之,如果规则表禁止状态,则规则链需要设置被允许的规则。iptables根据防火墙规则的作用对表进行划分
规则表的执行顺序是raw>mangle>nat>filter
1.3.2 iptables中的规则链
iptables中定义了很多规则链,且每种规则链的作用各不同
规则链也存在执行顺序的概念:
- 入站顺序:PREROUTING>INPUT
- 出站顺序:OUTPUT>POSTROUTING
- 转发顺序:PREROUTING>FORWARD>POSTROUTING
1.3.3 iptables规则中数据包的控制类型
- ACCEPT:允许数据包通过
- DROP:直接将数据包丢弃,不给出任何提示
- REJECT:拒绝将数据包丢弃,必要时给出提示
- LOG:记录日志信息,然后转发给下一跳规则继续匹配
- DNAT:目的地址转换
- SNAT:源地址转换
- MASQUERADE:地址欺骗
- REDIRECT:重定向
1.3.4 iptables中需要注意的事项
- 若未指定匹配规则表,则默认使用filter表
- 若未指定规则链,则指表内所有的规则链
- 规则链内的规则一旦匹配就停止,若未匹配成功则按照练的默认策略执行
1.4 iptables传输数据包的过程
1.4.1 PREROUTING链
1 | # 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包源IP,目的IP判断是否需要转发 |
1.4.2 INPUT链
1 | # 如果数据包就是进入本机的,他就会进入INPUT链。数据包到达了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出 |
1.4.3 FORWARD链
1 | # 如果数据包是要转发出去的,且内核允许转发,数据包就会经过FORWARD链,然后到达POSTROUTING链输出 |
1 | # 开启内核转发 |
2.iptable基本语法
2.1 iptables 参数介绍
iptables 命令的基本语法格式如下:
1 | iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION |
各参数的含义为:
- -t:指定需要维护的防火墙规则表filter,nat,mangle或者raw,默认为filter
- COMMAND:子命令,定义对规则的管理
- chain:指明链表
- CRETIRIA:匹配参数
- ACTION:触发动作
iptables 命令常用的选项及各自的功能:iptables 命令常用匹配参数及各自的功能:1
2
3
4
5
6
7
8
9
10选 项 功 能
-A 添加防火墙规则
-D 删除防火墙规则
-I 插入防火墙规则
-F 清空防火墙规则
-L 列出添加防火墙规则
-R 替换防火墙规则
-Z 清空防火墙数据表统计信息
-P 设置链默认规则
-m 设置扩展模块iptables 命令触发动作及各自的功能:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16参 数 功 能
[!]-p 匹配协议,! 表示取反
[!]-s 匹配源地址
[!]-d 匹配目标地址
[!]-i 匹配入站网卡接口
[!]-o 匹配出站网卡接口
[!]--sport 匹配源端口
[!]--dport 匹配目标端口
[!]--src-range 匹配源地址范围
[!]--dst-range 匹配目标地址范围
[!]--limit 匹配数据表速率
[!]--mac-source 匹配源MAC地址
[!]--sports 匹配源端口
[!]--dports 匹配目标端口
[!]--stste 匹配状态(INVALID、ESTABLISHED、NEW、RELATED)
[!]--string 匹配应用层字串 内核会按照顺序依次检查 iptables 防火墙规则,如果发现有匹配的规则目录,则立刻执行相关动作,停止继续向下查找规则目录;如果所有的防火墙规则都未能匹配成功,则按照默认策略处理1
2
3
4
5
6
7
8
9触发动作 功 能
ACCEPT 允许数据包通过
DROP 丢弃数据包
REJECT 拒绝数据包通过
LOG 将数据包信息记录 syslog 曰志
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址欺骗
REDIRECT 重定向 - 使用 -A 选项添加防火墙规则会将该规则追加到整个链的最后
- 使用 -I 选项添加的防火墙规则则会默认插入到链中作为第一条规则
2.2 iptables规则的查看与清除
2.1.1 查看规则
1 | iptables -nvL |
各参数的含义为:
-L:表示查看当前表的所有规则,默认查看的是filter表,如果要查看nat表,可以加上-t nat参数
-n:表示不对IP地址进行反查,加上这个参数显示速度将会加快
-v:表示输出详细信息,包含通过该规则的数据包数量,总字节数以及相应的网络接口
1 | [root@localhost ~]# iptables -L |
2.1.2 添加规则
1 | # 设置Input链的默认策略设置为拒绝(DROP) |
2.1.3 修改规则
1 | # 允许所有人可以通过tcp的22号端口远程连接,修改为仅允许192.168.65.0/24网段的用户远程连接 |
2.1.4 删除规则
1 | # 删除规则有两种方法,但都必须使用 -D 参数 |
3.防火墙的备份与还原
默认的 iptables 防火墙规则会立刻生效,但如果不保存,当计算机重启后所有的规则都会丢失,所以对防火墙规则进行及时保存的操作是非常必要的。
iptables 软件包提供了两个非常有用的工具,我们可以使用这两个工具处理大量的防火墙规则。这两个工具分别是 iptables-save 和 iptables-restore,使用该工具可以实现防火墙规则的保存与还原。这两个工具的最大优势是处理庞大的规则集时速度非常快。
CentOS 7 系统中防火墙规则默认保存在 /etc/sysconfig/iptables 文件中,使用 iptables-save 将规则保存至该文件中可以实现保存防火墙规则的作用,计算机重启后会自动加载该文件中的规则。如果使用 iptables-save 将规则保存至其他位置,可以实现备份防火墙规则的作用。当防火墙规则需要做还原操作时,可以使用 iptables-restore 将备份文件直接导入当前防火墙规则
3.1 iptables-save命令
iptables-save 命令用来批量导出 Linux 防火墙规则,语法介绍如下:
1 | 保存在默认文件夹中(保存防火墙规则): |
直接执行 iptables-save 命令:显示出当前启用的所有规则
1 | [root@localhost ~]# iptables-save |
备份到其他文件中。例如文件:text,如下所示
1 | [root@localhost ~]# iptables-save > text |
列出nat表的规则内容,命令如下:
1 | [root@localhost ~]# iptables-save -t nat |
3.2 iptables-restore命令
iptables-restore 命令可以批量导入Linux防火墙规则,同时也需要结合重定向输入来指定备份文件的位置。命令如下:
1 | [root@localhost ~]# iptables-restore < 文件名称 |
注意,导入的文件必须是使用 iptables-save工具导出来的才可以。
先使用 iptables-restore 命令还原 text 文件,然后使用 iptables -t nat -nvL 命令查看清空的规则是否已经还原,如下所示:
1 | [root@localhost ~]# iptables-restore < test |
3.iptables的实际使用
3.1 防止黑客对SSH服务暴力破解
1 | #配置只有指定IP地址段的用户可以连接本地的SSH服务。其他用户拒绝访问,可以有效防止黑客对SSH服务暴力破解 |
3.2 不允许任何用户访问本机的3306端口
1 | [root@localhost ~]# iptables -I INPUT -p tcp --dport 3306 -j DROP |
3.3 防止ICMP类型的主机发现
1 | [root@localhost ~]# iptables -I INPUT -p icmp -j REJECT |
3.4 禁止主机用户访问百度
1 | [root@localhost ~]#iptables -I FORWARD -d www.baidu.com -j DROP |
3.5 使用iptables封禁IP
3.5.1 封禁单个IP
1 | [root@localhost ~]# iptables -I INPUT -s 192.168.65.7 -j DROP #-I 指插入表第一列 |
3.5.2 解封单个IP
1 | [root@localhost ~]# iptables -D INPUT -s 192.168.65.7 -j DROP |
3.5.3 封禁IP段
1 | `1.封IP段: 从123.0.0.1到123.255.255.254的命令 |
3.5.4解封IP段
1 | `1.解IP段: 从123.0.0.1到123.255.255.254的命令 |
4.iptables进行网络地址转换
iptables具有NAT功能,可以将内网地址和外网地址进行转换,从而完成内外网 通信。网络地址转换分为源地址转换和目的地址转换两种.
4.1 源地址转换(SNAT)
SNAT是指在数据包从网卡发出去的时候,把数据包中的源地址替换成可访问公 网的IP地址,当数据报文发送至对端主机后,对端主机认为源IP是公网的IP地址,从 而进行正常的响应.
4.1.1 SNAT的工作原理
实现一个IP地址做SNAT转换,一般可以让内网100到200台主机实现上网。
4.1.2 SNAT转换前提条件
局域网各主机己正确设置IP地址、子网掩码、默认网关地址
Linux网关开启IP路由转发
1
[root@localhost ~]#echo 1 > /proc/sys/net/ipv4/ip_forward
SNAT转换:固定的公网IP地址
1
2
3
4
5
6
7#配置SNAT策略,实现SNAT功能,将所有192.168.80.0/24这个网段的源IP改为
192.168.0.111
[root@localhost ~]#iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j SNAT --to-source 192.168.0.111
-- -s:可以指定单个IP地址
-- -o:指定出站网卡
-- --to-source:外网IP或地址池
[root@localhost ~]#iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j SNAT --to-source 192.168.0.111-192.168.0.122利用实验来验证SNAT源地址转换的作用
①实验准备:
- 局域网网段为:192.168.80.0/24
- 设置外网网段为:192.168.0.0/24
②实验步骤:
Ⅰ 配置局域网机器的iptables功能
1 | [root@localhost ~]# iptables -F -t nat #清空指定表的规则 |
Ⅱ.配置网关服务器
1 | [root@client2 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #开启路由转发功能 |
Ⅲ.配置Web服务器
1 | #下载安装httpd服务器 |
Ⅳ.对外网主机80端口抓包,此时内网主机访问外网web时,成功隐藏了内网主机的ip, 而用网关外网ip来做访问报文的源地址和响应报文的目标地址
1 | #外网主机下载Tcpdump工具进行网络流量抓包 |
Ⅴ.对网关内网接口抓包,是直接内网ip发包给外网ip
1 | [root@localhost ~]# tcpdump -i ens160 -nn tcp port 80 |
③实验心得
SANT的优点是可以使得多台局域网内的主机都通过一个公网IP进行正常的网页 访问,解决了IP资源匮乏的问题。同时,由于其源IP地址进行了转换,从而加强了网 络的安全性.
4.2 目的地址转换(DNAT)
DNAT是指数据包从网卡发送出去的时候修改数据报文中的目的IP为某公司内网 中私有IP使用的技术
4.2.1 DNAT的工作原理:
4.2.2 DNAT转换前提条件:
- 局域网的服务器能够访问Internet
- 网关的外网地址有正确的DNS解析记录
- Linux网关开启IP路由转发
利用实验来验证DNAT目的地址转化的作用
实验步骤:
①发布内网的Web服务
1 | [root@localhost ~]# iptables -t nat -A PREROUTING -i ens160 -d 192.168.0.0/24 -p tcp --dport 80 -j DNAT --to-destination 192.168.80.11 |
②发布时修改目标端口
1 | #发布局域网内部的OpenSSH服务器, 外网主机需使用250端口进行连接 |
5.实验——iptables配置实践
5.1 实验介绍:
1 | 第一部分:模拟Linux系统为局域网中某服务器,通过编写脚本localsafe.sh加固本机安全性 |
5.2 实验目的:
- 了解iptables的基本功能
- 掌握iptables的防火墙配置方法
5.3 实验环境
- Centos 7
- Redhat 8
5.4 实验步骤
步骤1:
设置Redhat 8作为Web服务器,现在需要配置该Web服务器能被客户端访问,并 配置它能被安全的SSH远程控制,且配置可以SNMP安全纳管。该脚本通过配置 INPUT表默认为拒绝,并配置只允许接收的数据报文从而形成白名单机制的安全原则.
1 | [root@localhost ~]#vim localsafe.sh |
步骤2:
为localsafe.sh脚本赋予执行权限,然后执行脚本
1 | [root@localhost ~]# vim localsafe.sh |
步骤3:
Linux服务器模拟配置网络防火墙,该组网中所有的服务器用到的IP均为公网IP, 且有三个服务器:Web服务器(220.128.15.10),FTP服务器(220.128.15.11),Email服务器(220.128.15.12).内网IP地址网段为192.168.1.0/24.配置Linux防火墙允 许内网访问三个服务器,不允许其他公网IP访问。禁止Internet用户ping防火墙的eth0 接口
为了满足上述要求,编写脚本networksafe.sh
1 | root@client2 ~]# vim networksafe.sh |
示例:使用 iptables 来拒绝来自特定源IP地址的流量
以下是拒绝源IP为 1.1.1.1 访问本机 192.168.2.2 的 80 端口的具体命令:
1 | iptables -A INPUT -s 1.1.1.1 -d 192.168.2.2 -p tcp --dport 80 -j REJECT |
这里是命令的解释:
-A INPUT:添加一条规则到 INPUT 链中。
-s 1.1.1.1:指定源IP地址。
-d 192.168.2.2:指定目标IP地址。
-p tcp:指定协议为TCP。
–dport 80:指定目标端口为80。
-j REJECT:拒绝匹配该规则的流量。
-j选项指在数据包与特定规则匹配时跳转到特定目标。有效目标包括标准选项ACCEPT、 DROP、QUEUE和 RETURN
执行该命令后,来自 1.1.1.1 的对 192.168.2.2 端口 80 的TCP请求将被拒绝。
如果你希望这个规则在系统重启后依然有效,你需要保存这些规则。例如,在 Debian 或 Ubuntu 系统上,可以使用以下命令保存规则:
1 | sudo iptables-save > /etc/iptables/rules.v4 |
在 CentOS 或 Red Hat 系统上,可以使用:
1 | sudo service iptables save |
这样就能确保规则在重启后依然生效。
参考文献或转载相关:
https://blog.csdn.net/unbuntu_luo/article/details/144254778
https://blog.csdn.net/m0_60981735/article/details/135631246