《TCP/IP详解 卷一》第7章 防火墙和NAT

news2025/1/31 8:22:54

7.1 引言

NAT通常改变源IP和源端口,不改变目的IP和目的端口。

7.2 防火墙

常用防火墙:

        包过滤防火墙(packet-filter firewall)

        代理防火墙(proxy firewall)

代理防火墙作用:

        1. 通过代理服务来代替内网的终端与外网通信。

        2. 进行数据包分析,实现ACL访问控制。

7.2.1 包过滤防火墙

包过滤防火墙分为:

        无状态防火墙:单独处理每一个数据包。

        有状态防火墙:

                记录所有经过报文的连接状态。包括源IP、目标IP、端口号、连接状态(如TCP)、分片信息等。

                检测这些状态信息来判断是否允许通过。

7.2.2 代理防火墙

本质是应用层网关(ALG)。

作用:通过代理防火墙实现监控流量,访问控制,日志记录等。

常见代理防火墙:

        HTTP代理防火墙。

        SOCKS代理防火墙。

HTTP代理防火墙:

        外网客户端通过HTTP代理防火墙访问内网Web资源,不直接与Web服务器通信。

        Web代理还提供Web缓存功能,降低访问延迟。

SOCKS代理防火墙:

        SOCKS:Socket Secure

        优点:在客户端与服务器之间建立安全的、匿名的连接。

                比HTTP代理更灵活,SOCKS能代理几乎所有流量。

                支持认证,如用户名/密码认证。未经授权用户无法使用代理。

7.3 网络地址转换

即NAT。

如果应用层载荷内有IP地址或端口信息,此时NAT转换比较麻烦,如FTP,SIP协议。这需要ALG解决。

        FTP和SIP数据连接需要使用动态端口,ALG可解决端口映射问题。

鼓励开发NAT友好的应用协议。

NAPT:网络地址端口转换,即IP源地址+源端口一起转换。

TCP三次握手时,当收到首次SYN包,就生成NAT映射表。收到第三次FIN的ACK后删除NAT映射表。

7.3.1 传统NAT:基本NAT和NAPT

基本NAT:只重写IP地址,但没有减少IP地址需求。

NAPT:使用IP地址+传输层标识符一起转换。

        传输层标识:如TCP端口,UDP端口,ICMP查询标识符。

                ICMP查询标识符:用于匹配ICMP请求和响应。

NAT与TCP:

        路由器收到内网发送的SYN报文时,对SYN报文进行NAT转换,并建立NAT映射表。

        路由器收到FIN报文时删除NAT映射表。

NAT和UDP:

        收到第一个UDP报文时,对报文进行NAT转换,并建立NAT映射表。

        当数据包从内网传输到外网经过NAT就刷新NAT映射表。超时未刷新就清除NAT映射条目。

        难点:除了第一个分片,其他分片没有端口信息,所以需要NAT特殊处理甚至虚拟重组分片。

                所以,IP分片和IP不分片在穿越NAT时吞吐速率有较大差距。显然不分片速率更高。

        

而TCP分段后每个TCP段都包含TCP头部,其中包含源目端口信息,因此NAT通常不需要重组TCP分段。CPU负荷小。

NAT和SCTP:

NAT和ICMP:

        ICMP有两类报文:信息类,出错类。

                出错类:包含引起错误的IP数据包副本,当ICMP出错报文通过NAT时,可根据实际需要是否改写出错报文中IP地址。

                信息类:大多数报文类型是查询/响应或C/S模型,使用IP地址+ICMP查询ID共同建立映射。

                

        总结:ICMP报文在NAT转换时,会结合ICMP报文中源目IP地址,ICMP序列号,ICMP查询ID等信息来建立NAT映射表,以区分内网不同主机。

NAT和隧道数据包:

        如果隧道数据需要进行NAT,NAT不仅修改IP包头,还需修改隧道内部包头和载荷。

        如果有更多层的隧道封装,NAT工作更复杂。

NAT和组播:

        NAT也可支持组播,少见,用IGMP代理来增强NAT,到外部数据目的IP地址和端口不会被修改。

NAT和IPv6:

        坚决抵制在IPv6中使用NAT。

7.3.2 地址和端口转换行为

NAT地址池:有几个可用的外部IP地址可供NAT转换。

7.3.3 过滤行为

若没有建立NAT映射,就无法转发从外网到内网的流量。

只有内部主机主动向外网发送了报文,创建了映射,才允许外网传入的流量。

这起到一定过滤效果。

7.3.4 位于NAT之后的服务器

从外网经NAT访问内网服务器时,需要主动在NAT路由器上做端口映射/端口转发。

7.3.5 NAT夹发和NAT环回

目前网络需求多样化,我们应当结合实际网络需求,定制NAT配置。

而NAT环回和NAT夹发只是两种典型NAT配置,一般通常用iptables实现。

NAT环回举例:

        1. 当内网主机A访问NAT设备公网IP地址时,NAT设备将请求转发给主机B。这样主机A可访问主机B的服务。

        2. 内网主机访问NAT设备公网IP地址时,NAT设备将流量转发回到NAT路由器本身,以便内部主机访问路由器web服务。

NAT夹发举例:

        内网主机访问NAT设备公网IP地址时,NAT设备将流量转发到外网,而返回给内部主机或NAT路由器。

7.3.6 NAT编辑器

当应用层协议包含端口,IP地址等低层信息时,NAT会变得复杂。如SIP协议,P2P(BitTorrent)。

NAT编辑器:

        不仅改写IP头的IP地址和TCP/UDP头中的端口号,还修改应用层载荷中包含的IP端口信息。

        如果NAT改变了包的应用载荷大小,还更改序列号。

7.3.7 服务提供者NAT和服务提供者IPv6转换

服务提供者NAT:将NAT从客户端移动到ISP端。

7.4 NAT穿越

NAT穿透解决的问题:

        因为源IP被NAT转换,导致内网主机IP对外网不可见,造成通信障碍。

        对等P2P网络因为NAT设备限制,无法直接通信。

        NAT设备导致实时通信应用连接不稳定或高延迟。

        NAT设备导致VPN连接失败。

NAT穿越技术常见方法:(后续会详细介绍)

        STUN:STUN客户端向STUN服务器请求NAT后公网IP和端口,并确定NAT类型。

        TURN:TURN服务器作为中间人,帮助两个客户端建立直接连接,并转发数据流量。

        ICE:一种综合NAT穿越技术,结合STUN、TURN和其他协议。通过候选地址、检测网络类型和可用的传输协议等方式,寻找最佳通信路径,实现NAT穿越。

        UPnP:向NAT路由器请求打开或关闭某端口,路由器对该端口报文不进行NAT转换,以允许设备直接通信。

7.4.1 针孔和打孔

针孔:

        含义:NAT设备的一种工作模式。即NAT在转发数据时临时打开的端口或临时建立的NAT地址映射。

        作用:仅允许特定数据流穿过NAT设备,而不是简单将所有数据流都转发到内网。

打孔工作原理:

        NAT设备根据特定规则识别需打孔数据流。规则通常基于源IP地址、目标IP、端口等。

        当内网主机向外网发送数据时,NAT设备动态为此数据流创建一个NAT映射,并NAT转换该数据流。

        NAT设备只允许与该映射相关数据通过,而拒绝未授权数据通过。

        一旦数据流完成或超时,动态映射将自动删除,防止潜在安全威胁。

打洞:

        含义:一种网络穿透技术。用于两个不同私网主机之间直接通信,而不需要中间服务器转发。

打洞流程举例:

        寻找公共节点:两个不同私网主机先尝试连接到一个公共服务器。

        交换信息:当两个主机通过公共服务器交换各自私有IP和端口等信息。

        建立映射:它们会向各自NAT设备发送数据,使NAT设备为这些数据包创建映射,并允许从外网中        的对等方直接发送数据包到对应私有IP和端口。

        保持连接:一旦NAT映射建立成功,两个主机就以通过各自NAT设备直接建立通信连接,而不需经过中间服务器转发。

7.4.2 单边的自地址确定

自地址确定:内网主机使用一系列方法得到其NAT公网IP。

单边的自地址确定:不需要外部服务器或其他设备帮助,即可确定内网主机NAT转换后的公网IP。

7.4.3 NAT的会话穿越工具

NAT穿越:在NAT环境中,使不同私网主机直接建立通信,而不需要中间服务器转发。

STUN:Session Traversal Utilities for NAT

        应用层C/S协议,用于确定内网经过NAT设备转换后的公网IP和端口,并通过心跳信息维持当前NAT绑定。

STUN功能包括:

        发现NAT类型:内网STUN客户端向STUN服务器发送请求,以确定客户端网络NAT类型。有助于应用程序根据不同NAT类型采取相应策略。

        获取公网IP地址和端口:客户端向STUN服务器发送请求,以获得公网IP和端口。

        维持NAT映射:客户端定期向STUN服务器发送请求,使设备保持NAT映射关系,避免因为NAT映射超时导致通信中断。

STUN使用场景:对等网络P2P和实时应用。

STUN客户端和STUN服务器之间含有多个NAT设备时,不适合使用STUN,而是使用TURN。

STUN应用层协议可通过UDP、TCP封装。

使用互联网已知STUN服务器足够。

Linux上stun相关实现:

        libstun

        pjnath:C语言编写的网络穿透库,包括了STUN、TURN和ICE等功能。

7.4.4 利用NAT中继的穿越

TURN:Traversal Using Relays around NAT

适用场景:如两个内网设备位于不同NAT设备后,无法直接建立对等P2P连接,可通过使用TURN中继服务器中转数据流。

TURN服务器:位于公网的服务器,充当中继。两个内网设备都将数据发到TURN服务器,TURN服务器转发给对方设备。

缺点:TURN服务器虽然解决了NAT穿越问题,但增加了网络延迟。

STUN和TURN对比:

        STUN:用于发现NAT后的公网IP和NAT类型,帮助建立对等P2P连接,不提供中继服务。

        TURN: 当直接对等连接无法建立时,通过TURN中继服务器中转数据流。

7.4.5 交互连接建立

ICE是STUN和TURN的结合,当STUN建立P2P连接失败时,使用TURN。

7.5 配置包过滤防火墙和NAT

7.5.1防火墙规则

每个规则包含:匹配条件,动作(action)

匹配条件:报文的字段(源目IP、源目端口、ICMP类型),方向(direction)

iptables支持:无状态包过滤,有状态包过滤,NAT,NAPT

        有状态包过滤:基于连接状态进行过滤,可检查包的状态(如NEW、ESTABLISHED、RELATED、INVALID)来确定是否允许或拒绝包通过。

        举例:允许建立新连接的数据包:

                iptables -A INPUT -m state --state NEW -j ACCEPT

iptables动作(target,action):可用于执行用户自定义链,或标准ACCEPT,DROP,QUEUE,RETURN

        QUEUE:将数据包提交给一个用户程序处理。

                iptables -A INPUT -j NFQUEUE --queue-num 23

        应用进程通过libnetfilter_queue库函数读取queue-num 23的报文即可。

RETURN:回到之前的链中继续。

7.5.2 NAT 规则

Windows中NAT:互联网连接共享(Internet Connection Sharing, ICS)

Linux中NAT实现:

        iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

                masquerade:伪装,NAT转换会自动使用eth1的IP作为源IP。

7.5.3 与NAT和防火墙的直接交互:UPnP、NAT-PMP和PCP

NAT-PMP:NAT端口映射协议。

UPnP:通用即插即用。

UPnP作用:

        动态创建端口映射,允许从Internet访问局域网内的服务器。

        设备自动发现、设备描述,操作指令。比如手机远程控制空调。

Linux实现:

        MiniUPnP开源软件包。

7.6 IPv4/IPv6共存和过渡中的NAT

7.7 与防火墙和NAT相关的攻击

当一个IP数据报被分片时,只有第一个分片包含端口,而其他分片没有。

因为许多老式防火墙没有能力处理IP分片。

解决方法:找到第一个分片(如果有的话),这需要一个有状态防火墙,但可能会资源耗尽攻击。

7.8 总结

代理防火墙:一种应用层网关ALG。每个应用都需要在防火墙上有自己的代理处理程序,以便修改其中载荷。

对于NAT后的内网服务器,需在NAT上主动配置端口转发,以允许外网流量的主动访问。

路由器收到报文后,一般先路由表查找,再NAT。

如果先NAT,后查找路由表,后果:

        路由表查找不准确。

        连接追踪可能无法正确识别或跟踪连接的状态。

        安全问题,未授权报文可能被错误转发到网络中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1474076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【递归】【回溯】Leetcode 112. 路径总和 113. 路径总和 II

【递归】【回溯】Leetcode 112. 路径总和 113. 路径总和 II 112. 路径总和解法:递归 有递归就有回溯 记得return正确的返回上去 113. 路径总和 II解法 递归 如果需要搜索整棵二叉树,那么递归函数就不要返回值 如果要搜索其中一条符合条件的路径&#xff…

常见集合框架底层原理

常见集合框架底层原理 常见的集合有哪些 Java集合类主要由两个接口Collection和Map派生出来的,Collection有三个子接口: List、 Set、Queue List代表了有序可重复集合,可直接根据元素的索引来访问Set代表了无序集合,只能根据元素本身来访问…

nginx---------------重写功能 防盗链 反向代理 (五)

一、重写功能 rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,重写功能(…

UE4 材质多张图片拼接成一张图片(此处用2×2拼接)

UE4 材质多张图片拼接成一张图片&#xff08;此处用22拼接&#xff09; //TexCoord,TextureA,TextureB,TextureC,TextureDfloat3 ReturnTexture TextureA; if(TexCoord.x < 0.5 && TexCoord.y < 0.5) {ReturnTexture TextureA; } else if(TexCoord.x > 0.5…

企业微信主体怎么转让给别人?

企业微信变更主体有什么作用&#xff1f;当我们的企业因为各种原因需要注销或已经注销&#xff0c;或者运营变更等情况&#xff0c;企业微信无法继续使用原主体继续使用时&#xff0c;可以申请企业主体变更&#xff0c;变更为新的主体。企业微信变更主体的条件有哪些&#xff1…

yolov8学习笔记(三)添加注意力机制+源码简单了解

目录 一、前言 二、注意力机制添加 三、源码简单了解 1、YOLO类中的——私有Model类 2、在哪来初始化的网络模型 3、注释版下载 4、笔记下载 一、前言 因为我没有学过pytorch&#xff0c;所以看源码也是一头雾水&#xff0c;不过大概看懂的是yolo是对pytorch的再次封装&a…

八分钟了解一致性算法 -- Raft算法

八分钟了解一致性算法 – Raft算法 前言 分布式一致性 在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性。 分布式一致性算法 比较常见的一致性算法包括Paxos算法,Raft算法,ZAB算法等 Paxos是Leslie Lamport提出的一种基于消息传递的分布式一致性算法。…

四、分类算法 - 决策树

目录 1、认识决策树 2、决策树分类原理详解 3、信息论基础 3.1 信息 3.2 信息的衡量 - 信息量 - 信息熵 3.3 决策树划分的依据 - 信息增益 3.4 案例 4、决策树API 5、案例&#xff1a;用决策树对鸢尾花进行分类 6、决策树可视化 7、总结 8、案例&#xff1a;泰坦尼…

STL常用容器(vector容器)---C++

STL常用容器目录 2.vector容器2.1 vector基本概念2.2 vector构造函数2.3 vector赋值操作2.4 vector容量和大小2.5 vector插入和删除2.6 vector数据存取2.7 vector互换容器2.7.1 vector互换容器收缩内存空间 2.8 vector预留空间 2.vector容器 2.1 vector基本概念 功能&#xf…

备战蓝桥杯---树形DP基础1

我们先来看几个比较简单的例子来引入&#xff1a; 我们令f[i]表示以i为根节点的子树大小&#xff0c;易得状态转移方程为&#xff1a; f[i]1f[son1]....f[soni]; 我们用DFS即可&#xff0c;下面是大致的模板&#xff1a; 让我们来看看几道题吧&#xff1a; 1.贪心树形DPDFS&…

Flask入门一

文章目录 一、Flask介绍二、Flask创建和运行1.安装2.快速使用3.Flask小知识4.flask的运行方式 三、Werkzeug介绍四、Jinja2介绍五、Click CLI 介绍六、Flask安装介绍watchdog使用python--dotenv使用&#xff08;操作环境变量&#xff09; 七、虚拟环境介绍Mac/linux创建虚拟环境…

Provider 与 Riverpod 的区别与选择

在 Flutter 应用开发中&#xff0c;选择合适的状态管理工具是至关重要的一环。在众多状态管理工具中&#xff0c;Provider 和 Riverpod 是备受关注的两个选择。本文将深入探讨 Provider 和 Riverpod 之间的区别&#xff0c;并帮助开发者更好地选择适合自己项目需求的状态管理工…

掌握微信小程序开发的核心要点:从基础到进阶

文章目录 掌握微信小程序开发的核心要点&#xff1a;从基础到进阶一、数据绑定和事件处理1.1 理解小程序的数据绑定机制&#xff0c;实现数据和视图的同步更新1.2 学习如何处理用户交互事件和触发相应的响应逻辑 二、网络请求和数据交互2.1 使用小程序的网络请求API与后端服务器…

【Python笔记-设计模式】迭代器模式

一、说明 迭代器模式是一种行为设计模式&#xff0c;让你能在不暴露集合底层表现形式&#xff08;列表、栈和树等&#xff09;的情况下遍历集合中所有的元素。 (一) 解决问题 遍历聚合对象中的元素&#xff0c;而不需要暴露该对象的内部表示 (二) 使用场景 需要对聚合对象…

ConvNeXt V2:用MAE训练CNN

论文名称&#xff1a;ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders 发表时间&#xff1a;CVPR2023 code链接&#xff1a;代码 作者及组织: Sanghyun Woo&#xff0c;Shoubhik Debnath来自KAIST和Meta AI。 前言 ConvNextV2是借助MAE的思想来训练…

信息安全计划

任何管理人员或人力资源专业人士都知道&#xff0c;除非彻底记录标准和实践&#xff0c;否则永远无法真正实施和执行标准和实践。正如您可能想象的那样&#xff0c;在保护您的网络、技术和数据系统免受网络威胁以及在发生这些事件时规划最及时、高效和有效的响应时&#xff0c;…

关于 REST API 六大指导原则,你了解多少?

背景 在前一篇文章中 关于 REST API&#xff0c;你了解多少&#xff1f; &#xff0c;我们聊到了 REST 六大指导原则&#xff0c;有些原则不太容易理解&#xff0c;这次我们详细说明一下。 1. 统一接口&#xff08;Uniform Interface&#xff09;&#xff1a;定义了一组通用的…

Error relaunching VirtualBox VM process:5

打靶场用virtualBox开靶机的时候会出现这种问题 并且报错代码是0x0 我出现这个问题与我的另一个软件有关 卸载之后靶机就可以正常启动了 但是又有问题了&#xff0c;我怎么打cs呢&#xff0c;求助大佬帮助

LeetCode--134

134. 加油站 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组 …

关于纯前端想要变成全栈编写接口的学习推荐

推荐学习uniappuniclouduniadmin 学习成本低,不到一个月就能开发出自己的接口,上传到服务空间,并且能够实现后端的功能,能够调用接口 当然这里使用的不是mysql数据库,而是unicloud推荐的存储方式 操作起来也很方便