云计算百科
云计算领域专业知识百科平台

【Linux】【网络】不同子网下的客户端和服务器通信其它方式

【Linux】【网络】不同子网下的客户端和服务器通信其它方式

那么,在 NAT 环境下,应该如何让内网设备做为服务器,使内网设备被外部连接?

1 多拨

部分运营商,支持在多个设备上,通过 PPPoE 登录同一个宽带账号。每个设备都能获取到一个独立的公网 IP4。 如果想让游戏主机等设备获取独立的公网 IP,供外部连接,可以在光猫之后连接交换机。游戏主机连接交换机,直接进行 PPPoE 拨号。无线路由器也连接交换机,家中的其他网络设备经过无线路由器访问 Internet。 在这里插入图片描述

多拨的局限性:

  • 仅部分运营商支持多拨
  • 一些运营商已不再为用户分配公网 IP,即使通过多拨,也获取不到公网 IP
  • 越来越多的设备不再支持 PPPoE。例如Xbox 360 支持 PPPoE,但 Xbox One 之后的版本已不再支持
  • 设备直接获取公网IP,暴露在公网上,安全性较差。可能需要单独设置防火墙
  • 需要额外购买交换机,连接在光猫和路由器之间。会改变家庭网络拓扑,操作比较复杂
  • 所以,这种方式不太常用。

    2 端口转发、DMZ

    上文中介绍的 NAT,路由器会根据内网设备发出的报文,自动形成 NAT 表项。实际上,用户还可以在路由器上手动配置端口映射关系,让内网设备可被外部访问。

    其中,DMZ 功能,可以指定一台内网设备为 DMZ 主机。到达路由器上的报文,如果没有匹配 NAT 表项,就会转发到 DMZ 主机。从而使 DMZ 主机可被外部访问。

    DMZ 功能能让一台内网设备上的所有端口,都能被公网访问。但这样做也影响了内网设备的安全性,如果没有特殊需要,不建议打开这一功能。

    而 端口转发 功能,可以手动设置端口映射关系,让指定内网设备的指定端口,能够被公网访问:

    3 UPnP IGD、NAT-PMP

    上文中的端口转发功能,需要手动配置端口转发规则,操作起来比较麻烦。而 UPnP IGD 和 NAT-PMP 协议,则能实现自动配置端口转发规则。

    UPnP IGD(互联网网关设备协议)和 NAT-PMP(NAT 端口映射协议)分别由微软和 Apple 提出,功能类似,都可以让应用程序告诉路由器需要打开的端口,让路由器自动设置端口转发规则。

    UPnP IGD 和 NAT-PMP 的工作,需要应用程序和路由器的配合。首先需要在路由器上打开 UPnP 或 NAT-PMP 功能:

    还需要使用支持的应用程序。目前 eMule、BitTorrent 等常见的 P2P 文件共享工具,以及 Synology DiskStation 等 NAS 设备,以及 Xbox 等游戏主机,都已经支持相关协议:

    4 光猫改为桥接模式,使用路由器拨号

    安装宽带时,运营商附送的光猫,一般会默认打开路由功能。这时光猫同时能作为路由器使用。

    但光猫的功能和性能有限,一部分型号的光猫不支持 UPnP IGD 等协议,或者不能手动配置端口转发规则。

    所以,可以考虑将光猫修改为桥接模式,通过自己的无线路由器拨号,充分利用路由器上端口转发、UPnP IGD、DMZ 等功能。

    正常情况下,光猫改桥接,最简单的方式是拨打运营商的电脑,让运营商远程下发配置。也可以登录光猫的管理页面,自行进行修改,具体需要上网搜索运营商名和光猫型号来查找教程。

    5 向运营商申请获取公网 IP

    由于 IPv4 地址资源不足,不少运营商已经不再分配公网 IP。

    但是,由于 IPv4 地址资源本身已经不足,不一定能够成功申请到公网 IP。另外,拥有公网 IP,家中的路由器能直接被公网访问,如果没有配置好,可能会带来更多安全问题。所以,需要根据自己的实际需要,来决定是否申请公网 IP。

    6 PCP

    对于运行 NAT 的家庭路由器,通过 UPnP IGD 或 NAT-PMP 协议,可以方便地将端口映射到公网。

    但是,由于 IPv4 地址的不足,电信运营商也开始使用 NAT,不再为用户分配公网 IP。那么是否有一种类似 UPnP IGD 或者 NAT-PMP 的协议,运行在运营商的路由器上,能直接在运营商路由器上创建端口转发规则?

    PCP 就是这样一种协议:

    Port Control Protocol (PCP) – RFC6887 该协议由 NAT-PMP 发展而来,运行在运营商的路由器上。用户的应用程序可通过 PCP 协议,申请在运营商路由器上打开端口。

    PCP 需要运营商的配合,选用支持的网络设备,并打开 PCP 功能,才能正常工作。根据 V2EX 网友的测试,国内已有运营商支持该协议,能通过 PCP 使 eMule 获得 High ID:

    介绍一个可能有助于 CGN NAT 端口映射的工具 – V2EX

    7 服务器中转

    通过第三方服务器中转的方式,让内网设备供外部访问。

    这种方式虽然需要第三方服务器的参与,浪费资源,但成功率最高,所以应用范围也很普遍。例如常见的游戏加速器,就可以通过第三方服务器中转的方式,为游戏主机提供更高的 NAT 类型: 网易UU加速盒 也有不少开源的反向代理工具,可以搭建在自己的服务器上,使内网服务可在公网访问: fatedier/frp ehang-io/nps

    服务器中转需要额外的服务器,且需要消耗服务器上的流量。所以这种方式往往需要用户额外付费,例如购买游戏加速器会员,或者自行购买虚拟服务器,并在服务器上搭建反向代理应用。

    而对于微信语音、视频通话等应用,默认也会使用其他 NAT 穿透技术,来节省微信服务器的流量费用,降低成本。当其他 NAT 穿透方式不可用时,则采用服务器中转的方式,保证能够正常通话。

    8 NAT 打洞

    NAT 打洞的工作过程 NAT 打洞,就可以 使两台内网设备能够直接通信,不需要第三方服务器的中转、不需要对路由器进行特殊设置、也不需要运营商的配置。微信语音、腾讯会议、Skype 通信等消耗流量较大的应用,都会利用 NAT 打洞实现内网设备间的直接通信。

    我们以 PC 1、PC 2 两台主机的通信为例。两台主机均位于 NAT 路由器之后,各自的 IP 地址都是内网地址,无法互相通信: 在这里插入图片描述 1 在两台主机能够直接通信之前,需要一台第三方服务器: 在这里插入图片描述 2 PC 1、PC 2 首先需要给服务器发送一个报文。经过 NAT 路由器后,报文的源 IP 和源端口号被转换,同时在路由器上形成 NAT 表项: 在这里插入图片描述 3 报文到达服务器后,服务器记录下 PC 1、PC 2 两侧报文的源 IP 和源端口号,也就是 PC 1、PC 2 两侧的公网 IP 和外部端口号。然后,服务器将两台设备的公网 IP、外部端口号发送给对方。

    4 这样,PC 1、PC 2 都能相互知道对方的公网 IP 和外部端口号

    5 经历了上述步骤,NAT 打洞成功,两台设备就可以不依赖第三方路由器,直接进行通信。

    当然,上述过程只是一个简化的描述,不完全描述。如果想要进一步详细了解 NAT 打洞的过程,建议参考文末的 RFC 文档链接。

    可以看出,NAT 打洞可以在无需路由器特殊配置、无需运营商配合的情况下,实现两个内网设备的相互通信。另外,对于多层 NAT 的网络环境(例如运营商和家庭路由器各进行一级 NAT),NAT 打洞也能正常处理。

    这个NAT打洞我有尝试实现 ,完成了1,2,3,4 步骤 但是5 两台主机还是无法互相访问,抓包发现双方数据都发送出去了 但是对端收不到,怀疑我这边

  • 环境以及互联网直接太过复杂 路由器转发或者发送时路线可能不同
  • 分配的IP和端口一直在变化 无法进行ping
  • 路由表和NAT表我没有权限去修改
  • 可能存在别的问题 目前暂时无法解决,下一篇文章大概写一下我的做法 希望有大佬指点一下
  • 文章转自: https://sspai.com/post/68037

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【Linux】【网络】不同子网下的客户端和服务器通信其它方式
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!