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

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.mzph.cn/news/704886.shtml

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

相关文章

React_使用es5和es6语法渲染和添加class

React入门 //react的核心库 <script src"https://cdn.jsdelivr.net/npm/react17/umd/react.development.js"></script> //react操作dom的核心库&#xff0c;类似于jquery <script src"https://cdn.jsdelivr.net/npm/react-dom17/umd/react-dom.…

kuka协作机器人LBR系列 issy15R930导入到ros2_rviz(带外观文件)

kuka协作机器人LBR系列 issy15R930导入到ros2_rviz(带外观文件&#xff09;外观文件未调整好&#xff0c;外观仍需进一步研究&#xff0c;外观文件dae与轮廓&#xff08;碰撞&#xff09;文件STL并未完全对应起来。在blender里面看了一下UR机器人的文件&#xff0c;是对应的&am…

【博士每天一篇文献-综述】A Modified Echo State Network Model Using Non-Random Topology

阅读时间&#xff1a;2023-11-23 1 介绍 年份&#xff1a;2023 作者&#xff1a; Arroyo, Diana Carolina Roca&#xff0c;数学与计算机科学研究所&#xff08;ICMC&#xff09;圣保罗大学 (USP) 期刊&#xff1a; 博士论文 引用量&#xff1a;0 这篇论文是一篇博士论文&am…

主从复制实现Redis集群

主从复制实现Redis集群实验 (一主二从): 实验环境: 使用Docker 搭建 Redis 版本 5.0.5 打开一个终端窗口&#xff0c;在其中运行如下命令创建一个名为redis-master的Redis容器。注意&#xff0c;它的端口是6379 (本地的端口:映射到容器的端口) docker run -itd--name redis-m…

能碳双控| AIRIOT智慧能碳管理解决方案

在当前全球气候变化和可持续发展的背景下&#xff0c;建设能碳管理平台成为组织迎接挑战、提升可持续性的重要一环&#xff0c;有助于组织实现可持续发展目标&#xff0c;提高社会责任形象&#xff0c;同时适应未来碳排放管理的挑战。能碳管理是一个涉及跟踪、报告和减少组织碳…

【51单片机】红外遥控红外遥控电机调速(江科大)

1.红外遥控简介 红外遥控是利用红外光进行通信的设备,由红外LED将调制后的信号发出,由专用的红外接收头进行解调输出 通信方式:单工,异步 红外LED波长:940nm 通信协议标准:NEC标准 2.硬件电路 红外发送部分 IN高电平时&#xff0c;LED不亮&#xff0c;IN低电平时&…

Linux Nginx SSL 证书配置正确,扔展示不安全

Nginx SSL 配置 首先我能够确定自己的Nginx SSL是配置正确的&#xff1a; 问题展示 通过浏览器访问自己域名&#xff0c;点击不安全后查看证书&#xff0c;展示的证书并不是自己所配置的证书&#xff0c;如下&#xff1a; 通过curl -vvv https://域名访问返回的证书是过期…

笔记本hp6930p启用UEFI安装Win10

老本hp6930p使用n多年&#xff0c;一直以为古董级的东西&#xff0c;近日折腾时&#xff0c;居然发现支持UEFI&#xff0c;于是尝试使用UEFI安装Win10&#xff0c;过程很简单&#xff0c;现做以记录。 1、BIOS中开启UEFI 2、GUID格式进行硬盘分区 3、WinPE安装Win10 一、BIOS中…

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

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

光谱数据处理:1.特征波长优选的不同方法与Python实现

首先&#xff0c;我们要理解为什么要对“光谱数据进行特征波长优选”以及这是在干嘛&#xff0c;光谱数据可以想象成一长串的彩色条纹&#xff0c;每种颜色对应一个波长&#xff0c;就像彩虹一样。这些颜色的条纹代表了从某种物质&#xff08;比如植物、矿石或是食品&#xff0…

31-k8s集群svc的代理模式-iptables修改为ipvs

一、概述 学到这里&#xff0c;我们都知道&#xff0c;k8s集群的外部网络分发&#xff0c;借助kube-proxy组件来完成&#xff1b; 问题&#xff1a;我们为什么要将代理模式修改为ipvs而不继续使用iptables呐&#xff1f; 因为&#xff1a; 1&#xff0c;iptables底层使用四表五…

读人工不智能:计算机如何误解世界笔记04_数据新闻学

1. 计算化和数据化的变革 1.1. 每一个领域都在进行计算化和数据化的变革 1.1.1. 出现了计算社会科学、计算生物学、计算化学或其他数字人文学科 1.1.2. 生活已走向计算化&#xff0c;人们却一点也没有变 1.2. 在如今的计算化和数据化世界中&#xff0c;调查性新闻的实践必须…

jdk21本地执行flink出现不兼容问题

环境说明&#xff1a;换电脑尝尝鲜&#xff0c;jdk&#xff0c;flink都是最新的&#xff0c;千辛万苦把之前的项目编译通过&#xff0c;跑一下之前的flink项目发现启动失败&#xff0c;啥都不说了上异常 Exception in thread "main" java.lang.IllegalAccessError: …

Scrapy实战

代码&#xff1a; Spider import scrapy from urllib.parse import urljoin from scrapy import Requestclass JiaSpider(scrapy.Spider):name "jia"allowed_domains ["desk.zol.com.cn"]start_urls ["https://desk.zol.com.cn/dongman/"]d…

jeesite用字典项配置二级下拉选

1、配置字典项 2、html代码&#xff1a;修改下拉选项框 <div class"col-xs-6"><div class"form-group"><label class"control-label col-sm-4" title""><span class"required">*</span> ${…

ZYNQ:串口-CAN协议转换

前言 目前已经实现zynq的PS-CAN和PL-CAN功能。串口-CAN协议转换是实现以太网-CAN功能的过渡&#xff0c;通过这个流程能够减少后期以太网工程出现问题的频率。阶段性功能目标如下&#xff1a; 实现数据在CAN调试助手和串口调试助手之间的来回转换&#xff0c;从而了解中断机制…

华为云软件开发生产线CodeArts前端DevOps实践

原文链接&#xff1a;CodeArts前端DevOps实践_软件开发生产线 CodeArts_理论实践_DevOps概览 本文主要以CodeArts产品自身为背景&#xff0c;简要介绍一些在前端性能优化方面的优秀实践方法和常见问题。 在开始本文的内容之前&#xff0c;先简单介绍一下华为云CodeArts。Code…

html中的meta 元信息

html中的meta 元信息 1. 配置字符编码 <meta charset"utf-8">2. 针对 IE 浏览器的兼容性配置。 <meta http-equiv"X-UA-Compatible" content"IEedge">3. 针对移动端的配置 <meta name"viewport" content"widt…

MySQL进阶篇2-索引的创建和使用以及SQL的性能优化

索引 mkdir mysql tar -xvf mysqlxxxxx.tar -c myql cd mysql rpm -ivh .....rpm yum install openssl-devel ​ systemctl start mysqld ​ gerp temporary password /var/log/mysqld.log ​ mysql -u root -p mysql> show variables like validate_password.% set glob…

【Flink精讲】Flink状态及Checkpoint调优

RocksDB大状态调优 RocksDB 是基于 LSM Tree 实现的&#xff08;类似 HBase&#xff09; &#xff0c;写数据都是先缓存到内存中&#xff0c; 所以 RocksDB 的写请求效率比较高。 RocksDB 使用内存结合磁盘的方式来存储数据&#xff0c;每 次获取数据时&#xff0c;先从内存中 …