各位 v 站的大神,问题有些多,还望不吝赐教,先谢谢大家了哈
问题 1:
nas 在家中自然是没有外网 ip 的,但是可以通过群晖服务器提供的网址去访问,
问题 1.1 那么访问的时候数据还会经过群晖这个中间人吗,还是直接 p2p 的? 我理解应该是点对点传输的吧?
问题 1.2 包括群晖提供的各种 app 套件,他们也是点对点传输的吧?
对于 nat 的事情不是很了解,所以想问一下
问题 2: 问题 2.1 为了解决 ip 不足问题,内网机器通过一个公网 ip 发出请求,然后用不同的端口号来区分内网主机,是这样一个原理吗? 问题 2.2 那也就是说一个公网 ip 下最多能有几个内网主机是受端口数量限制的吧? 所以实际应用上肯定没这么简单吧?那么是怎么解决这个问题的呢?
问题 3:
向小区中的网络,好像不止是包了一层 nat,应该是有好几层,这个是怎么实现的呢?
问题 4:
我怎么才能知道被 nat 转换后的端口号,如果知道了,我是不是拿端口号和公网 ip 就可以自己访问内网的机器了?
1
lc7029 2019-12-02 12:59:18 +08:00
按条目回答你的问题:
1,建立连接后,仍需要群晖服务器中转,因为你的设备不能直接被公网访问。在此前提下任何点对点和 p2p 技术都不能通信。 2,NAT 有 src-nat 和 ds-nat 两种方向,7 种还是 6 种类型这个忘了。一般指的是 NAT 上网,有端口限制,TCP+UDP 一共是 13W 多个端口( TCP 和 UDP 各 65535 个),假设一个连接一个端口,超过 13W 多的连接数因为没有端口可用,所以不能建立连接。 3,多级 NAT,为了解决 IP 地址不足问题,城域网还有 NAT444 技术。一般来说小区宽带是把你的内网 IP 给再 NAT 成他们的 IP 出网。现在鹏博士喜欢这么干,最近好像喜欢把公网 IP 拿到内网来用了。 4,NAT 之后,被访问的端口固定,而接收数据的端口不固定。假如你访问我网站 qgdlsj.com ,我的服务器对你开放 443 端口,这个是固定的,回复给你的公网 IP 的随机端口,数据传输完成后,tcp 进行四次握手拆除连接,你用于接收数据的随机端口关闭,数据包经过的网络设备也会拆除这条连接。所以就算知道了,由于网络设备不给 DS-NAT,所以也不能用于内网访问。 如有问题,请关注我博客,奇怪的老司机 qgdlsj.com |
2
Orciorc 2019-12-02 13:17:47 +08:00 via Android
@lc7029 请问一个问题,会不会是群晖服务器把客户端 ip 报告给 NAS,由 NAS 主动建立连接的,类似于反弹 Shell ?(假设客户端有公网 ip )
|
3
Linken404 2019-12-02 13:23:21 +08:00
我感觉群晖的那个服务(好像叫 quickconnect 还是什么)不是单纯的 ddns 那种实现方式,所以猜测如果用群晖提供的那个链接来访问的话,数据会经过群晖。
如果使用 ddns 或者内网穿透这种技术来直接访问自己的 NAS,那么数据就是点对点的。 至于你想的直接访问,首先公网地址是不固定的,哪怕你用的是一级运营商,也只是能分到公网 IP,但是是动态的。这种如果你直接通过 IP 访问,那么每次 IP 变动之后都需要重新查询获取,是很难在实际中应用的。 如果你用的是宽带通鹏博士这种,你问题 4 中的想法实际上是实现不了的。 |
4
lc7029 2019-12-02 13:27:16 +08:00
@Orciorc 不知道群晖设备和服务器之间通信发了什么,我在防火墙上看到他们之间是维持着一条长连接,由于使用了 SSL,看不到具体通信内容。
所以我猜测是设备和服务器之间维持长连接,当外网访问群晖服务器时,通过长连接给群晖设备推送相应指令。 |
5
imn1 2019-12-02 13:35:33 +08:00
抢答一下,我比你知道的多不了多少,但可以用没那么专业的词汇回答,😄
1.如果你说的网址是 ddns(不少 nas 有这个提供),基本上 yes,因为能用 ddns 意味着有公网 ip 如果不是,那很可能是通过 nas 提供的中转,具体群晖怎么做,我还真没用过他家 2.其实端口比 ip 更加不足(内网来说) 这样说,连接外网的机器(设备可能多样,但简单用路由器替代) 路由器也是一个电脑,它的端口也是最多 65535(暂不计较连接方式) 而内网每台机都有 65535 个端口,所以路由器并不能把内网每一台机的每个端口都向外映射 端口并不仅是区分机器,而是区分“机器+服务”,同一台机器 ftp、web 在对外要用两个端口的 一台机器理论上可以开超过 65535 个服务,假设这台机器无限强大,加上一个服务多个访问,所以端口其实不够用 实际上,一台机器能开上百个服务已经负担很重了,就算没有访问(连接),也是耗费内存和 CPU 的 但端口一般主要关注的是监听端口,而不是发送端口,前者往往在程序运行期间不会变,后者可能是不定的 监听端口多数是“接收方”,所以,基本能保证监听端口在外网能连上就足够,需要从内网机器映射到外网 你要明白“接收”这个概念是相对的,例如聊天软件,互相都是发送和接收,可以在同一个端口收和发 3.一知半解,说不出所以然 4.没有拦截的话是,但一般都有连接协议、账密、权限、防火墙等做身份鉴定,不然谁都可入访问是个大问题 |
6
hanatao 2019-12-02 14:31:55 +08:00 via iPhone
可以回答第一个问题:如果家里有公网 IP,然后路由器设置好了端口转发,那么通过群晖 quickconnect 连接的话是会自动握手设备 IP 进行点对点访问的。但是如果机器无外网 IP 的话,那么只能通过服务器中转的方式进行连接了。
|
7
canyue7897 2019-12-02 14:44:00 +08:00
1.如果没有公网 IP 的话,要通过服务器中转。想 P2P,就必须打洞穿透。
2.一般来说,用端口号的方式是区分不同的应用,加上 IP 地址是区分不同的主机。.端口数量受限于规定,基本上 1024 以下的是默认分配的,一般不要占用,高端口的随便占用一个就行,理论上用上端口复用技术,如果硬件性能足够,内网主机可以无限。另外,如果可以穿透的话,也可以点对点传输。 3.有好几层网关设备,类似级联。 4.在自己电脑上监听下,看下应用发送接收端口就知道了。 以上为个人理解。 |
8
snable 2019-12-02 14:48:08 +08:00 via Android
兄弟,跑题一句,你有 ipv6 以后就不用这么折腾了。
|
9
rizon OP @hanatao #6
@canyue7897 #7 @lc7029 #1 关于第一条 没法 p2p,家里的设备或者公司的设备都没有直接的外网 ip 这是很正常的对吧,但是很多工具都实现了 p2p 传输啊,比如一些基于 webrtc 的 网页客户端(在网页上就可以直接点对点的传输文件),还有像 teamviewer 应该也是穿透了内网的点对点的吧? 那他们怎么实现的呢? 我理解的是,他们通过中间服务器拿到了 a 和 b 两端的 ip 地址以及被 nat 分配的端口号,把 ip 和端口号告诉另一个人,然后就可以直接连接了,那群晖不应该也是这样做的才对吗? |
10
canyue7897 2019-12-02 14:55:41 +08:00
@rizon 他们都是简单粗暴的服务器中转。那一段数字就是网络地址,类似 DHT。你说的这种方法是穿透的一种,可以看下 zerotier。
|
11
canyue7897 2019-12-02 14:56:51 +08:00
@rizon 群晖当然可以这样做,但是国内网络太过复杂,打洞成功率不高。。。。尤其是移动网络。。。所以基本没啥必要
|
12
flyoungstudio 2019-12-02 15:01:21 +08:00
@rizon teamviewer 就是服务器中转,数据要从他那边过一道
|
13
rizon OP @canyue7897 #10 zerotier 我也在用,他也是通过配置的 moon 来实现数据中转的吧,
我刚才又看了一下,zerotier 也好,webrtc 也好,都是先侦测网络如果可以直接通讯则走直连,如果不能的话就通过代理来转发,是这样的吗?? |
14
rizon OP @flyoungstudio #12 好的吧,我看速度挺快的,还以为不走他们服务器的呢
那如果这样,怎么去确保数据是安全的,没有被劫持啊 |
15
rizon OP @canyue7897 #10
有个叫 sharedrop 的 他宣称的是 p2p 文件传输啊,那这个怎么理解呢? What is it? ShareDrop is a free app that allows you to easily and securely share files directly between devices without having to upload them to any server first. How to use it? Sharing files between devices in local network* To send a file to another device in the same local network, open this page (i.e. www.sharedrop.io) on both devices. Drag and drop a file directly on other person's avatar or click the avatar and select the file you want to send. The file transfer will start once the recipient accepts the file. |
16
canyue7897 2019-12-02 15:15:37 +08:00
@rizon 解释的很明白了哈。。local network,不用公网的哈
|
17
rizon OP @canyue7897 #16 我没贴全,本地网络是可以直接发现其他客户端,但如果是不同网络,通过指定客户端的方式也可以实现传输
>Sharing files between devices in different networks To send a file to another device in a different network, click + button in the upper right corner of the page and follow futher instructions. |
18
canyue7897 2019-12-02 15:38:25 +08:00
@rizon 你看看,后面不是写着要遵守下面的操作说明么?*Devices need to have the same public IP to see each other.看看最后一句话
|
19
canyue7897 2019-12-02 15:38:52 +08:00
在 got it 后面。。。。
|
20
canyue7897 2019-12-02 15:44:05 +08:00
这种网页版的,不可能实现的多复杂。。。如果需要复杂功能,都开发 client 版本了。。。。
|
21
rizon OP @canyue7897 #18 嗯,其实一开始倒是看到这句话了,不过可能是被 p2p 唬住了吧,想想也是,基本上就是市面上的那么个技术而已,也不可能有什么黑科技哈。
|
22
txydhr 2019-12-02 15:49:33 +08:00
如果你是用浏览器的话是群晖服务器中转
app 的话会尝试打洞,打洞成功就不经过群晖服务器,失败就服务器中转 |
23
lc7029 2019-12-02 16:26:29 +08:00 1
@rizon 这些 p2p 技术的核心还是 nat 出去之后映射的某个端口号,这技术叫 upnp,当路由器不支持或者在二级路由器下的时候 upnp 不能用,只能连接有公网 IP 的机器或者访问服务器获取数据。另外,upnp 大量创建映射关系,会导致网络设备内存和 CPU 占用飙升,引发死机。
teamviewer 我抓过包,他的套路是所有数据都经过 teamviewer 的服务器中转,所以只要能上网就行,不需要点对点。 通过中间服务器拿到双方的 IP 和端口,由于 tcp 传输完毕后会自动关闭接口,这么做不实用。再者就算双方都通过程序控制完成传输不拆除 tcp 连接,由于来源检查,非中转服务器也不能与双方通信。就算双方设备都修改程序禁用来源检查,运营商设备或者说整个链路上任何一个设备开着来源检查,就会给你丢包。 |