懒猫微服实战入门(三十四):方寸之间,自有天地:懒猫微服,男人的网络瑞士军刀
曾几何时,中文互联网圈流行着这样一个段子,叫做中年男人三件套:NAS、软路由、充电头。
我们今天就来聊聊第一个。NAS 似乎是给职业运维人员的福音,而广大的爱好者们通常都是野路子,靠着一腔孤勇或者是兴趣来维护自己的小小世界,能够借鉴参考的,也就是互联网的帖子以及各种群里的答疑而已。
靠着坚持不懈,入门了 Linux 和网络,但是不求甚解,安静的文件存储,只躺在方寸之间。
如果你恰好有一台懒猫微服,那么我们正好可以一起来学习这繁杂的网络,拆解这美丽的网络新世界。
我从事过几年的云行业,在发烧友和职业人员之间横跳,于是心有所感,立志让爱好者可以有专业的技术,让职业人员可以真的产生兴趣。这是网络篇。
首先你一定听说过 IP 地址,这是互联网通信的门牌号。我们的手机、电脑,包括懒猫微服都有一个 IP 地址。当你连上网络的时候,这个地址就被分配给了设备。准确地说,是分配给了网卡,所以懒猫微服可以用转接口来拓展第二张网卡。
连上网线之后,第一步我们习惯在路由器上看 IP 地址,然后 ping 一下确认连通。懒猫微服使用 IPv6,可以用 ping -6 或 ping6。
循迹(ping、telnet)
1 | ping 192.168.x.x |
我们也可以用 dig 查看域名解析的 IP 地址:
1 | dig +short xxx.heiyu.space # 因为是 IPv6,没有 IPv4 所以解析不到 |
在登录之前,可以用 telnet 看端口连通性,然后 SSH 上去。不过一般来说,直接 ssh root@域名/地址 就可以登录了。
1 | telnet xxx.heiyu.space 22 |
登录之后,我们可以使用 ifconfig 来看网卡信息。主要有这几张网卡比较有用:
- enp2s0 物理网卡,连接家里路由器
- wlp129s0 无线网卡
- lo 回环接口,本机访问本机用(127.0.0.1)
- heiyu-0 懒猫穿透隧道,IPv6 内网穿透用
- docker0 Playground Docker 默认网桥
或者使用 ip addr,会更加现代一点。
1 | lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 |
我们再来看一下路由表,使用 route -n 或者 ip route 来查看:
1 | Kernel IP routing table |
路由表决定了数据包往哪里走。
第一条 0.0.0.0/0 是默认路由,所有未知目的地的数据包都会被转发到网关 192.168.8.1(你的路由器)。路由器会通过 NAPT 来实现多台设备共用一个公网 IP 访问互联网。最后一条 192.168.8.0/24 是局域网直连,不需要经过网关。172.100.0.0/24 是 Docker 网桥。
NAPT(Network Address Port Translation)是 NAT 的一种,
也叫 PAT(Port Address Translation),它允许多个内部主机共享一个公网 IP 地址,
通过不同的端口号来区分不同的连接。
你家路由器做的其实是 NAPT:192.168.1.100:12345 → 公网IP:50001
192.168.1.101:12345 → 公网IP:50002
192.168.1.102:12345 → 公网IP:50003
如果你家里恰好有公网 IP,那么也可以通过在路由器上配置端口映射,将外部端口映射到内部的 IP 地址和端口上,让 NAS 可以被外网访问。
比如,你想让 NAS 的 SSH 服务(默认端口 22)可以从外网访问,可以在路由器上配置端口映射,将路由器的端口(比如 2222)映射到 NAS 的 IP 地址(比如 192.168.1.100)的 22 端口上。
不过懒猫微服自带了内网穿透,我们可以不用折腾这个部分了。
一般来说,家庭路由器的 IP 是 192.168.X.1,所以我们的机器可能是 192.168.X.2 或者其它地址。也就是说 192.168.X.0/24 就是我们局域网的网段。
192.168开头的是C类IP地址,后面/24表示子网掩码,也就是255.255.255.0
二进制表示就是 11111111.11111111.11111111.00000000也就是前24位是网络号,后8位是主机号。
一个子网内,主机号不能全为0或者全为1
192.168.1.0 网络地址(全0)
192.168.1.255 广播地址(全1)
192.168.1.1-192.168.1.254 可用地址
如果你的设备足够多,200 多个可能不太够用,那么就需要用更大的网段,比如 172.16.0.0/12,也就是 172.16.0.0 - 172.31.255.255 可用地址。
你也可能看到过 10 开头的地址,这是 A 类私有地址,范围更大:10.0.0.0 - 10.255.255.255。
好了,回到 DNS(Domain Name System)。它是互联网的核心服务之一,作为域名和 IP 地址相互映射的分布式数据库,让我们可以通过域名来访问网站,而不用记一串数字。由于懒猫做了转发,实际看到的不是真正的 IP 地址,这里我们快速略过。
在局域网内也可以用 dig 查看 IPv4 地址:
1 | dig +short your-lazycat.local |
这里看到的地址就和路由器上显示的一样了。
如果想要使用IPv6,那么你需要确保你的网络环境支持IPv6,并且你的路由器也支持IPv6。你可以通过以下命令来查看你的IPv6地址:
1 | ip addr show | grep inet6 |
因为 IPv4 地址已枯竭且存在 NAT 性能损耗,现代互联网依据 RFC 6724 国际标准和 Happy Eyeballs 算法,在操作系统和浏览器底层默认赋予了 IPv6 更高的连接优先级(Precedence),旨在确保连接更直接、高效的同时,通过给 IPv6 几十毫秒的“起跑优势”来实现全球网络向下一代协议的平滑过渡。
下载(curl wget)
那我们如果想从微服的终端下载东西呢,有 curl 和 wget。通常来讲,curl 用来请求 API,比如测试接口,如果你的懒猫微服里发布了 API 可以用 curl 简单地测试;而 wget 主要用来下载文件。直接在微服上下载,比先下到电脑再 SFTP 传过去快多了。
1 | curl -X POST https://api.example.com/login \ |
1 | wget https://example.com/file.zip |
好了,接下来就是端口。
端口是一个逻辑概念,用于标识计算机上的不同服务。每个服务都会监听特定的端口,当有请求到达该端口时,系统会将请求转发给对应的服务。例如,HTTP 服务通常监听 80 端口,HTTPS 服务监听 443 端口,SSH 服务监听 22 端口。
在懒猫微服中,由于服务大多运行在容器中,所以似乎只有使用 pg-docker 的时候才会注意到端口,或者在终端里临时启动 web server:
1 | lzcbox-e66ccc4a ~ # python -m http.server |
那么我们如何知道哪些端口被占用呢?可以使用 netstat 或 ss 命令来查看。懒猫微服上容器多、服务杂,有时候端口冲突了,用这俩命令一查便知。我通常使用 -nltp:
参数解释:
-n显示数字端口(不解析服务名)-l只看监听状态-t只看 TCP-p显示进程信息
1 | ss -nltp | grep 8000 |
1 | lzcbox-e66ccc4a ~ # ss -nltp | grep 8000 |
日常用
ss就行,更快。老系统或习惯了netstat也没问题,结果基本一样。
你可能也会看到其他人使用 lsof,同样可以查端口。lsof 除了查询端口之外,还能查询文件、进程等,这里不再赘述。
1 | apt update && apt install lsof |
测试远程端口:telnet 和 nc
知道端口被谁占了,下一步就是测试远程端口通不通。比如你在懒猫微服上起了个服务,想从电脑上确认能不能连上。
telnet 是最经典的方式:
1 | apt install telnet |
这就是 telnet 的用处——能看到服务返回的 banner 信息,做简单的服务识别。退出方式:按 Ctrl + ] 进入命令模式,然后输入 quit。
nc(netcat)更灵活,可以批量扫描端口:
1 | nc -zv 192.168.8.1 20-100 2>&1 | grep succeeded |
路径追踪:mtr 和 traceroute
端口通了,但网络还是慢?那就要看看路径上哪一跳出了问题。比如你从懒猫微服访问外网资源很慢,想知道是家里路由器的问题还是运营商的问题。
1 | apt install mtr traceroute |
网络不通的时候,光 ping 只能告诉你”不通”,但不知道卡在哪一跳。这时候就需要 traceroute 或 mtr。
traceroute 是单次探测,跑一遍就结束:
1 | traceroute baidu.com |
mtr 更强,结合了 ping 和 traceroute,持续发包,实时显示每一跳的丢包率和延迟:
1 | mtr baidu.com |
网络时好时坏的时候,traceroute 可能刚好跑的时候没问题就抓不到,mtr 跑几分钟就能看到哪一跳在丢包。日常排查推荐用 mtr。
抓包:tshark
和 tcpdump 相比,tshark 的协议解析能力更强,能直接看到 HTTP 请求内容,而 tcpdump 只能看到十六进制。
懒猫微服上跑着各种服务,有时候想看看某个应用到底在发什么请求、收什么响应,tshark 就派上用场了。
懒猫的系统环境如果默认没装 tshark,需要使用这个命令进行安装
1 | apt update && apt install -y tshark |
用 tshark 抓一个本地 HTTP 请求,看看 TCP/HTTP 到底是怎么通信的。先在一个终端启动抓包:
1 | # 抓 lo 回环接口(本机访问本机走这里) |
然后另一个终端访问 curl localhost:8000,抓到 12 个包:
1 | tshark -i lo -f "port 8000" |
针对上图的结果,我也总结了一个流程图,请看:
1 | 客户端 (59548) 服务端 (8000) |
TCP 三次握手(建立连接)
1 | 1 59548 → 8000 [SYN] "我想连接你" |
为什么要三次?确保双方都能收发。两次不够——服务端不知道客户端能不能收到它的回复。
HTTP 请求/响应
1 | 4 GET / HTTP/1.1 客户端请求首页 |
TCP 四次挥手(关闭连接)
1 | 10 [FIN,ACK] 服务端 → 客户端 "我发完了" |
虽然抓包看只有三行,但逻辑上它们依然是四次挥手的变体。
一共 12 个包,一次完整的 HTTP 请求就完成了。
尾声
网络之道,说繁亦繁,说简亦简。繁在协议层层叠叠,简在万变不离其宗——包从哪来,到哪去。
能用 tshark 看懂三次握手,用 mtr 定位丢包,用 ss 追溯端口归属,便已胜过大多数人。
所谓高手,不过是在无数次折腾中,把书本上的知识化作了指尖的肌肉记忆。
而懒猫微服,恰是这样一方天地——自带穿透,容器隔离,root 权限在握,尽可放手施为。纵有闪失,重置便是,不伤筋骨。
这大概就是它最大的魅力:不只是一台 NAS,更是折腾 infra、钻研安全的瑞士军刀。
所有的好奇心,皆有安放之处。
懒猫微服实战入门(三十四):方寸之间,自有天地:懒猫微服,男人的网络瑞士军刀


