V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MFWT
V2EX  ›  宽带症候群

是否最好区分开『端口转发』和『端口重定向』?

  •  
  •   MFWT · 230 天前 · 1745 次点击
    这是一个创建于 230 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    和群友在群里讨论 FRP 反代 BT 的问题,有人提了个我也碰到过的现象:用 FRP 内穿来暴露公网端口,连入的客户端不显示对方公网 IP ,只显示 127.0.01 或者 192.168 之类的(用于内网穿透的机器的)内网 IP

    其实用原理上看这个问题不难理解,站在跑 BT 的机器角度来看,这些请求都是内网的一台机器发过来的,只是端口不同罢了,它可能会质疑一下这机器的品味,但是还是会照常工作,他并不知道什么是内网穿透,反正把数据传过去就是了

    不过这倒是引出来了题中的问题:端口转发( forwarding )和端口重定向( redirecting )在讨论中是否应该区分开来?

    我的观点

    我的直觉是,这两个名词被混淆了。以下观点的不正确之处,请各位批评斧正

    端口转发:定义较广,可以包括端口重定向在内,也可以包括内网穿透这一类的『 5 层代理』,因为后者这一类的工作模式,比如单看 TCP ,可以描述为把 TCP 里的数据『抠』出来,重新封装成其他形式的数据,比如加密,再用 TCP 包起来发出去.

    端口重定向:单纯的重定向数据包,就是把目标地址改一下再路由出去

    上面两个概念,可能描述不是很清楚,我举个例子,假设:

    1. 一台机器(双网卡)公网 1.1.1.1 ,内网 10.0.0.1
    2. 另一台机器(单网卡)无公网,内网 IP 10.0.0.2
    3. 两台机器的内网处于同一个局域网内,相关配置已做好,宏观看都是 1 机器转到 2 机器,仅考虑数据包单向跑的情况

    现在 1 机器的公网接口收到一个包,源地址 2.2.2.2 ,目的地址 1.1.1.1:80:

    1. 如果是端口重定向,那么 1 机器简单的做 DNAT ,把目的地址改成 10.0.0.2 ,然后扔给 2 机器( 2 机器收到的包:源地址 2.2.2.2 ,目标地址 10.0.0.2:80 )

    2. 如果是端口转发,那么 1 机器除了可以有上面的做法,还可以,比如把数据抠出来之后,重新封一次 TCP ,原地址 10.0.0.1 ,目的地址 10.0.0.2 ,再扔给 2 机器( 2 机器收到的包:源地址 10.0.0.1 ,目标地址 10.0.0.2:80 )

    从 2 机器上看来源 IP (比如 BT 软件看连上来的用户),端口重定向会显示 2.2.2.2 的 IP ,但是端口转发可能只能看到 10.0.0.2

    一些问题

    因此我想问问各位 v 友:上面的想法是否正确,以及是否应该如题所说最好区分下这两个概念?

    谢谢!

    7 条回复    2023-09-14 12:36:23 +08:00
    Worldispow
        1
    Worldispow  
       230 天前   ❤️ 1
    具体名词我不懂。
    但防火墙和信息隔离装置,就是上述操作的两种类型的设备。
    甚至有丧心病狂的安全厂商,把源 ip 拆出来,封装成 127.0.0.1 。。。。。
    Worldispow
        2
    Worldispow  
       230 天前
    还有,信息隔离装置,不仅仅是简单的封装,还做了数据摆渡。
    mikewang
        3
    mikewang  
       229 天前   ❤️ 1
    关于 FRP 等程序的功能,我更喜欢 Windows 中的说法:Port Proxy (端口代理)
    特征就是会将 TCP/UDP 中的数据在应用层复制一遍,再以自身的身份发出去(代理)。

    像 iptables 这样的端口重定向,只是改了 TCP/UDP 头部的地址信息,工作在传输层。

    所以按照原理和表现同时分类,端口转发有三种:

    1. 应用层端口代理,不保留源 IP (如 FRP )
    2. 传输层 DNAT ,保留源 IP (如家用路由器上的端口转发)
    3. 传输层 DNAT+SNAT ,不保留源 IP (也属于重定向,但是源 IP 被 NAT )
    mikewang
        4
    mikewang  
       229 天前
    两个名词并没有被混淆,端口转发是一个很广泛的概念。
    不过有个特例,就是重定向的目标是自身,仅端口号不同的时候,它不是转发(因为确实没有转发)。其他场景叫端口转发没有问题
    maybeonly
        5
    maybeonly  
       229 天前
    就说保留和不保留源 ip 吧
    如果 http 层转发,但是加了 x-forwarded-for ,就可以传输源 ip 了
    如果传输层转发,但是在会话最开始的时候多了几个字节用于告知来源 ip ,他也能获知源 ip
    或者加个 tcp option ,专门用来传递源 ip
    或者把数据包封装起来,外边装一层 ipip 头之类的,转给后面的机器处理,一样可以保留
    要么就是把目的地址改了源地址不动,只要后面的机器回包的时候从你这边走就能给走通了
    最后就是在同一个网段的话直接把 mac 地址改了丢过去
    ……
    前面那些方法都能保留源 ip 。
    所以根本性的区分不在哪里。应该说的是在哪一层转发。
    核心是,把 ip 的功能从“路由”上剥离开。

    顺便说,前面那些方法都是负载均衡中常用的模式,分别是 http 代理、proxy-protocol 、toa 、tun 、nat 和 dr 。
    ppbaozi
        6
    ppbaozi  
       229 天前   ❤️ 1
    端口转发、端口重定向只是 Port forwarding 的不同翻译形式罢了,并不存在一个 port redirect 的专用词
    按你的理解 vpn 、ssh 都算进端口转发了
    zmcity
        7
    zmcity  
       227 天前
    你最好把这个概念局限于 iptables 的配置,redirect 就是反向代理,forward 就是路由。
    不然说其他软件,他们都是有自己的概念的,没有办法给一个统一的解释。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3244 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 79ms · UTC 11:51 · PVG 19:51 · LAX 04:51 · JFK 07:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.