目前所使用的NAT基本都是NAPT,即多端口的NAT技术,因此本文主要是设计了两种测定路由器NAPT类型的实验。

实验环境

设备

  • 主机A:Windows
  • 主机B:Windows
  • 路由器

软件

  • nc
  • Wireshark
  • SocketTools

在局域网内部完成所有测试,完全不需要互联网连接

实验设计

实验方案一

不使用外部工具,使用系统自带的工具

实验拓扑

[主机A] (双网卡)|--- 网卡1 (例如: 192.168.1.10):连接外部网络,禁用或断掉。||--- 网卡2 (手动配置IP,例如: 192.168.137.1):用网线连接至路由器WAN口。|
[WiFi路由器]|--- WAN口: 连接主机A的网卡2|--- LAN口: 用网线连接至主机B|
[主机B] (手动配置IP,例如: 192.168.1.100):连接路由器LAN口。

关键点:

  • 主机A的第二个网卡和路由器WAN口构成了一个独立的迷你网络
  • 而路由器LAN口和主机B构成了另一个网络。
  • 路由器在这两个网络之间执行NAT。

配置步骤

  • 物理连接:
    • 用一根网线,连接主机A的第二个网卡 到 路由器的WAN口。
    • 用另一根网线,连接主机B 到 路由器的任意一个LAN口。
    • 确保路由器、主机A、主机B的WiFi功能均已关闭。
  • 配置主机A的网卡2:
    • 右键点击“网络”->“属性”->“更改适配器设置”。
    • 找到连接路由器WAN口的那个网络连接。
    • 右键“属性”->“Internet协议版本4 (TCP/IPv4)”->“属性”。
    • 选择“使用下面的IP地址”:
      • P地址: 192.168.137.1
      • 子网掩码: 255.255.255.0
      • 默认网关: 留空
    • 这一步是把主机A变成一个简单的“网关”设备。
  • 配置路由器WAN口:
    • 登录路由器管理后台(通常地址是192.168.1.1或192.168.0.1,通过主机B连接后访问)。
    • 找到“上网设置”或“WAN口设置”。
    • 将上网方式改为“静态IP”或“固定IP”。
    • 填写如下信息:
      • IP地址: 192.168.137.2 (必须和主机A的网卡2在同一网段)
      • 子网掩码: 255.255.255.0
      • 默认网关: 192.168.137.1 (指向主机A的网卡2)
      • DNS服务器: 可以留空或填写 192.168.137.1
  • 配置主机B:
    • 确保其通过LAN口从路由器自动获取IP地址(DHCP)即可。
    • 正常情况下,它会获得一个 192.168.1.x 的IP地址。记下这个地址,例如 192.168.1.100。

进行NAT类型测试

现在,网络环境变成了:

  • “伪公网”侧: 主机A (192.168.137.1) 和 路由器WAN口 (192.168.137.2)。
  • 内网侧: 主机B (192.168.1.100) 和 路由器LAN口 (192.168.1.1)。

主机A 现在扮演了两个角色:

  • 它是“伪公网”上的一个节点。
  • 它是我们用来测试路由器NAT行为的控制机。

测试方法(使用Windows自带功能)

将使用Windows自带的PowerShell和测试连接命令来完成,完全无需下载第三方软件。

第1步:在主机A上开启路由和防火墙规则

以管理员身份打开PowerShell,输入以下命令,允许IP转发并添加防火墙规则,允许ICMP和UDP回显请求:

# 启用IP转发(让主机A成为一个简单的路由器)
Set-NetIPInterface -Forwarding Enabled# 添加防火墙规则,允许ICMP (ping)
New-NetFirewallRule -DisplayName "NAT_Test_ICMP" -Direction Inbound -Action Allow -Protocol ICMPv4# 添加防火墙规则,允许UDP端口20000-20010(用于测试)
New-NetFirewallRule -DisplayName "NAT_Test_UDP" -Direction Inbound -Action Allow -Protocol U
第2步:测试NAT映射行为(判断对称型还是锥型)

1.在主机A上监听UDP包:

打开两个PowerShell窗口(窗口1和窗口2)。

  • 在窗口1中运行,监听端口20000:
nc -lu -p 20000
  • 在窗口2中运行,监听端口20001:
nc -lu -p 20001

(如果系统没有nc,可以先安装,或者使用更强大的Test-NetConnection,但监听功能较弱。建议临时下载一个轻量版nc,或者用Python简单脚本替代,这是此方案唯一可能非“纯粹自带”的点)

2.从主机B向内网侧的路由器公网IP发包:

在主机B上打开PowerShell。

  • 首先,向主机A的第一个端口(20000)发送UDP包:
# 目标地址是路由器WAN口的IP
echo "test1" | nc -u 192.168.137.2 20000
  • 然后,向主机A的第二个端口(20001)发送UDP包:
echo "test2" | nc -u 192.168.137.2 20001

3.在主机A上观察结果:

  • 查看窗口1和窗口2,看是否收到了test1和test2消息。
  • 更重要的是,记录下每个消息的来源IP和端口。这个来源IP应该是主机B的内网IP(192.168.1.100),但来源端口非常重要!我们称之为PortB1和PortB2。
  • 分析:
    • 如果 PortB1 等于 PortB2: 路由器是 锥型NAT
    • 如果 PortB1 不等于 PortB2: 路由器是 对称型NAT
第3步:测试NAT过滤行为(判断锥型子类型)

假设上一步测出是锥型NAT (PortB1 == PortB2 = PortX)

1.从主机A主动向主机B发包:

  • 在主机A的PowerShell中,直接向主机B的内网IP 192.168.1.100 的某个端口(如30000)发送一个UDP包。这一步是为了“在白名单上增加一个IP”。
echo "enable" | nc -u 192.168.1.100 30000
  • 主机B上不需要监听,目的是让路由器记录一次会话

2.从主机A尝试逆向连接:

  • 现在,在主机A上,尝试从一个全新的、未被使用的端口(例如20005)向主机B刚才使用的源端口PortX发送数据。
# 在主机A上开一个新的PowerShell窗口
echo "Hello from A" | nc -u -p 20005 192.168.1.100 $PortX
  • 观察主机B是否能收到这个包(可以在主机B上临时用nc -lu -p $PortX监听)

分析

  • 情况A:主机B直接收到了这个包(从192.168.137.2:20005发来)。
    • 结论: Full Cone NAT。任何外部主机都可以通过映射后的端口(PortX)联系主机B。
  • 情况B:主机B没有收到包。
    • 现在,让主机A从之前主机B联系过的端口(例如20000)再次向PortX发送。
echo "Hello again" | nc -u -p 20000 192.168.1.100 $PortX
  • 如果主机B这次收到了:
    • 结论: Port Restricted Cone NAT。路由器要求源IP和源端口都必须匹配才放行。
  • 如果主机B还是没收到:
    • 说明规则可能更严格,或者测试中有误。但在这种封闭环境中,Port Restricted Cone NAT 是最常见的家用路由器行为。

实验方案二

使用 SocketTool 和 Wireshark 组合

  • Wireshark 可以清晰地看到每一个数据包的细节(源IP、源端口、目标IP、目标端口、协议),这是验证 NAT 行为最权威的方式。
  • SocketTool 则提供了图形化的界面来创建服务器和客户端,比命令行更易于操作和观察。

实验拓扑(同上)

[主机A] (双网卡)|--- 网卡1 (例如: 192.168.1.10):连接外部网络,禁用或断掉。||--- 网卡2 (手动配置IP,例如: 192.168.137.1):用网线连接至路由器WAN口。|
[WiFi路由器]|--- WAN口: 连接主机A的网卡2|--- LAN口: 用网线连接至主机B|
[主机B] (手动配置IP,例如: 192.168.1.100):连接路由器LAN口。

关键点:

  • 主机A的第二个网卡和路由器WAN口构成了一个独立的迷你网络
  • 而路由器LAN口和主机B构成了另一个网络。
  • 路由器在这两个网络之间执行NAT。

配置步骤(同上)

  • 物理连接:
    • 用一根网线,连接主机A的第二个网卡 到 路由器的WAN口。
    • 用另一根网线,连接主机B 到 路由器的任意一个LAN口。
    • 确保路由器、主机A、主机B的WiFi功能均已关闭。
  • 配置主机A的网卡2:
    • 右键点击“网络”->“属性”->“更改适配器设置”。
    • 找到连接路由器WAN口的那个网络连接。
    • 右键“属性”->“Internet协议版本4 (TCP/IPv4)”->“属性”。
    • 选择“使用下面的IP地址”:
      • P地址: 192.168.137.1
      • 子网掩码: 255.255.255.0
      • 默认网关: 留空
    • 这一步是把主机A变成一个简单的“网关”设备。
  • 配置路由器WAN口:
    • 登录路由器管理后台(通常地址是192.168.1.1或192.168.0.1,通过主机B连接后访问)。
    • 找到“上网设置”或“WAN口设置”。
    • 将上网方式改为“静态IP”或“固定IP”。
    • 填写如下信息:
      • IP地址: 192.168.137.2 (必须和主机A的网卡2在同一网段)
      • 子网掩码: 255.255.255.0
      • 默认网关: 192.168.137.1 (指向主机A的网卡2)
      • DNS服务器: 可以留空或填写 192.168.137.1
  • 配置主机B:
    • 确保其通过LAN口从路由器自动获取IP地址(DHCP)即可。
    • 正常情况下,它会获得一个 192.168.1.x 的IP地址。记下这个地址,例如 192.168.1.100。

进行NAT类型测试

第一步:在主机A上开启路由和防火墙

以管理员身份打开PowerShell,执行以下命令:

# 启用IP转发
Set-NetIPInterface -Forwarding Enabled# 添加防火墙规则,允许UDP端口20000-20010(用于测试)
New-NetFirewallRule -DisplayName "NAT_Test_UDP" -Direction Inbound -Action Allow -Protocol UDP -LocalPort 20000-20010
第二步:测试NAT映射行为(对称型 or 锥型)

测试的目的是看主机B访问两个不同的外部地址时,路由器为其分配的公网端口是否相同

1.在主机A上创建两个UDP服务器:

  • 打开两个 SocketTool 窗口。
  • 在第一个窗口中,创建 UDP Server。监听地址选择 0.0.0.0 或 192.168.137.1,监听端口填写 20000。点击“创建”。
  • 在第二个窗口中,再创建一个 UDP Server。监听端口填写 20001。点击“创建”。
  • 现在,主机A就在它的两个端口上等待接收UDP数据了。

2.在主机B上创建UDP客户端并向主机A发包:

  • 在主机B上打开 SocketTool。
  • 创建 UDP Client。远程主机地址填写路由器的WAN口IP:192.168.137.2。
  • 首先,在“远程端口”处填写 20000,在发送数据框里输入 test1,点击“发送”。
  • 然后,将“远程端口”改为 20001,在发送数据框里输入 test2,点击“发送”。

3.在主机A上观察并记录:

  • 观察两个UDP服务器窗口,你应该会分别收到 test1 和 test2 消息。
  • 关键: SocketTool会显示每条消息的来源IP和端口。这个来源IP是主机B的内网IP(192.168.1.100),但端口是路由器NAT转换时分配的公网端口(我们称之为 PortB1 和 PortB2)。
  • 记录下这两个端口号。

4.使用Wireshark验证(可选但推荐):

  • 在主机A上打开Wireshark,选择绑定IP 192.168.137.1 的那个网卡,开始抓包。
  • 设置过滤器为 udp.port == 20000 or udp.port == 20001。
  • 重复第2步的发送操作。会在Wireshark中清晰地看到数据包。
  • 查看数据包的详情:“Internet Protocol Version 4” -> “Source Address” 是 192.168.137.2(路由器WAN口),但“User Datagram Protocol” -> “Source Port” 就是要找的 PortB1 和 PortB2。这提供了最权威的证据。

5.分析Mapping:

  • 如果 PortB1 等于 PortB2: 路由器是 锥型NAT。
  • 如果 PortB1 不等于 PortB2: 路由器是 对称型NAT。
第三步:测试NAT过滤行为(判断锥型子类型)

假设上一步测出是锥型NAT (PortB1 == PortB2 = PortX)

1.在主机B上创建UDP服务器:

  • 在主机B上打开一个新的 SocketTool 窗口。
  • 创建一个 UDP Server。监听端口填写一个数字,比如 30000。点击“创建”。让这个窗口保持打开监听状态

2.从主机A尝试逆向发送数据:

  • 在主机A上打开一个新的 SocketTool 窗口。
  • 创建一个 UDP Client。
  • 远程主机地址填写主机B的内网IP:192.168.1.100。
  • 远程端口填写主机B正在监听的端口 30000。
  • 在发送框输入 Hello from A,点击“发送”。
  • 目的:这个操作是为了在路由器的NAT会话表中创建一个记录,让路由器认为“192.168.1.100:30000这个内部主机已经和外部地址(192.168.137.1)通信过了”。

3.进行关键的过滤测试:

  • 现在,在主机A上,再次使用 UDP Client。
  • 这次,远程主机地址仍然填主机B的IP 192.168.1.100。
  • 但是,远程端口要填之前记录下来的路由器映射端口 PortX。
  • 在发送框输入 Test Filtering,点击“发送”。

4.观察结果:

  • 情况A:在主机B的UDP服务器(端口30000)上收到了 Test Filtering 消息。
    • 结论: Full Cone NAT。任何外部主机都可以通过映射端口 PortX 联系主机B,无论主机B之前是否与之通信过。
  • 情况B:主机B没有收到任何消息。
    • 现在,让主机A从最初接收数据的端口(20000) 再次向 192.168.1.100:PortX 发送。观察主机B是否收到。
    • 如果主机B这次收到了:
      • 结论: Port Restricted Cone NAT。路由器要求外部数据包的源IP和源端口必须与内部主机之前主动联系过的那个目标完全一致,才允许入站。
    • (Restricted Cone NAT 比较少见,它要求源IP一致即可,不要求源端口一致。你可以尝试从主机A的一个新端口向 PortX 发包来测试,但如果上一步没通,而用端口20000就通了,那基本就是Port Restricted)。

注意事项

整个实验过程最好在无网络的情况下完成,否则会严重影响实验结果的准确性,甚至导致实验完全失败。

  • 实验核心是创建一个受控的、隔离的迷你网络环境,用来观察路由器的NAT行为。
  • 如果保持外网连接,会引入大量不可控的变量,如:
    • 路由混淆和网络环路
    • 防火墙和安全策略干扰

最简单可靠的方法就是直接拔掉连接网口的那根网线。这是最干净、最彻底的隔离方法。

次优方案可以禁用网络适配器。

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

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

相关文章

ROS 2系统Callback Group概念笔记

核心概念 Callback Group(回调组)是一个管理一个或多个回调函数执行规则的容器。它决定了这些回调函数是如何被节点(Node)的 executor 调度的,特别是当多个回调函数同时就绪时,它们之间是并行执行还是必须串…

Qt——主窗口 mainWindow

主窗口 mainWindow 前面学习的所有代码,都是基于QWidget控件,其更多的是作为别的窗口的部分 现在来学习QMainWindow,即主窗口,其包含以下属性 Window Title:标题栏Menu Bar:菜单栏Tool Bar Area&#xff1a…

无训练神经网络影响下的智能制造

摘要 未训练神经网络(Untrained Neural Networks, UNNs)作为近年来人工智能领域的新兴范式,正在逐步改变智能制造的发展路径。不同于传统深度学习依赖大规模标注数据与高性能计算资源的模式,UNNs 借助网络结构自身的归纳偏置与初…

微服务自动注册到ShenYu网关配置详解

一、配置逐行详解 shenyu:register:registerType: http # 注册中心类型:使用 HTTP 协议进行注册serverLists: ${shenyu-register-serverLists} # ShenYu Admin 的地址列表props:username: ${shenyu-register-props-username} # 注册认证用户名password: ${shenyu-regi…

时序数据库IoTDB的列式存储引擎

在大数据时代,工业物联网(IIoT)场景正以前所未有的速度生成着海量的时间序列数据。这些数据通常由成千上万的传感器(如温度、压力、转速传感器)持续不断采集产生,它们具备鲜明的特点:数据时间属…

JavaScript手录18-ajax:异步请求与项目上线部署

前言:软件开发流程 AJAX:前端与后端的数据交互 前后端协作基础 Web应用的核心是“数据交互”,前端负责展示与交互,后端负责处理逻辑与数据存储,二者通过网络请求协作。 (1)项目开发流程与岗…

HTB 赛季7靶场 - Enviroment

最近所幸得点小闲,补个档嘞!~nmap扫描 nmap -F -A 10.10.11.67dirsearch扫描发现login接口 http://environment.htb/login构造如下payload,让程序报错,其原理在于缺失了rember后会导致报错,从而告诉我们一个新的参数ke…

源码编译部署 LAMP 架构详细步骤说明

源码编译部署 LAMP 架构详细步骤说明 一、环境准备 1. 关闭防火墙和SELinux [roothrz ~]# systemctl stop firewalld [roothrz ~]# systemctl disable firewalld [roothrz ~]# setenforce 02. 配置YUM网络源 [roothrz ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://m…

机器学习----PCA降维

一、PCA是什么?主成分分析(Principal Component Analysis,PCA)是机器学习中最常用的降维技术之一,它通过线性变换将高维数据投影到低维空间,同时保留数据的最重要特征。PCA由卡尔皮尔逊于1901年发明&#x…

ReactNative开发实战——React Native开发环境配置指南

一、开发前准备 1. macOS平台基础工具安装 brew install node18 brew install watchman brew install cocoapods2. 代理配置 npm config set proxy http://127.0.0.1:7890 npm config set https-proxy http://127.0.0.1:7890# 新增扩展建议(可选配置) ec…

差速转向机器人研发:创新驱动的未来移动技术探索

在科技日新月异的今天,机器人技术作为智能制造与自动化领域的核心驱动力,正以前所未有的速度发展。其中,差速转向机器人以其独特的运动机制和广泛的应用前景,成为了科研与工业界关注的焦点。本文旨在探讨差速转向机器人研发进展&a…

Wireshark捕获电脑与路由器通信数据,绘制波形观察

一、准备工作 电脑发出数据的波形图绘制在我的另一篇博客有详细介绍: 根据Wireshark捕获数据包时间和长度绘制电脑发射信号波形-CSDN博客 路由器发送给电脑数据的波形图绘制也在我的另一篇博客有详细介绍: 根据Wireshark捕获数据包时间和长度绘制路由…

汽车ECU实现数据安全存储(机密性保护)的一种方案

一、 综述在车辆ECU中总是有一些密钥或重要数据需进行机密性保护,但因产品选型、成本等考虑,导致一些ECU的芯片不支持硬件安全模块(例如HSM、TEE等)。此时,为保障数据的机密性,可考虑通过软件实现数据的安全…

AI 效应: GPT-6,“用户真正想要的是记忆”

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

云计算学习100天-第25天

部署LNMP环境安装软件#在前一天已经安装nginx的基础上安装MariaDB,php和php-fpm yum -y install mariadb mariadb-server mariadb-devel php php-mysqlnd php-fpm #mariadb(数据库客户端软件)、mariadb-server(数据库服务器软件&…

细化的 Spring Boot 和 Spring Framework 版本对应关系

注:本文由ai辅助,个人整理,有问题可留言 Spring Boot 3.x 系列 (基于 Spring Framework 6.x) Spring Boot 版本 对应的 Spring Framework 版本 Java 支持版本 3.1.5 (最新) 6.0.15 Java 17+ 3.1.4 6.0.14 Java 17+ 3.1.3 6.0.12 Java 17+ 3.1.2 6.0.11 Java 17+ 3.1.1 6.0.…

PyTorch API 1

文章目录torch张量创建操作索引、切片、连接与变异操作加速器生成器随机采样原地随机采样准随机采样序列化并行计算局部禁用梯度计算数学运算常量逐点运算归约操作比较运算频谱操作其他操作BLAS 和 LAPACK 运算遍历操作实用工具符号数字导出路径控制流优化方法操作符标签torch.…

基于FPGA的实时图像处理系统(2)——VGA显示彩条和图片

VGA显示彩条和图片 文章目录VGA显示彩条和图片一、VGA简介二、功能设计1、彩条设计2、图片设计三、结果展示四、代码一、VGA简介 VGA(Video Graphics Array)是IBM在1987年随PS/2机⼀起推出的⼀种视频,具有分辨率⾼、显⽰速率快、颜⾊丰富等优点,在彩 ⾊…

【网络运维】Linux 文本处理利器:sed 命令

Linux 文本处理利器:sed 命令 sed 简介 sed(Stream Editor)是一款非交互式的流编辑器,诞生于 1973–1974 年间的贝尔实验室,由 McMahon 开发。它专为文本处理而生,功能强大,是 Linux 文本处理常…

week2-[一维数组]出现次数

week2-[一维数组]出现次数 题目描述 给定 NNN 个整数A1,A2,…,ANA_1,A_2,\ldots,A_NA1​,A2​,…,AN​。请求出这 NNN 个数中出现次数最多的数的出现次数,以及出现次数最少的数的出现次数。 输入格式 读入包括 222 行。第一行只有 111 个整数 NNN,表示数…