防火墙总结

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(使用前将#替换为@)

防火墙总结 的相关文章

  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • 如何通过不同的接口路由 TCP/IP 响应?

    我有两台机器 每台机器都有两个有效的网络接口 一个以太网接口eth0和 tun tap 接口gr0 目标是使用接口在机器 A 上启动 TCP 连接gr0但然后让机器 B 的响应 ACK 等 通过以太网接口返回 eth0 因此 机器 A 发出
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • 在 vimrc 中切换匹配

    我的 vimrc 文件中有以下几行 hi ExtraWhitespace cterm NONE ctermbg green ctermfg green guibg green guifg green match ExtraWhitespac
  • 如何使用 nohup 获取正在运行的程序列表

    我正在通过 SSH 连接访问运行 CentOS linux 发行版 的服务器 由于我无法始终保持登录状态 因此我使用 nohup command 来运行我的程序 我找不到如何获取我开始使用 nohup 的所有程序的列表 工作 只有在我注销之
  • 虚拟内存澄清——大连续内存的分配

    我有一个应用程序 我必须在 Windows 上分配 使用运算符 new 相当大的内存空间 数百 MB 该应用程序是 32 位 我们现在不使用 64 位 即使在 64 位系统上也是如此 我启用了 LARGEADDRESSAWARE 链接器选项
  • 重新链接匿名(未链接但打开)文件

    在 Unix 中 可以创建匿名文件的句柄 例如 使用 creat 创建并打开它 然后使用 unlink 删除目录链接 留下一个带有 inode 和存储的文件 但没有可能的方法重新打开它 此类文件通常用作临时文件 通常这就是 tmpfile
  • 使用 Vala 和 GLib 的正则表达式

    有没有一个函数 比如http php net manual en function preg match all php http php net manual en function preg match all php 使用 GLibh
  • 为什么我的代码在编译用于分析 (-pg) 时在多线程下运行比在单线程下运行慢?

    我正在写一个光线追踪器 最近 我在程序中添加了线程 以利用 i5 四核上的附加内核 奇怪的是 应用程序的调试版本现在运行速度变慢 但优化后的构建运行速度比添加线程之前更快 我将 g pg 标志传递给 gcc 以进行调试构建 并将 O3 标志
  • 删除 Python 中某些操作的 root 权限

    在我的 Python 脚本中 我执行了一些需要 root 权限的操作 我还创建并写入文件 我不想由 root 独占所有 而是由运行我的脚本的用户独占所有 通常 我使用以下命令运行脚本sudo 有办法做到上述吗 您可以使用以下方式在 uid
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015
  • 我们可以在 Bash 脚本中使用 PHP 吗?

    我有一个 bash 脚本abcd sh bin sh for i in seq 8 do ssh w i uptime ps elf grep httpd wc l free m mpstat done pid sleep 1 kill 9
  • Linux 阻塞与非阻塞串行读取

    I have 这段代码 https stackoverflow com questions 6947413 how to open read and write from serial port in c用于在Linux中从串行读取 但我不
  • 在Linux中将日期附加到文件名

    我想在文件名旁边添加日期 somefile txt 例如 somefile 25 11 2009 txt 或 somefile 25Nov2009 txt 或任何类似的内容 也许脚本或终端窗口中的某些命令可以执行 我正在使用Linux Ub
  • 为什么“script”命令会生成 ^[ 和 ^M 字符以及如何使用 vim 搜索和替换删除它们?

    在linux上 使用bash shell 当我使用script命令时 生成的文件称为typescript 当我用 vim 打开该文件时 每一行都包含 M字符 并且有几行 由于我的彩色命令提示符 包含一个字符 我想用任何东西替换这些字符 从而
  • bash "&" 不打印 "[1]+ Done "

    我在 bashrc 中调用一个脚本来打印打开终端时收到的新消息数 我希望该调用在访问网络时是非阻塞的 有时需要几秒钟 这意味着我无法使用终端直到完成 但是如果我输入 mailcheck 在我的 bashrc 中 它工作正常 但然后打印一个空
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径

随机推荐

  • 集合(持续更新)

    棒棒有言 追逐梦想的过程就像是一个人在走一条黑暗 幽深而又漫长的隧道 多少次跌倒又爬起 经历了多少个暗无天日的黑夜与白天 一路上沉淀着难以计数的汗水与泪水 不断地自我暗示 只要自己坚持 只要勇敢地一向往前走 就必须能找到出口 必须会看到光明
  • 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的音频和视频文件 现需要使用电脑播放下载的视频 那么第一步就是更改视频和音频文件的后缀名 百
  • 防火墙总结

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