防火墙总结

2023-10-27

一、什么是防火墙

 

    防火墙分为软件防火墙和硬件防火墙,他们的优缺点:

硬件防火墙:拥有经过特别设计的硬件及芯片,性能高、成本高(当然硬件防火墙也是有软件的,只不过有部分功能由硬件实现,所以硬件防火墙其实是硬件+软件的方式);

软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能比硬件防火墙低、成本低。

二、Netfilter与iptables的关系

Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

  • 网络地址转换(Network Address Translate)

  • 数据包内容修改

  • 以及数据包过滤的防火墙功能

Netfilter平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING

Netfilter所设置的规则是存放在内核空间中的,而iptables是一个应用层的应用程序,它通过Netfilter放出的接口来对存放在内核空间中的 XXtables(Netfilter的配置表)进行修改

所以Linux中真正的防火墙是Netfilter,但由于都是通过应用层程序如iptables或firewalld进行操作,所以我们一般把iptables或firewalld叫做Linux的防火墙。

三、链的概念

ptables开启后,数据报文从进入服务器到出来会经过5道关卡,分别为Prerouting(路由前)、Input(输入)、Output(输出)、Forward(转发)、Postrouting(路由后):

INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则;

OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则;

FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则;

PREROUTING链:(互联网进入局域网)在对数据包作路由选择之前,应用此链中的规则,如DNAT;

POSTROUTING链:(局域网出互联网)在对数据包作路由选择之后,应用此链中的规则,如SNAT。

四、表的概念

虽然每一条链上有多条规则,但有些规则的作用(功能)很相似,多条具有相同功能的规则合在一起就组成了一个“表”,iptables提供了四种“表”: 

filter表:主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG),所谓的防火墙其实基本上是指这张表上的过滤规则,对应内核模块iptables_filter; 

nat表:network address translation,网络地址转换功能,主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次,如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。对应内核模块iptables_nat; 

mangle表:拆解报文,做出修改,并重新封装,主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。对应内核模块iptables_mangle; 

raw表:是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理,在匹配数据包时,raw表的规则要优先于其他表,对应内核模块iptables_raw。 我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中。

表链关系

 五、规则的概念

匹配条件

  • S_IP:source ip,源ip

  • S_PORT:source port,源端口

  • D_IP: destination ip,目标ip

  • D_PORT: destination port,目标端口

  • TCP/UDP:第四层(传输层)协议

处理的动作

  • ACCEPT:允许数据包通过;

  • DROP:直接丢弃数据包,不回应任何信息,客户端只有当该链接超时后才会有反应;

  • REJECT:拒绝数据包,会给客户端发送一个数据包被丢弃的响应的信息;

  • SNAT:S指Source,源NAT(源地址转换)。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决私网用户用同一个公网IP上网的问题;

  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的IP上;

  • DNAT:D指Destination,目的NAT,解决私网服务端,接收公网请求的问题。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址;

  • REDIRECT:在本机做端口映射;

  • LOG:/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。 除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。

DROP 与 REJECT区别:

REJECT:

PING 10.37.129.9 (10.37.129.9): 56 data bytes
92 bytes from centos-linux-6.5.host-only (10.37.129.9): Destination Port Unreachable
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 5400 29a3   0 0000  40  01 3ab1 10.37.129.2  10.37.129.9

Request timeout for icmp_seq 0
92 bytes from centos-linux-6.5.host-only (10.37.129.9): Destination Port Unreachable
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 5400 999d   0 0000  40  01 cab6 10.37.129.2  10.37.129.9




DROP:

PING 10.37.129.9 (10.37.129.9): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
Request timeout for icmp_seq 4

六、iptables命令操作

查询规则

一般使用 iptables  -nvL  即可

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         



  • pkts: packets,包的数量

  • bytes: 流过的数据包的字节数

  • in: 入站网卡

  • out: 出站网卡

  •  target: 英文意思是“目标”,但该列的值通常是动作,比如ACCEPT(接受)、REJECT(拒绝)等等,但它确实可以是“目标”,比如我们创建 一条链iptables -N July_filter,然后在INPUT链上添加一条规则,让它跳转到刚刚的新链-A INPUT -p tcp -j July_filter,再用iptables -L查看,可以看到target此时已经是真正的“target(July_filter)”而不再是动作了

添加规则

iptables -t filter -I INPUT -s 192.168.239.128 -j DROP

我们可以向某条链中的某个表的最前面添加记录(我们叫“插入”,会用到-I选项,I表示Insert),也可以向某条链中的某个表的最后面添加记录(我们叫“追加”,会用到-A选项,A表示Append),熟悉vi/vim的童鞋会对这个“I”和“A”感觉到熟悉,因为在vi/vim的命令模式下,按I是在光标所行的行首插入,按A是在光标所在行的行尾插入,跟这个在表头跟表尾插入非常像。

  • -t: 是指定插入到哪个表中,不写的话默认为“filter”表;

  • -I: 指定插入到哪条链中,并且会在该链指定表(在这里是filter表)中的最前面插入(I:Input),如果用-A则是在最后插入(A:Append)。

  • -s: 匹配源ip,s: source,源。

  • -j: jump,跳转的意思,后面可指定跳转的target(目标),比如自定义的链,当然更多的是跳转到“action(动作)”中,比如ACCEPT、DROP、REJECT等等。

  • 整个意思,就是向iptables中的“INPUT”链(-I INPUT)的“filter”表(-t filter)的最前面(-I)添加一条记录,这次记录会匹配源地址为“10.39.129.2”的请求(-s 10.39.129.2),并把该请求丢弃掉(-j DROP)。

删除iptables中的记录

1、根据编号删除:

iptables -t filter -D INPUT 1   

2、根据条件删除:

iptables -t filter -D INPUT -s 192.168.239.128 -j DROP

3、清空:

-F: flush的缩写,flush是“冲洗、冲掉”的意思,在这里是清空的意思,iptables -t filter -F INPUT代表清空“INPUT”链中“filter”表中的所有规则,如果不指定链不指定表,即直接用iptables -F,则清空所有链中所有表的规则。

修改规则

iptables -t filter -R INPUT 1 -s 10.37.129.3 -j ACCEPT

其中的-R就是replace,即替换的意思,整句命令意思是从INPUT链中的filter表中替换编号为1的规则,编号1后面的-s 10.37.129.3 -j ACCEPT就是要替换成的新规则。

iptables扩展模块

tcp扩展模块

-p tcp -m tcp --sport用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围(-p protocol,-m:match,指匹配的模块,很多人可能以为是module的缩写,其实是match的缩写,--sport: source port);-p tcp -m tcp --dport用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围(--dport 80:88

iptables -t filter -I INPUT -s 192.168.239.128 -p tcp -m tcp --dport 80 -j REJECT 

multiport扩展模块

-p tcp -m multiport --sports用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用”逗号”隔开; -p udp -m multiport --dports用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用”逗号”隔开:

iptables -t filter -I OUTPUT -s 192.168.9.1 -p udp -m multiport --dport 81 -j REJECT 

time扩展模块

我们可以通过time扩展模块,根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件。

我想要自我约束,每天早上9点到下午7点不能看网页:

iptables -t filter -I INPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT

connlimit模块

使用connlimit扩展模块,可以限制每个IP地址同时链接到server端的链接数量,注意:我们不用指定IP,其默认就是针对”每个客户端IP”,即对单IP的并发连接数限制。

如对81端口的客户端不可以超过两个

iptables -t filter -I INPUT -p tcp --dport 81 -m connlimi
t --connlimit-above 2 -j REJECT

limit扩展模块

limit模块是限速用的,用于限制“单位时间内流入的数据包的数量”。

每6位秒放行一下ping包(因为1分钟是60秒,所以1分钟10个包,就相当于每6秒1个包):

iptables -t filter -I INPUT -p icmp -m limit --limit 10/minite -j ACCEPT

iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3  -j ACCEPT 

--limit后面的单位除了minite,还可以是second、hour、day

--limit-burst: burst是爆发、迸发的意思,在这里是指最多允许一次性有几个包通过,要理解burst,先看以下的“令牌桶算法”。

令牌桶算法:

有一个木桶,木桶里面放了5块令牌,而且这个木桶最多也只能放下5块令牌,所有报文如果想要出关入关,都必须要持有木桶中的令牌才行,这个木桶有一个神奇的功能,就是每隔6秒钟会生成一块新的令牌,如果此时,木桶中的令牌不足5块,那么新生成的令牌就存放在木桶中,如果木桶中已经存在5块令牌,新生成的令牌就无处安放了,只能溢出木桶(令牌被丢弃),如果此时有5个报文想要入关,那么这5个报文就去木桶里找令牌,正好一人一个,于是他们5个手持令牌,快乐的入关了,此时木桶空了,再有报文想要入关,已经没有对应的令牌可以使用了,但是,过了6秒钟,新的令牌生成了,此刻,正好来了一个报文想要入关,于是,这个报文拿起这个令牌,就入关了,在这个报文之后,如果很长一段时间内没有新的报文想要入关,木桶中的令牌又会慢慢的积攒了起来,直到达到5个令牌,并且一直保持着5个令牌,直到有人需要使用这些令牌,这就是令牌桶算法的大致逻辑。

看完了“令牌桶算法”,其实--limit就相当于指定“多长时间生成一个新令牌”,而--limit-burst则用于指定木桶中最多存放多少块令牌。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防火墙总结 的相关文章

  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • 在生产服务器上使用 Subversion 使文件生效的最佳方法是什么?

    目前我已经设置了 subversion 这样当我在 Eclipse PDT 中进行更改时 我可以提交更改 它们将保存在 home administrator 中项目文件 该文件具有 subversion 推荐的 branches tags
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 为什么同一个curl命令在windows和linux下输出不同的东西?

    为什么同样的curl o file https www link com 命令输出不同的东西 例如 如果我运行命令curl o source txt https www youtube com playlist list PLIx6Fwnp
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

  • 集合(持续更新)

    棒棒有言 追逐梦想的过程就像是一个人在走一条黑暗 幽深而又漫长的隧道 多少次跌倒又爬起 经历了多少个暗无天日的黑夜与白天 一路上沉淀着难以计数的汗水与泪水 不断地自我暗示 只要自己坚持 只要勇敢地一向往前走 就必须能找到出口 必须会看到光明
  • react中收集表单数据的两种写法

    非受控组件写法 div div
  • 【前端demo】CSS border-radius可视化 原生实现

    文章目录 效果 原理 代码 前端demo系列目录 https blog csdn net karshey article details 132585901 效果 效果预览 https codepen io karshey pen zYyB
  • python:字典

    字典是是无序的键值对 key value 集合 同一个字典内的键必须是互不相同的 一对大括号 创建一个空字典 1 使用 del 关键字删除任意指定的键值对 2 使用 in 关键字查询指定的键是否存在于字典中 字典中的键必须是不可变类型 3
  • hmailserver邮件收不了邮件

    按下面步骤查看 首先就要把dns域名的mx记录配置好才能从别的邮件服务器接到邮件 域名 domain com的记录 http www hmailserver com documentation latest page ts receive
  • 【SpringBoot】整合Spring JDBC操作数据

    一 jdbc简介 JDBC Java DataBase Connectivity java数据库连接 是一种用于执行SQL语句的Java API 可以为多种关系数据库提供统一访问 它由一组用Java语言编写的类和接口组成 JDBC提供了一种
  • 《30天自制操作系统》入门方法总结

    30天自制操作系统 是一位日本大佬 川合秀实 老师所写的一本书 逻辑清晰 语言朴实 我跟着中文版的电子书学习了两天 感觉很好 在这里我就实操环节简单做一下总结 以帮助初学者更好的入门 1 操作系统和编辑器 我使用的是win10 64位 专业
  • 关联规则算法(Apriori算法、FP-Growth算法)小案例(python mlxtend)

    目录 一 Apriori 二 FP Growth 一 Apriori 算法理论部分参考 28条消息 Apriori算法与FP Tree算法 messi james的博客 CSDN博客 import pandas as pd 构造数据集 it
  • Unity打包安装包时出现CommandInvokationFailure: Gradle build failed.

    Unity打包安卓安装包时出现CommandInvokationFailure Gradle build failed 我首先是上网百度了一下 看到有许多方法 其中有人这样说 教训是 出现报错 不要上来就上网寻找答案 大家配置不一样 适合别
  • EMD(经验模态分解)算法 二

    上次基本搞懂了怎么用各种滤波器 这次重点看看EMD的算法应用 怎么调参数以产生不同的分解波形 EMD经验模态分解 emd lt as data frame emd xt diff load Load boundary wave stopru
  • 三进制计算机_一分钟基础:计算机为什么采用二进制?

    这是博主新想到的一个点子 旨在用最短的篇幅介绍知识 积少成多 希望朋友们能够有所收获 另外 最近事情属实太多 鸽了一个多月 感谢各位朋友没取关 我真不是在提醒各位取关 等忙完这段 希望自己也能做一个日更博主2333 PS 我改名了 最高权限
  • 请你说说instanceof 与 typeof的区别

    为什么 null instanceof Object是false 而typeof null是Object 在 JavaScript 中 null instanceof Object 的结果是 false 这是因为 null 是一个特殊的原始
  • android安卓开发调试经验

    android安卓开发调试经验 在哪查看错误信息 Run Console LogCat 常见错误 网络问题 检查权限
  • 【千律】C++基础:通过函数实现数据交换--指针方案

    include
  • 链表求和

    I 问题描述 你有两个用链表代表的整数 其中每个节点包含一个数字 数字存储按照在原来整数中相反的顺序 使得第一个数字位于链表的开头 写出一个函数将两个整数相加 用链表形式返回和 给出两个链表 3 gt 1 gt 5 gt null
  • RTT-移植Nano

    RTT 移植Nano 一 准备工作 STM32F103模板工程 RTT nano源码 https www rt thread org document site rt thread version rt thread nano an0038
  • Spring源码深度解析:九、bean的获取③ - createBeanInstance

    一 前言 文章目录 Spring源码深度解析 文章目录 createBeanInstance 的流程图如下 让我们根据流程图一步一步的学习一下spring是如何创建bean的吧 这篇文章是接着 Spring源码深度解析 八 bean的获取
  • 基于TensorFlow的CNN卷积网络模型花卉分类(1)

    一 项目描述 使用TensorFlow进行卷积神经网络实现花卉分类的项目 加载十种花分类 建立模型后进行预测分类图片 环境 win10 TensorFlow gpu 1 12 0 pycharm 训练集 训练数据存放路径为 D LearnM
  • 用bat批量重命名不同文件夹下的同名文件

    起因 手机B站离线的视频目录是这个样子的 视频的每一个分P都会生成一个文件夹 包含视频基本资料和一个名为80的文件夹 这个文件夹里放着后缀名为m4s的音频和视频文件 现需要使用电脑播放下载的视频 那么第一步就是更改视频和音频文件的后缀名 百
  • 防火墙总结

    一 什么是防火墙 防火墙分为软件防火墙和硬件防火墙 他们的优缺点 硬件防火墙 拥有经过特别设计的硬件及芯片 性能高 成本高 当然硬件防火墙也是有软件的 只不过有部分功能由硬件实现 所以硬件防火墙其实是硬件 软件的方式 软件防火墙 应用软件处