liu 发布的文章

内⽹穿透⼯具对⽐FRP+NPS+Zerotier与NAT服务器测试

中展⽰了私有云盘的搭建⽅式,但仅能本地访问肯定⽆法满⾜有私有云⽤户的需求,于是笔者尝试了多个流⾏的内⽹穿透⼯具,⾸先说明⼀下笔者⽬前的配置情况,可道云是通过树莓派挂载的,到达公⽹前⾄少有两次NAT,服务器有⼀个⾹港的普通服务器( 30M 带宽)和两个江苏的NAT服务器( 100M 带宽),笔者将分别在两种服务器上使⽤三个软件,并介绍安装和配置⽅法以及注意事项

⾸先解释⼀下NAT服务器,与普通服务器不同的是,NAT服务器是多个⽤户共⽤ IP 的,仅能使⽤⼗个⾄⼏⼗个端⼝,有的是直接划分好端⼝段( OLVPS ),服务器上⽤防⽕墙打开对应端⼝即可使⽤,有的可以⾃⾏设定端⼝映射( CloudIPLC ),但是在公⽹上只能打开 1 万以上的端⼝号,且可能已经被占⽤

FRP 和 NPS 的原理都相近,⼀个主(Server)多个从(Client),通过⼀个端⼝(TCP复⽤)使多个从服务器的端⼝映射到主服务器上,使得访问主服务器端⼝时,能获得访问从服务器对应端⼝的⽬的。以本⽂的需求为例,假如我在树莓派的 5000 端⼝上挂载了⼀个⽹页服务,想通过公⽹访问,则可以将树莓派的 5000 端⼝映射到公⽹服务器的 6000 端⼝,然后访问公⽹服务器的6000端⼝即可访问⽹页,其他的可以⼀⼀映射,如5100到6001,5200到6002,如下图所⽰

NAT 服务器稍有不同,即多了⼀层映射,需要将 NAT 服务器的内⽹端⼝映射到公⽹端⼝上,假设需求和上图相同,则需要将树莓派的 5000、 5100 和 5200 端⼝映射到 NAT 服务器的 6000 、 6001 、 6002

端⼝上,数据沟通端⼝则填写 37000 ⽽不是 7000 ,然后⽤户通过访问36000 、 36001 和 36002 可获得相同效果,如下图所⽰

那么下⾯进⼊部署阶段

FRP

⼀个由 go 语⾔实现的内⽹穿透⼯具,优点是下载即⽤,不需要安装,可以在不同服务器间拷贝,直接运⾏即可,缺点是官⽅提供的 WebUI ⾮常鸡肋,可以直接忽略,本⽂使⽤的是 0.34.1 版本

/fatedier/frp

普通服务器

Server端

笔者⼀般先部署 Server 端,因为调试逻辑会更加简单,⾸先去官⽹下载 Release 包,注意区别服务器系统版本,解压压缩包之后给予 frps ⽂件执⾏的权限,当然最简单的⽅式就是整个⽬录递归赋予777权限(笔者通过 WinSCP 操作的),然后修改frps.ini,笔者使⽤的设置为

[common]

bind_port = 7000

kcp_bind_port = 7000

token =服务器间通信密码

dashboard_port = 7001

dashboard_user =⽤户名

dashboard_pwd = WebUI密码

log_file = /root/log/frps.log

log_level = info

log_max_days = 7

其中含有 dashboard 的⼏个变量都是和 WebUI 相关的,不使⽤该功能的话可以直接删掉,然后切换到⽬录下运⾏看是否报错(记得先创建log ⽂件夹,不知道为什么这些软件连创建⽂件夹都不会),如果未正常开启可以在 log ⽂件中查看⽇志并修正

./frps -c ./frps.ini

Client端

解压后修改配置⽂件frpc.ini,注意和上⾯的区别,别修改或运⾏错了

[common]

server_addr =服务器ip

server_port = 7000

token =服务器间通信密码

protocol = kcp

log_file = /root/log/frpc.log

log_level = info

log_max_days = 7

[ssh]

type = tcp

local_ip = 127.0.0.1

local_port = 22

remote_port = 6000

[web]

type = tcp

local_ip = 127.0.0.1

local_port = 80

remote_port = 6001

将服务器 ip 和密码设置好后就可以运⾏了,如果使⽤的是 kcp 协议,需要放⾏通信端⼝(如上⽂中的

7000 端⼝)的 udp 协议,也可以使⽤默认的 tcp 协议,下⽅模块的 type 中的协议不需要更改,更多协议可以参考官⽅⽂档

./frpc -c ./frpc.ini

这时建议先两边都⽤ ssh 客户端直接运⾏命令开启服务并验证是否可以连通,如果⼀切正常再使⽤其他⽅式后台运⾏,如果⽆法连接,下⾯列出了⼏个常见的解决思路

1、查看 log ⽇志的报错信息,其中 log ⽇志所在的⽬录需要提前创建,然后根据错误信息来排查问题

2、查看是否端⼝已经被占⽤ netstat -lnp|grep 端⼝号

3、查看两侧防⽕墙是否均放⾏所有相应的端⼝的 tcp 协议,其中 kcp 需要放⾏沟通端⼝(如上⽂中的7000)的 tcp + udp 协议

4、从外部查看端⼝是否开放(测服务器的),需要开启服务后即有程序监听端⼝后查看, /tool/port

5、frpc.ini 配置⽂件⾥⾯的模块是否重名,可能因为复制粘贴忘记修改⽽重名以⾄⽆法开启服务

NAT服务器

Server端

和上⾯完全相同,如果是⼿动开启映射的服务器,记得在使⽤ kcp 协议的时候,增加⼀条 udp 的映射

Client端

稍有不同的是需要将 server_port 改为映射后的端⼝,如上图中的 37000 ,server_addr 实测⽀持填写域名

NPS

⼀个同样由 go 实现的内⽹穿透⼯具,但官⽅提供了更好的 WebUI ,并且可以直接操作 Server 端就能完成映射,在增减映射的时候不⽤重启服务,避免了想重启服务但关闭服务导致 ssh 掉线然后服务⽆法开启因此失联的尴尬局⾯,当然,为了更保险起见,笔者同时开了 FRP 和 NPS 服务,防⽌掉线后⽆法重连的尴尬,当然,后⾯加⼊了 ZeroTier  实现了三重保险,本⽂使⽤的是 0.26.9 版本

/ehang-io/nps

普通服务器

Server端

下载Release包,解压然后进⼊⽬录,安装

./nps install

默认情况下,服务会安装到  /etc/nps  ⽂件夹中,编辑配置⽂件  /etc/nps/f

⼀般情况下修改这四⾏内容即可

http_proxy_port=未被占⽤的端⼝

https_proxy_port=未被占⽤的端⼝

web_username=⽤户名

web_password=密码

因为很可能服务器的80和443端⼝已经⽤来开启其他服务⽐如被 Nginx 监听了,所以直接运⾏会报错,因此需要修改成未被占⽤的端⼝,并填写后台管理⽤的⽤户名和密码,在放⾏ 8080 端⼝后开启服务就可以访问到后台了

nps start

点击客户端 - 新增 - 新增使⽤默认配置新增⼀个服务器,可以⾃⾏选择是否加密和压缩,然后点击隧道 - 新增新增⼀个映射,以上图为例,则服务器端⼝填写 6000 ,⽬标 (IP:端⼝)  填写路由器下内⽹:5000或者127.0.0.1:5000

然后返回客户端列表点击服务器左侧加号,可以得到⼀条如下所⽰的客户端命令,复制后配置客户端时使⽤,记得放⾏防⽕墙端⼝

./npc -server=服务器IP:端⼝(默认8024) -vkey=⾃动⽣成的密钥 -type=tcp

如果需要修改默认端⼝ 8024 ,可以修改  bridge_port  后重启⽣效(理论上,笔者未测试),卸载可以执⾏  nps uninstall  后通过whereis nps  找到残留⽂件删除即可

Client端

⾸先防⽕墙放⾏相应端⼝,然后解压压缩包然后进⼊⽬录并执⾏上⾯复制的客户端命令,理论上,刷新后台即可看到客户端状态均变为绿⾊,因为是直接⽤ ssh 执⾏的命令,因此如果未正常连接,可以通过⽇志来查错和修正,基本的排查错误的思路和 FRP 相同

NAT服务器

Server端

和上⾯完全相同

Client端

稍有不同的是需要将客户端命令改为映射后的端⼝,如上图中的 37000 ,服务器IP  实测⽀持填写域名

ZeroTier

如果阅读了上⾯两个⼯具的 Github 页⾯或者官⽅⽂档,就会发现,⾥⾯都提到了⼀个 P2P 的连接⽅式,但是笔者尝试后会发现存在诸多问题且很多时候⽆法连接,官⽅也表名并不稳定,那么,有没有⼀个专门做 P2P 连接的⼯具呢,这个就是了,⼀个使⽤ CPP 和 C 实现的内⽹穿透⼯具,并且组建的是局域⽹,本⽂使⽤的是 1.4.6 版本

/zerotier/ZeroTierOne

Leaf 节点(叶⼦节点)

这⾥⾯的概念发⽣了⼀些变化,因为这个的⽬的是将所有⽤户连接起来形成⼀个局域⽹,因此所有⽤户都是平等的,也就没有服务端和客户端的区别了,增加⼀个⽤户相当于增加了⼀个 Leaf 节点,可以

使⽤⼀键安装包, Windows ⽤户去下载 exe ⽂件安装即可,如果 debian 系统下提⽰没有 sudo 同时已经在 root ⽤户下,去掉 sudo 即可

curl -s | sudo bash

如果安装时提⽰  NO_PUBKEY 1657198823E52A61  ,则需要添加公钥,这种情况⼀般是使⽤了第三⽅的镜像导致的,⽐如清华源、阿⾥源

apt-key adv --keyserver --recv-keys 1657198823E52A61

安装完后就可以通过  zerotier-cli  配置服务器了,⾸先,开启服务并设置开机⾃启

systemctl start zerotier-one

systemctl enable zerotier-one

打开官⽹创建账号然后新增⽹络

/network

然后获得⼀个  Network ID  ,所有节点加⼊⽹络都使⽤相同的命令,Windows 下就使⽤管理员权限的

CMD 来执⾏

zerotier-cli join ID

如果成功则会返回

200join success

然后打开防⽕墙 9993 的 udp 协议,Windows 下⾃动打开了,⽆需⼿动操作

然后在官⽹中打开该⽹络的设置页⾯,在  Members  中就会多出⼀个成员,即 Leaf 节点,左侧打钩即可同意加⼊⽹络,同时会显⽰版本号和公⽹ IP 并分配⼀个内⽹ IP ,当有超过两个节点之后,就可以通过内⽹IP  Managed IPs  相互连通了,这个页⾯似乎是会进⾏ ajax 刷新的,所以不需要⼿动刷新

Moon节点(⽉亮节点)

但如果连接国外 Planet 节点(⾏星节点)的效果不够好怎么办,可以⾃⾏搭建 Moon 节点当中转站,⾸先,将 Moon 节点按上⾯⽅法加⼊⽹络并授权,然后新增 Moon 配置

cd /var/lib/zerotier-one

zerotier-idtool initmoon identity.public > moon.json

修改配置⽂件  moon.json  ,在括号内填⼊服务器的公⽹ IP 和端⼝,注意需要双引号,同时复制ID,位于  ["id": "18fasd2319"] 内,后⾯让其他 Leaf 节点加⼊时使⽤

"stableEndpoints": ["公⽹IP/9993"]

在该⽬录下⽣成 Moon ⽂件,⽂件名类似于

zerotier-idtool genmoon moon.json

新增 moons.d ⽂件夹,即  /var/lib/zerotier-one/moons.d/  ,将 ⽂件移⼊,然后重启服务

systemctl restart zerotier-one

其他节点绑定 moon 节点的⽅式都是输⼊以下命令, ID 需要改为上⾯复制的 ID

zerotier-cli orbit 18fasd231918fasd2319

重启服务后查看是否添加成功

zerotier-cli listpeers

zerotier-cli listmoons

listpeers 列出了局域⽹内所有的节点,包括官⽅的⾏星中转节点 Planet 、所有⽤户的叶⼦节点 Leaf 以及⾃建的⽉亮中转节点 Moon ,⼀⾏为⼀个节点,如果没有看到 Moon 节点则添加失败, listmoons 如果返回为空则失败

当然 Linux 下可以新建⽬录  /var/lib/zerotier-one/moons.d/  ,然后复制⽣成的 moon ⽂件到⽂件夹下,重启服务后查看是否⽣效

Windows下的默认⽬录在  C:\ProgramData\ZeroTier\One\moons.d\  ,新建该⽂件夹然后复制进去,重启(停⽌然后启动)服务(打开开始菜单然后搜索服务即可找到)即可,如果执⾏ zerotier-cli 的命令时出现missing authentication token,则需要⽤管理员⾝份启动 CMD ,如果出现了服务不正常的情况,⽐如右键状态栏中图标发现没有节点,可以尝试⼿动重启服务或重启电脑

两个 Leaf 节点如果打通则通过 9993 端⼝的 UDP 协议连接,速度取决于两端的带宽和延时,与中转节点⽆关,如果两个 Leaf 节点之间未能成功打通,则会⾛服务器中转

NAT服务器对⽐

⽆论如何都要选择 KVM 架构的服务器,⼀般都有标明的,这个可玩性才⾼,⼀般情况下价格也不会⾼很多

CloudIPLC

/

需要实名认证,仅能开启⼀个服务器,电信移动联通均有,最便宜的 1C+384M+4G+600G ,价格为30元⼀个⽉,这个⼤⼩的内存如果重装纯净版,仅能安装 Debian9 , CentOS 和 Debian10 都是装不上的,512M 的内存可以装 Debian10 ,具体的重装教程请阅读下⼀篇⽂章

需要⼿动映射内⽹端⼝到公⽹端⼝上,TCP和UDP分开映射,考虑 ssh 端⼝占⽤⼀条,则可以配置额外⼗条映射规则

如果使⽤ FRP 的 KCP 模式,通信端⼝占⽤ TCP + UDP 两条映射规则,则可以映射 8 个额外的端⼝

如果使⽤ NPS ,通信和 WebUI 占⽤两个端⼝,同样有额外 8 个端⼝可⽤,如果使⽤纯⽂本配置,则多⼀个,但是会⿇烦很多,⽤ NPS 就是看上了他的 WebUI

如果使⽤ ZeroTier,emmmmmm,为什么要为⼀个中转功能开⼀个 NAT 服务器啊淦,随便开个普通的服务器就好了,或者直接⽤官⽅的节点

不过不太能够理解的是,因为不明原因,在穿透可道云的时候,加载含⼤⽂件的⽂件夹时百分百会出现  Ajax Error ,且⽆法打开  AriaNG,在重装清华源 Debian9 、开启 BBR 、检查 MTU 、⼿动部署 Nginx-1.14.2 、⼿动部署 PHP7.3-FPM 、提⾼所有超时和⼤⼩限制、开启UDP 之后问题依旧,服务器提供商表⽰问题你们⾃⼰解决,可道云开发者表⽰不关我事,遂放弃。不过在下载时,速度⽐较稳定,能长期维持 5MB/s 的速度,因为百兆是进出⼝带宽,在中转的时候同时进出,所以满速就是 5MB/s 左右,如果有 dalao 能解决上述问题,欢迎评论区留⾔和讨论

OLVPS

/

不需要实名认证,能开启多个服务器,电信移动联通均有,最便宜的仅有 256M 内存,考虑到上⾯的经历,尝试了下 512M 内存的服务器,价格稍贵,读者可以尝试更便宜的那⼀款,进去后成功重装清华源的 Debian10

固定开启⼀个端⼝段,需要在使⽤的时候将端⼝改到相应的端⼝段内,不过好处是 TCP 和 UDP 可以同时开启,直接在防⽕墙上放⾏即可,因此最多有 10 个端⼝(相当于20 条映射规则)

测试可道云穿透和 AriaNG 穿透均正常,不过速度不是很稳定,经常会掉到⼏百 K ,在开启 BBR 之后情况依旧,那么,有什么理由让我不使⽤ ZeroTier 呢

更多推荐

服务器,服务,节点,需要,映射


一、Zerotier 原理

1665711994820.png

关于 zerotier,搜集网上资料和个人一点浅薄的理解。

概念

  1. planet:核心角色,官方不允许自建私有,zerotier 的行星服务器,用于管理全球所有的 zerotier 客户端的地址信息,帮助建立客户端间的直接链接,以及在无法建立直接链接时,作为中继服务器转发设备间的流量。

  2. moon:官方允许自建私有,作为离客户端更近的中继服务器存在,可以使转发的效率更高。

原理

  1. 客户端注册

在内网机器上启动一个 zerotier 客户端,使用 join 加入一个网络,在控制台对客户端进行授权,此时 planet 上有如下记录:

10.0.0.1 - 150.0.0.1/15679
10.0.0.2 - 160.0.0.1/22226
  1. 尝试 p2p 连接

当在 10.0.0.1 机器上访问 10.0.0.2,内网机器向 planet 查询到目标地址的公网 160.0.0.1,端口为 22226。

10.0.0.1 尝试与 160.0.0.1的 22226 端口进行直接数据交互,这个过程称为 udp 打洞实现 p2p 直连。

  1. planet 转发

由于各种网络限制,p2p 不能直连。

此时通过 planet 转发,如果还配置了 moon 节点,此时会通过速度快的 moon 节点进行转发。

如上图则大概率从上海的 moon 节点进行数据转发,此时网络取决于 moon 的带宽。

二、私有 zerotier-planet 的优势

  • 解除官方的设备连接数限制

  • 提升手机客户端连接的稳定性

三、搭建私有 planet

了解了 zerotier 的概念原理,那么大概了解搭建私有 planet 的重要性。

1、运行控制器容器

docker run -d \
--name zt-ui \
-v /home/docker/zt-ui/zerotier-one:/var/lib/zerotier-one \
-v /home/docker/zt-ui/ztncui/etc:/opt/key-networks/ztncui/etc \
-p 4000:4000 \
-p 9993:9993 \
-p 9993:9993/udp \
-e MYADDR=1.1.1.1 \
-e HTTP_PORT=4000 \
-e HTTP_ALL_INTERFACES=yes \
-e ZTNCUI_PASSWD=admin123 \
--restart=always \
hausen1012/ztncui

这里需要注意的是传参需要将 1.1.1.1 修改为公网 ip。

2、生成 planet 文件

docker exec -it zt-ui bash /tmp/patch.sh && \
docker restart zt-ui

如果 linux 内核版本太低,可能报错 FATAL: kernel too old,那么需要升级内核。

关于升级内核,可以参考这篇文章 Linux 系统内核升级

当然,如果你觉得云服务器不太方便升级内核,那么完全可以用一台测试的虚拟机进行生成文件,文件生成后用 ftp 上传到 /home/docker/zt-planet 目录,然后再启动容器。

3、测试

docker exec -it zt-ui zerotier-cli listmoons
# 显示如下内容则表示搭建成功
[
 {
  "id": "00000004e3b1b4b0",
  "roots": [
   {
    "identity": "04e3b1b4b0:0:ea0c548b45efcc701c052305f06568c749a4647b9a5b111e2b372c05f7c3ed56ae1009c29cb1aa51d95057bf1b65b3a2f7b01d129437f6b72efd08f68281fb52",
    "stableEndpoints": [
     "1.1.1.1/9993"
    ]
   }
  ],
  "signature": "b4f539ef93e198203d9e270c155d091769408ff98489d83bcf6444d2a95112ca7369138b98d42512caa3c878f3eff2c27ecada28f549ea19e3a407e71bbeb008d51f6ba92af17e8b6e4c1b8eacbd4abc42f0f639746ea924cffb99b539f94e2b",
  "timestamp": 1665642068786,
  "updatesMustBeSignedBy": "7fcb120079801a1ddde8c1fb6657365351bca7279e8470728f4cf01fb5efc81b57cde03338b4ea76dfd39570f74f2654d8d52a22613e77ed2e4cbb46a648a42d",
  "waiting": false
 }
]

1.1.1.1 为公网 ip 则搭建 planet 成功。

四、创建私有网络

访问 http://公网ip:4000,账号密码:admin/admin123。

1、创建网络

1665677264789.png

2、初始化网络

点击 Easy setup

1665677326694.png

设置网段和子网掩码

1665677383128.png

五、安装 zerotier 客户端

docker 安装

既然已经搭建了私有的 planet,当然是使用自己的,需要先下载服务器 /home/docker/zt-planet/zerotier-one 目录下的 planet 文件。

1、启动 zerotier 客户端

docker run -d \
--name=zt-cli \
--device=/dev/net/tun \
--net=host \
--cap-add=NET_ADMIN \
--cap-add=SYS_ADMIN -d \
-v /home/docker/zt-client/zerotier-one:/var/lib/zerotier-one \
--restart unless-stopped \
hausen1012/zerotier

2、替换 planet 文件

将服务器下载的 planet 文件上传到客户端的 /home/docker/zt-client/zerotier-one 目录。

3、重启客户端

docker restart zt-cli

4、查看 planet

docker exec -it zt-cli zerotier-cli listpeers

1665675010184.png

可以看见 stableEndpoints 的配置是自己的公网 ip。

5、加入网络

docker exec -it zt-cli zerotier-cli join 8b8b9ed58a10bd45

6、授权

1665677970480.png

ip 也可以自己设置,不过要在刚刚设置的网段内。

1665678246335.png

windows 安装

1、下载客户端

下载地址

2、安装客户端

双击安装即可

3、替换 planet

将下载好的 planet 文件复制到 C:\ProgramData\ZeroTier\One 目录下

4、重启服务

如果仅仅只是重启 ui 是不行的,需要找到任务管理器 -> 服务 -> ZeroTierOneService,进行重启。

1665726393553.png

5、查看 planet

1665726530197.png

可以看见 planet 地址是自己的公网。

6、加入网络

点击右下角图标,join new network,输入刚刚创建的虚拟网络 id,我这边是 8b8b9ed58a0baa3d。

7、授权

和 dokcer 安装一样的操作,不再赘述。

六、测试

通过上述方式将两台机器加入到网络,通过 ping 查看是否能打洞成功。其中 202 本地虚拟机,vps 是有公网 ip 的云服务器。

1665710086842.png

ping 检测

在 10.0.0.202 机器上 ping 10.0.0.222。

1665727979834.png

listpeers 查看到只有自己的私有根服务器,ping 的延迟不到 100ms 和直接 ping 公网 ip 差不多,说明打洞成功。

局域网 scp 检测

1665679296983.png

可以看见速度能达到十几MB,而我的根服务器是腾讯云的 8Mbps 服务器,如果通过根服务器转发肯定不可能达到这个速度,说明打洞成功。

speedtest 测速

1665740929613.png

发布于 2022-10-14 22:59

局域网

内网穿透

NAT网络地址转换协议

赞同 1224 条评论

分享

喜欢收藏申请转载

写下你的评论...


24 条评论

默认

最新

大世界小师

大世界小师

有没有办法修改9993端口呀,我用的FRP,想把本地的9993转发到公网的其他端口

09-29 · IP 属地浙江

回复喜欢

佐蓝

佐蓝

ZT_ADDR=localhost:9995

昨天 09:25 · IP 属地江苏

回复1

阿蛮君

阿蛮君

作者

这个没试过诶,建议直接上headscale[大笑]

09-30 · IP 属地广东

回复1

颹椲

颹椲

你好,已经按大佬的布置成功了,想咨询一下,我通过在openwrt路由器上安装zerotier让路由器能加入到自建内网当中来,想开启路由的nat模式。让路由器下面的也能够到内网当中,在服务器端应该怎么设置呀

07-18 · IP 属地四川

回复喜欢

阿蛮君

阿蛮君

作者

颹椲

这个我也不是很清楚,我现在还headscale了,方便迁移。headscale用命令可以很方便看是直连还是中转

08-11 · IP 属地广东

回复喜欢

颹椲

颹椲

阿蛮君

嗷嗷嗷,谢谢!现在是自建了planet服务器,双方一方是有公网IP是的联通一方是公网IP v6的移动,路由表net也设置成功了,延迟也基本上60ms以内,但是用iperf测出来穿透的速率始终不理想,想知道到底是因为中转的问题还是说运营商qos了([爱]

08-10 · IP 属地四川

回复喜欢

展开其他 1 条回复

阿蛮君

阿蛮君

作者

zero只能使用ip,换机器会比较麻烦,headscale可以使用域名,且打洞更加稳定,教程在这:amjun.com/1957.html

07-05 · IP 属地广东

回复喜欢

脑阔有点痛

脑阔有点痛

请问一下为啥我添加routes还是不行呀?我想的是内网一台加入zerotier网络完后负责转发内网流量。

06-24 · IP 属地四川

回复喜欢

阿蛮君

阿蛮君

作者

可能你可能添加的路由有问题,参考我博客另外一篇文章。

06-25 · IP 属地广东

回复喜欢

3584SP

3584SP

可以支持多个plant吗,我的服务器在国外,有时候也会连不上,想多搞几个plant当备用[捂脸]

06-17 · IP 属地上海

回复喜欢

枫叶果冻

枫叶果冻

请问第一步的1.1.1.1那里可以用域名吗?我的公网IP是变动的

05-20 · IP 属地湖南

回复喜欢

阿蛮君

阿蛮君

作者

目前好像是不行的

05-21 · IP 属地广东

回复喜欢

sjfuxhebdudn

sjfuxhebdudn

请教下,自建plant以后,苹果跟安卓手机能加进来吗

03-31 · IP 属地云南

回复喜欢

阿蛮君

阿蛮君

作者

苹果没试过,安卓肯定可以

03-31 · IP 属地广东

回复喜欢

风钥

风钥

我搭建好了。但是我不是mc那种,我想玩的游戏时深岩银河,需要官方服务器握手才行。请问怎么可以在游戏里联机?


03-30 · IP 属地安徽

回复喜欢

BlacKucha

BlacKucha

纯小白 其他都弄好了 就差这一步生成 planet 文件 该嗯么办呀楼主

2022-12-08 · IP 属地北京

回复喜欢

初心

初心

阿蛮君

为什么我根服务器搭建好了,两台客户端机子也加入网络建立连接了,这时把根服务器断开网络,然后两台客户端机子的连接也中断了。按理说两台客户端机子建立的p2p连接,服务器断开不会影响已经建立好的p2p呀。难道说不是建立的P2P连接?

03-29 · IP 属地广东

回复喜欢

初心

初心

阿蛮君

第二步这里是生成planet,上一步是运行容器,那么搭建呢?

03-28 · IP 属地广东

回复喜欢

展开其他 2 条回复

cc7ing

cc7ing

请问planet可以relay吗?是不是自建planet就不需要moon了?

2022-11-15 · IP 属地北京

回复喜欢

阿蛮君

阿蛮君

作者

对的

2022-11-15 · IP 属地广东


使用局域网ip访问局域网,支持P2P和流量转发。

1. 需求与调研

作为学生党,在教研室使用GPU服务器办公很方便,特别是采用Docker虚拟化方案后,虚拟机一样的使用体验,自己的电脑只用来敲代码,实验就在服务器上运行,十分方便。

gezp:基于Docker的GPU服务器桌面虚拟化33 赞同 · 32 评论文章

在教研室时使用体验还好,但如果在宿舍中想访问服务器,比如,看一下实验进度,那就没办法了,因为教研室属于内网(某些教研室可能具有固定的公网IP,那就无需考虑这些东西),由于NAT的存在,无法直接访问。那么有什么技术可以在访问内网呢?答案是有的,那就是内网穿透技术。在没有公网IP的情况下,目前主流的内网穿透方案有如下两种:

  • 端口流量转发:Frp转发,花生壳等

  • 虚拟局域网:Zerotier,N2N等

Frp是一款非常好用的内网穿透软件,非常稳定,但是Frp的有两个问题,(1)只能提供端口级别的内网穿透,如果只需要服务固定端口,比如22端口的SSH,还是很好用了,但是如果需要访问其它端口,需要独立映射。(2)需要云服务器来实现流量转发,而高带宽的云服务器价格较贵,花生壳提供类似的商业服务,不过对于学生党,白嫖才是王道,怎么便宜怎么来。

Zerotier采用另一种策略,每台机器上安装一个虚拟网卡,实现虚拟局域网,这样处于公网中的机器也能够像在局域网中一样访问服务器,十分方便,并且它支持P2P,即便没有私有云服务器,也能够进行内网穿透,Zerotier是由一款商业公司维护的软件,技术方面的可靠性还是不错的。当然,Zerotier也有它的问题(1)某些网络环境无法实现P2P穿透,这种情况,Zerotier就会采用流量转发,但是Zerotier的服务器在国外,且有带宽限制,会导致连接速度慢,甚至无法连接。(2)每台主机需要安装额外的客户端。这样扩展不方便,如果多台服务器,每一台服务器都需要安装一遍。

Zerotier具有一定局限性,并不是任何网络环境下都能进行P2P,比如我使用宿舍Wifi就能P2P访问教研室主机,但是使用手机4G网络就不行。

Frp和Zerotier有各自适用情况

  • Frp适合有云服务器,低带宽需求,只需要固定端口服务(如SSH,FTP等)的用户。

  • Zerotier适合高带宽(如远程桌面,需要支持P2P)需求,需要灵活访问(端口服务较多,或者不固定)的用户。

目前看来,Zerotier更符合我的需求,只是能不能通过一些技术手段,解决Zerotier的局限性呢?这样就能完美符合需求了。

  • 如何在Zerotier不支持P2P时,采用自己的私有服务器,进行流量转发?保证Zerotier在任何情况可用(至少可以采用私有云服务进行流量转发),以此保证Zerotier的网络稳定性。

  • 如何避免为每一台主机安装Zerotier?否则,每增加一台主机,就需要安装Zerotier。(如果路由器能安装Zerotier就好了,不过我们教研室的普通路由器,不支持扩展)

Zerotier 优先使用P2P,当无法进行P2P时,Zerotier控制器会进行流量转发,但由于Zerotier 服务器在国外,流量转发速率慢,可使用moon加速转发,但是moon配置繁琐,不方便使用,而且moon将会被官方弃用,正在开发的zerotier2.0版本将会迎来更好的流量转发功能(可以期待zerotier后续开发)

2. 基本网路架构

如何避免为每一台主机安装Zerotier?

  • 虽然我的路由器不支持安装Zerotier,但是我可以在一台主机上安装Zerotier,然后把这台主机当作路由器,实现路由转发,不就行了。

Zerotier支持设置静态路由表,这个是解决问题的关键。

利用zerotier内网穿透能力及静态路由,可以方便建立起虚拟局域网,方便客户机访问局域网中的主机。路由示意图如下:

图示解释:
(1)绿色区域代表局域网,工作主机都位于局域网内。
(2)局域网中只有一个主机安装zerotier,并加入zerotier虚拟局域网中,作为LAN中心主机(主机3,充当路由器作用)。
(3)客户机都安装了zerotier,并加入zerotier虚拟局域网中。
(4)箭头代表一条路由示例(详见路由案例)

该网络的5个网段(各个网段需要保证不同):

  • 1个局域网段:主机所在网段。

  • 1个zerotier网段:在zerotier控制器界面设置静态路由表,该路由表会自动下发到每一个zerotier终端机器。

  • 3个docker网段:本机可以路由到docker网段。

主机3的作用:

  • 将主机3作为局域网路由主机,通过开启路由转发以及设置静态路由表,提供路由功能,这样zerotier网段中的机器就能路由到局域网中的机器了。

  • 也就是说客户机将主机3作为跳板访问到其所在的局域网LAN Net.

该方案的优点:

  • 扩展方便:避免了每一台主机都需要安装zerotier的麻烦,只需要一台主机安装zerotier即可(主机3),也就是说局域网新增加一台主机,只需要在zerotier管理器中增加静态路由表即可。

  • IP一致性:无论在局域网内外,都使用局域网的ip访问主机。

局限性:
(1)对网段有要求,要求所有网段不能相同(如果客户机在外网,网段不能和主机局域网网段相同)。
(2)当前方案只提供单向访问能力。比如客户机2可以访问主机1和主机2,但是主机1和主机2不能访问到客户机2。(不过,从另一个角度来说,我们也只需要这种单向访问能力)

客户机1案例

这是最简单的案例,如果客户机位于局域网LAN Net内,可直接通过局域网IP访问主机。客户机1访问主机1,使用192.168.0.105访问主机1,路由路径如下:

  • 192.168.0.118(客户机1) -> 192.168.0.105(主机1)

客户机2案例

将主机3作为跳板,访问局域网LAN中的机器。客户机2访问主机1,使用192.168.0.105访问主机1,路由路径如下:

  • 192.168.192.11(客户机2) -> 192.168.192.7 / 192.168.0.107(主机3) -> 192.168.0.105(主机1)

192.168.192.11(客户机2)-> 192.168.192.7 这段路由是根据zerotier静态路由表确定的。这段的路由为P2P模式,实际上会更加复杂一些。

3. 扩展网路架构

如何在Zerotier不支持P2P时,采用自己的私有服务器,进行流量转发?

  • 还是上面的思路,采用路由转发,首先本机添加静态路由表,访问局域网IP时,转发到VPS上,然后由VPS转发到局域网中的主机上。

扩展的网络路由图如下:

VPS的作用

  • VPS安装zerotier,并加入zerotier虚拟局域网中,用于流量中继。采用路由转发方案,即使用VPS作为跳板访问到主机3,进而使用主机3作为跳板访问到局域网LAN Net.

  • 由于VPS是公共主机,VPS几乎可以与zerotier网段中的任意机器进行P2P通信。

Tip: 这里使用路由转发,实现中继功能。

客户机3案例

如果客户机与主机3在zerotier网络中不支持P2P,利用VPS主机作为跳板,访问局域网LAN中的机器。客户机3访问主机1,使用192.168.0.105访问主机1,路由路径如下:

  • 192.168.192.11(客户机3) -> 192.168.192.3(VPS)-> 192.168.192.7 / 192.168.0.107(主机3) -> 192.168.0.105(主机1)

(1)192.168.192.11(客户机3) -> 192.168.192.3(VPS)这段路由是根据客户机3中的静态路由表确定的。
(2)192.168.192.3(VPS)-> 192.168.192.7 这段路由是根据zerotier静态路由表确定的。

客户机3案例2

如果对于客户机3,设置了静态路由表之后,移动到客户机2的网络环境中去,那么此时,就会存在两个到192.168.0.0/24的路由,移动到客户机1的网络环境中,甚至会有3个路由。

  • 192.168.0.0/24 -> 192.168.192.7 : 由zerotier自动生成 (根据zerotier控制器中的静态路由设置)。

  • 192.168.0.0/24 -> 192.168.192.3 : 客户机3静态路由表。

这时候存在选择路由的问题,理论上应该优先选择192.168.0.0/24 -> 192.168.192.7这条P2P的路由,只有不能进行P2P时,才选择 192.168.0.0/24 -> 192.168.192.3这条路由进行VPS转发。

  • 使用跃点数实现,设置静态路由表时,将 192.168.0.0/24 -> 192.168.192.3的跃点数设置非常大(例如9000),这样优先级最低。

访问方式优先级

综上,通过zerotier+静态路由表,实现了客户机可以在任意地方访问到主机1

  • 优先选择局域网直连

  • 次优先选择P2P zerotier连接

  • 最后选择VPS中转连接

除此之外,访问docker网段类似,不再详述,需要注意的一点,需要保证各个网段不同。

4. zerotier虚拟局域网配置

zerotier配置

安装zerotier(linux)

  • 客户机,路由主机(主机3),VPS(可选),需要安装zerotier,并加入网络

curl -s https://install.zerotier.com | sudo -E bash
sudo zerotier-cli join xxxxxxxxxxxxxxx

zerotier控制器静态路由配置

  • 登录my.zerotier.com/

  • 局域网路由和docker网络路由,目的ip都为路由主机(主机3)的zerotier ip

路由主机(主机3)配置

开启路由转发

#临时生效echo "1" > /proc/sys/net/ipv4/ip_forward#永久生效,需要修改sysctl.conf,然后执行sysctl -pnet.ipv4.ip_forward = 1

防火墙设置

sudo iptables -A FORWARD -i zt3jn72ets -j ACCEPT
sudo iptables -A FORWARD -o zt3jn72ets -j ACCEPT
sudo iptables -t nat -A POSTROUTING  ! -o lo -j MASQUERADE#这里zt3jn72ets为zerotier虚拟网卡#保存iptable规则#sudo apt-get install iptables-persistent#sudo sh -c "iptables-save > /etc/iptables/rules.v4"

docker网络路由

#添加静态路由表,docker网络ip段需要不同,指向docker宿主机ip.#临时方法sudo ip route add 172.21.0.0/16 via 192.168.0.106
sudo ip route add 172.22.0.0/16 via 192.168.0.105#sudo ip route del 172.17.0.0/16 #删除路由

不同主机docker配置

为每一台主机修改默认docker桥接网(或创建新的网络),子网不能重复,避免路由冲突

#修改默认docker0的ip,不同主机需要不一样vim /etc/docker/daemon.json#"bip": "172.21.0.1/16"sudo systemctl daemon-reload
sudo systemctl restart docker#或者使用新的网桥#docker network create --driver bridge --subnet=172.20.1.0/24 dockerlan1

此时,在客户机上就可以访问每一台主机和docker了。

ping 192.168.0.106#可以观察TTL的值,就可以知道是哪一种方式了,TTL=64表示直连,每减小1,表示经过一层路由。

5. 扩展操作

VPS路由转发配置(可选)

云服务器配置(防火墙设置)

sudo iptables -A FORWARD -i zt3jn72ets -j ACCEPT
sudo iptables -A FORWARD -o zt3jn72ets -j ACCEPT
sudo iptables -t nat -A POSTROUTING  ! -o lo -j MASQUERADE#这里zt3jn72ets为zerotier虚拟网卡#保存iptable规则#sudo apt-get install iptables-persistent#sudo sh -c "iptables-save > /etc/iptables/rules.v4"
对于云主机,如果zerotier网络较慢,可能需要手动设置服务商提供的防火墙,打开所有UDP端口。

客户机路由配置(win10)

#win10 powershell(管理员),目标ip为VPS的zerotier ip.route add 192.168.0.0 mask 255.255.255.0 -p 192.168.192.3 METRIC 9000#route delete 192.168.0.0 #route PRINT

Frp端口转发(可选)

为中心主机增加frp路由转发功能,确保即使在zerotier完全失效的情况下,也可以外网访问中心主机的ssh等服务。 配置文件 frpc.ini

# frpc.ini[common]server_addr = xx.xx.xx.xxserver_port = 7700token = xxxxxxxxxxx[ssh]type = tcplocal_ip = 127.0.0.1local_port = 22remote_port = 13022[nomachine]type = tcplocal_ip = 127.0.0.1local_port = 4000remote_port = 13040

启动容器

docker run --restart=always --name gezp-frpc \       --network host -d \       -v ~/gezp/frp/frpc.ini:/etc/frp/frpc.ini \       snowdreamtech/frpc

6.写在最后

该方案其实并不复杂,仅仅是在使用zerotier的基础上,增加了几行路由,但使得内网穿透访问更加便利,特别是IP一致性的体验非常好,在局域网和在外网访问主机的IP都无需改变。

需要注意的是,必须保证在外网时,自己所处的IP网段与服务器的局域网IP网段不能一样


2021.11.15 更新:如果需要VPS中继功能,建议采用下一篇文章中的双zerotier网络方案

gezp:基于Zerotier的虚拟局域网(VPS中继优化)20 赞同 · 7 评论文章


编辑于 2021-11-15 20:39

穿透内网

VLAN

软路由

赞同 10130 条评论

分享

喜欢收藏申请转载

写下你的评论...


30 条评论

默认

最新

IT科技南

IT科技南

Zerotier这个到你这里有点被吹爆还不如国内的easynet, ,它本身致命缺点:无法跨运营商使用;就这一点注定就无法进行商业化的!

2021-06-25

回复1

gezp

gezp

作者

首先,这不是商业解决方案,学生党,所以要白嫖(狗头保命)。目前Zerotier P2P做的还可以,反正教研室和宿舍之间是支持P2P的(能跑满带宽,我宿舍50M带宽),然后使用VPS(阿里的,学生10块一个月,2M带宽),用来不支持P2P时(比如校外)用来作为流量转发(Zerotier免费的流量转发在国内完全不通),这基本上是最廉价的,并且保证稳定性的方案了。

2021-06-25

回复5

gezp

gezp

作者

纸鸢

目前是可以的(我教研室移动网,我学校电信网),和运营商无关,和NAT环境有关系,其实我感觉P2P,大家的技术差不多,难点在于NAT的限制,而且我认为zerotier技术算优秀的了,如果它不支持P2P的情况,大概率其他P2P软件也不支持,这时候只能走流量转发了,流量转发也就意味着按流量或带宽收费(个人观点)

2021-11-29

回复3

展开其他 2 条回复

东半岛的王德发

东半岛的王德发

别的都好说。。就是iptables那边不太会设置。。centos7应该怎么搞?

2022-05-15

回复1

gezp

gezp

作者

不是写了命令吗?[飙泪笑]

2022-05-16

回复喜欢

st1ll

st1ll

文章是好文章,就是对于非专业人士需要一点时间理解。[赞]

2022-03-22

回复喜欢

乌贼

乌贼

请问一下有没有主机1和2访问客户机2的方案呢?路由器是可以支持添加静态路由的。但我尝试把主机3添加到路由器的静态路由表,目标是Zerotier的网段,但并不成功

08-25

回复喜欢

乌贼

乌贼

gezp

太感谢作者给回复了[爱]我继续努力看看能不能解决这个问题

08-27

回复喜欢

gezp

gezp

作者

看样子好像没问题,用zerotier网段访问,可以用ping检查一下链路,看哪里断了[飙泪笑]

08-25

回复喜欢

txj

txj

sudo iptables -t nat -A POSTROUTING ! -o lo -j MASQUERADE

07-12

回复喜欢

萧鼓入梦

萧鼓入梦

请教下如果主机1.2.3都没有docker的情况下,在主机3使用虚拟网卡,去静态路由跳转应该也行吧?

06-26

回复喜欢

gezp

gezp

作者

应该是可以的,本质上就是静态路由的配置。

06-26

回复喜欢

祝麒麟

祝麒麟

我才发现,你说的是一种不存在的网站不存在的软件。。。

06-25

回复喜欢

biubiubiu

biubiubiu

打开所有UDP会不会有什么问题?

04-06

回复喜欢

biubiubiu

biubiubiu

怎么看云服务器有没有工作[爱]

03-29

回复喜欢

biubiubiu

biubiubiu

gezp

谢谢

03-30

回复喜欢

gezp

gezp

作者

ping的时候看ttl,每经过一次路由减一。

03-29

回复喜欢

月儿弯弯

月儿弯弯

你好 按你这个方案 主机3是win7转发不了啊 客户机2访问不了主机1和主机2

03-24

回复喜欢

gezp

gezp

作者

需要开启ipv4路由转发功能,win7不是很清楚怎么开启[思考]

03-24

回复喜欢

wenxin667

wenxin667

关于
2. 基本网路架构
如何避免为每一台主机安装Zerotier?
【客户机2案例】
客户机2经过主机3访问主机1的时候,主机3是如何做到转发数据的。
我看着 主机3并没有写啥规则啊~


难道是---》主机3的 zerotier ip 192.168.192.7 网卡接收到数据之后,会自动转发给 本机的物理ip 192.168.0.107 ?
就算是这样,那么 192.168.0.107 是如何做到转发给 192.168.0.105 的呢?



02-24

回复喜欢

gezp

gezp

作者

192.168.192.7/192.168.0.107是同一个物理主机的不同网卡而已,在这台主机上ping 192.168.0.105,肯定可以ping通,这条路径是通过路由器到192.168.105的。

02-24

回复1

zurica

zurica

难的的教程,把原理也讲了一遍。确定moon现在不好用了吗?

2021-08-06

回复喜欢

gezp

gezp

作者

moon可以用,但是用起来很麻烦,在下一代zerotier2.0, 官方都已经放弃了moon概念,不过zerotier2.0的发布估计还需要等很长一段时间。

2021-08-07

回复2

gezp

gezp

作者

Ampere King

官网blog,最早2019年就提出了,不过开发进度缓慢,近期有加快开发节奏,最新相关blog:zerotier.com/2021/08/04

2021-08-30

回复喜欢

展开其他 2 条回复

李DF

李DF

客户机2案例中 我能Ping通主机3的LAN IP ,但是Ping不通主机1的LAN IP 不知怎么回事?

2022-10-13

回复喜欢

gezp

gezp

作者

zerotier的静态路由配置了吗?

2022-10-13


1. 目录树及其每个子树的磁盘使用情况

1
2
3
4
5
6
7
8

KB 显示
du -k /home/linux
MB 显示
du -m /home/linux
GB显示
du -g /home/linux

常用命令 du -单位  目录

2 查看当前目录下所有目录以及子目录的大小

1
2
3

du -h .
“.”代表当前目录下。也可以换成一个明确的路径
-h表示用K、M、G的人性化形式显示

3 查看某个目录大小

1
2
3
4

du -sh 目录名称
-s表示总结的意思,即只列出一个总结的值
du -h --max-depth=0 user
--max-depth=n表示只深入到第n层目录,此处设置为0,即表示不深入到子目录。



4 列出etc目录及其子目录下所有目录和文件的大小

1
2
3

du -ah home

-a表示包括目录和文件

5 列出当前目录中的目录名不包括某个名称字符串的目录的大小

1

du -h --exclude='*test*'



6 通过一行输出目录下的信息

1
2

 du -0h home
-0(杠零)表示每列出一个目录的信息,不换行,而是直接输出下一个目录的信息。

7 常用命名汇总

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>] [--max-depth=<目录层数>][--help][--version][目录或文件]
常用参数:
-a或-all 为每个指定文件显示磁盘使用情况,或者为目录中每个文件显示各自磁盘使用情况。
-b或-bytes 显示目录或文件大小时,以byte为单位。
-c或–total 除了显示目录或文件的大小外,同时也显示所有目录或文件的总和。
-D或–dereference-args 显示指定符号连接的源文件大小。
-h或–human-readable 以K,M,G为单位,提高信息的可读性。
-H或–si 与-h参数相同,但是K,M,G是以1000为换算单位,而不是以1024为换算单位。
-k或–kilobytes 以1024 bytes为单位。
-l或–count-links 重复计算硬件连接的文件。
-L<符号连接>或–dereference<符号连接> 显示选项中所指定符号连接的源文件大小。
-m或–megabytes 以1MB为单位。
-s或–summarize 仅显示总计,即当前目录的大小。
-x或–one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-X<文件>或–exclude-from=<文件> 在<文件>指定目录或文件。
–exclude=<目录或文件> 略过指定的目录或文件。
–max-depth=<目录层数> 超过指定层数的目录后,予以忽略。
–help 显示帮助。
–version 显示版本信息。




在 Linux 系统中,磁盘空间管理是一项至关重要的任务。了解系统上各个文件和目录所占用的磁盘空间,能够帮助我们及时进行磁盘清理、规划存储空间以及避免系统因为磁盘空间不足而发生故障。本文将详细介绍 Linux 中两个常用的命令:df 和 du,它们是分析磁盘空间的利器。

什么是 df 命令?

df(磁盘空间使用情况)命令是一个用于显示 Linux 系统上文件系统的磁盘空间使用情况的实用工具。该命令提供了一个简洁的方式来查看磁盘分区或文件系统的总容量、已使用空间、可用空间以及文件系统挂载点等信息。

df 命令的基本语法如下:

df [选项] [文件|目录]

什么是 du 命令?

du(磁盘使用量)命令是一个用于计算指定文件或目录的磁盘使用量的工具。它可以递归地遍历指定目录下的所有文件和子目录,并计算它们的磁盘使用量。du 命令可以帮助我们快速了解文件和目录所占用的磁盘空间,方便进行磁盘清理或者查找磁盘空间占用较大的文件。

du 命令的基本语法如下:

du [选项] [文件|目录]

使用 df 命令分析磁盘空间

查看整个文件系统的磁盘空间

要查看整个文件系统的磁盘空间使用情况,可以直接运行 df 命令,不带任何参数:

df

该命令将显示所有已挂载的文件系统的相关信息,包括文件系统的挂载点、总容量、已使用空间、可用空间以及使用百分比。

显示指定目录的磁盘空间

如果只想查看特定目录所占用的磁盘空间,可以在 df 命令后面加上目录的路径作为参数:

df /path/to/directory

这将显示指定目录所在文件系统的磁盘空间使用情况。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!

扫码进群领资料s.pdb2.com/pages/20230525/DnqlA0PPAO24F46.html

以人类可读的格式显示磁盘空间

默认情况下,df 命令显示的磁盘空间以字节为单位,对于较大的文件系统,这可能不太直观。可以通过 -h 选项以人类可读的格式显示磁盘空间:

df -h

该命令将以易读的方式显示磁盘空间,使用诸如 KB、MB、GB 等单位。

使用 du 命令分析磁盘空间

查看指定目录的磁盘空间

要查看指定目录的磁盘空间使用情况,可以运行 du 命令,后面跟上目录的路径:

du /path/to/directory

du 命令将递归地计算指定目录下所有文件和子目录的磁盘使用量,并将结果显示出来。

以人类可读的格式显示磁盘空间

与 df 命令类似,du 命令也可以通过 -h 选项以人类可读的格式显示磁盘空间:

du -h /path/to/directory

这将以易读的方式显示指定目录的磁盘空间使用情况。

查看目录中每个子目录的磁盘空间

有时候我们可能想了解一个目录中每个子目录的磁盘空间使用情况,以便找出哪些子目录占用了大量的磁盘空间。du 命令可以使用 -d 选项指定递归深度,通过设置深度为 1,可以只显示指定目录的直接子目录的磁盘使用量:

du -h -d 1 /path/to/directory

这将显示指定目录下每个子目录的磁盘使用量,以人类可读的格式呈现。

结论

通过掌握 df 和 du 命令,我们能够轻松分析 Linux 系统中的磁盘空间。df 命令用于查看整个文件系统或指定文件系统的磁盘空间使用情况,而 du 命令则用于计算指定目录或文件的磁盘使用量。这些命令提供了实用的选项,例如以人类可读的格式显示磁盘空间,以及递归查看子目录的磁盘空间使用情况。通过灵活运用这些命令,我们可以及时了解系统的磁盘空间状况,合理规划存储空间,以及进行必要的磁盘清理,确保系统的稳定性和性能。