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

2023-09-11 18:00:31 +08:00
 MFWT

背景

和群友在群里讨论 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 友:上面的想法是否正确,以及是否应该如题所说最好区分下这两个概念?

谢谢!

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

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

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

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

顺便说,前面那些方法都是负载均衡中常用的模式,分别是 http 代理、proxy-protocol 、toa 、tun 、nat 和 dr 。
xPKK1qofAr6RR09O
2023-09-12 10:07:03 +08:00
端口转发、端口重定向只是 Port forwarding 的不同翻译形式罢了,并不存在一个 port redirect 的专用词
按你的理解 vpn 、ssh 都算进端口转发了
zmcity
2023-09-14 12:36:23 +08:00
你最好把这个概念局限于 iptables 的配置,redirect 就是反向代理,forward 就是路由。
不然说其他软件,他们都是有自己的概念的,没有办法给一个统一的解释。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/972800

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX