从 IP 地址、子网掩码讲到 DNS 解析与 NAT,配套本站工具边学边练。
| 章节 | |
|---|---|
| 01 IP 地址与二进制表示 | 3 小节 |
| 02 子网划分与 CIDR | 1 小节 |
| 03 公网 IP 与内网 IP | 2 小节 |
| 04 DNS 是怎么解析的 | 2 小节 |
| 05 Ping 与丢包排查 | 1 小节 |
| 06 NAT 与端口映射 | 2 小节 |
IPv4 地址本质上就是一个 32 位的整数,只是为了给人看,才按每 8 位一组切成四段十进制、中间打点,这种写法叫点分十进制。
以 192.168.1.1 为例:
| 段 | 十进制 | 二进制 |
|---|---|---|
| 第 1 段 | 192 | 11000000 |
| 第 2 段 | 168 | 10101000 |
| 第 3 段 | 1 | 00000001 |
| 第 4 段 | 1 | 00000001 |
每段是 8 位,取值范围 0–255,所以 192.168.1.256 这种写法根本不是一个合法地址。搞不清十进制和二进制的对应关系时,用进制计算器挨个换一遍,看几次就有感觉了。
把四段拼起来当一个整数看:
192 × 256³ + 168 × 256² + 1 × 256 + 1 = 3232235777数据库里存 IP 经常用这个整数形式:4 字节比 15 字节的字符串省空间,而且整数能直接比大小,做「这个 IP 落在哪个段里」的区间查询时可以走索引。MySQL 内置了转换函数:
SELECT INET_ATON('192.168.1.1'); -- 3232235777
SELECT INET_NTOA(3232235777); -- 192.168.1.1
-- 典型用法:用整数区间存 IP 归属库,查询时一次范围扫描
SELECT * FROM ip_region
WHERE start_int <= INET_ATON('192.168.1.1')
AND end_int >= INET_ATON('192.168.1.1')
LIMIT 1;手算容易错位,直接用 IP / 数字互转。
IPv6 是 128 位,写成 8 组、每组 4 位十六进制,组间用冒号分隔。两条简写规则:每组的前导零可以省,连续的全零组可以用 :: 整体省掉,但 :: 在一个地址里只能出现一次(出现两次就没法还原到底各省了几组)。
完整:2001:0db8:0000:0000:0000:ff00:0042:8329
压缩:2001:db8::ff00:42:8329判断一个 IPv6 写法合不合法、压缩和展开的对应关系,交给 IPv6 检测与计算器。
| 地址段 | 含义 |
|---|---|
0.0.0.0/8 | 本网络,0.0.0.0 在服务端表示监听所有网卡 |
127.0.0.0/8 | 环回,包不出网卡,127.0.0.1 就是本机 |
169.254.0.0/16 | 链路本地,拿到这个地址说明 DHCP 没要到 IP |
224.0.0.0/4 | 组播 |
255.255.255.255 | 受限广播 |
想知道自己此刻的出口地址,打开我的 IP;想查任意一个地址属于哪个国家、哪家运营商,用 IP 地址查询。
子网掩码的作用只有一个:划出一条线,线左边是网络号,右边是主机号。掩码写成二进制一定是「连续的 1 后面跟连续的 0」,所以干脆只记 1 的个数,写成 /24 这种形式,这就是 CIDR。
| 前缀 | 掩码 | 地址总数 | 可用主机 | 常见用途 |
|---|---|---|---|---|
| /30 | 255.255.255.252 | 4 | 2 | 点对点链路 |
| /29 | 255.255.255.248 | 8 | 6 | 一小撮服务器 |
| /28 | 255.255.255.240 | 16 | 14 | 小型 VPC 子网 |
| /24 | 255.255.255.0 | 256 | 254 | 一个普通局域网 |
| /16 | 255.255.0.0 | 65536 | 65534 | 一个中型内网 |
| /8 | 255.0.0.0 | 16777216 | 16777214 | 一整个 A 类段 |
可用主机数是 2^(32-n) - 2,减掉的两个是网络地址(主机位全 0)和广播地址(主机位全 1)。两个例外:/32 表示单台主机,常见于路由条目和防火墙白名单;/31 在点对点链路上按 RFC 3021 两个地址都能用。
网络地址 = IP AND 掩码
广播地址 = 网络地址 OR (NOT 掩码)
是否同网段 = 两个 IP 分别 AND 掩码,结果相同即同段拿 192.168.10.0/26 举例,/26 意味着主机位只剩 6 位,每个子网 64 个地址:
| 子网 | 网络地址 | 可用范围 | 广播地址 |
|---|---|---|---|
| 1 | 192.168.10.0 | .1 – .62 | 192.168.10.63 |
| 2 | 192.168.10.64 | .65 – .126 | 192.168.10.127 |
| 3 | 192.168.10.128 | .129 – .190 | 192.168.10.191 |
| 4 | 192.168.10.192 | .193 – .254 | 192.168.10.255 |
「同网段」这件事是排障的高频考点:同段内主机直接二层通信,不同段必须走网关。机器配了 IP 却只能 ping 通一半的地址,十有八九是掩码写错,把本该同段的机器劈成了两段。
掩码、网络地址、可用范围一次算全,用 IP 地址、子网掩码在线计算;要把一个 CIDR 展开成起止 IP,或者反过来把一段起止 IP 合并成最少的几条 CIDR,用 IP 段与 CIDR 互转——写防火墙规则和 nginx allow/deny 时特别省事。
公网地址全球唯一,由 IANA 分给各大区域注册局(亚太是 APNIC),再往下分到运营商和机构。私有地址则是留给局域网自己用的,任何人都可以在自己网里重复使用,路由器不会把它们往公网转发。
| 私有段 | 前缀 | 备注 |
|---|---|---|
| 10.0.0.0/8 | /8 | 大型内网、云上 VPC 最常用 |
| 172.16.0.0/12 | /12 | 范围是 172.16 – 172.31,不是 172.0 – 172.255 |
| 192.168.0.0/16 | /16 | 家用路由器默认段 |
| 100.64.0.0/10 | /10 | 运营商级 NAT(CGNAT)专用,不是给你用的 |
172.16.0.0/12 的边界是最容易记错的一个:172.15.x.x 和 172.32.x.x 都是公网地址。
登录路由器看 WAN 口地址,再对照我的 IP 显示的出口地址:
100.64.x.x / 10.x.x.x / 192.168.x.x,出口却是另一个地址 → 运营商在你上面又套了一层 NAT,端口映射做了也没用,只能打电话申请公网 IP,或者改用内网穿透。顺手确认一下对外服务到底通不通,用端口检测或网站连通性检测从外面回头探一次,比在本机 curl 127.0.0.1 靠谱得多。
| 段 | 对应 IPv4 里的 |
|---|---|
fe80::/10 | 链路本地,相当于 169.254.0.0/16 |
fc00::/7 | 唯一本地地址(ULA),相当于私有段 |
2000::/3 | 全球单播,相当于公网地址 |
::1 | 环回,相当于 127.0.0.1 |
IPv6 地址多到不需要 NAT,内网机器直接拿全球地址,能不能被访问改由防火墙决定——这也意味着默认放行的话内网机器是直接暴露在公网上的,别拿「反正在内网」当安全假设。
浏览器里敲一个域名到拿到 IP,中间按这个顺序找:
223.5.5.5、119.29.29.29、8.8.8.8;.com 的服务器在哪 → .com 告诉它这个域名的权威服务器在哪 → 权威服务器给出最终记录。| 类型 | 作用 | 备注 |
|---|---|---|
| A | 域名 → IPv4 | 最常用 |
| AAAA | 域名 → IPv6 | |
| CNAME | 域名 → 另一个域名 | 同名下不能再有别的记录,所以根域名一般用不了 |
| MX | 收信服务器 | 带优先级,数字小的优先 |
| TXT | 任意文本 | SPF、DKIM、各种域名所有权验证 |
| NS | 该域交给哪些权威服务器 | 换 DNS 服务商改的就是它 |
| SOA | 该域的起始授权信息 | 含序列号与各种超时 |
| CAA | 限定哪些 CA 能给该域签证书 | 签不出证书时记得查这条 |
| PTR | IP → 域名 | 反向解析,自建邮件服务器必须配 |
每条记录都带 TTL,决定下游能缓存多久。改解析之前先把 TTL 调小(比如 300 秒),等旧 TTL 过期、新值全网生效之后再调回去,能把切换窗口从几小时压到几分钟。
# 只要结果
dig www.ip438.com A +short
# 看完整递归路径:从根一路问下来,能定位是哪一级出了问题
dig www.ip438.com +trace
# 指定解析器查 MX,用来对比不同 DNS 的返回是否一致
dig @223.5.5.5 ip438.com MX
# Windows
nslookup -type=txt ip438.com 8.8.8.8
ipconfig /flushdns站内对应的工具:DNS 记录在线查询一次看全各类记录;全国 DNS 解析分布看各地运营商解析到的 IP 是否一致,切换 IP 或排查 CDN 调度时必看;DNS 污染与解析一致性检测用来判断是自己没生效还是被中间环节改了;DNS 出口检测看你实际用的是哪家解析器。
ping 发的是 ICMP Echo Request,对方回 Echo Reply,用来判断「能不能通」和「来回要多久」。
ping -c 10 www.ip438.com64 bytes from 1.2.3.4: icmp_seq=1 ttl=52 time=12.3 ms
...
10 packets transmitted, 10 received, 0% packet loss, time 9012ms
rtt min/avg/max/mdev = 11.802/12.415/13.907/0.612 ms要看的就三个数:
回包里的 ttl=52 还能反推对方系统:初始 TTL 常见值是 Linux/macOS 64、Windows 128、网络设备 255,64 - 52 = 12 说明中间过了 12 跳。
丢包要按「由近及远」的顺序切段,别一上来就怀疑对方:
ping -c 20 192.168.1.1 # 1. 网关,这里丢包就是本地网络/网线/无线的问题
ping -c 20 223.5.5.5 # 2. 公共地址,能到说明出口正常
mtr -r -c 50 www.ip438.com # 3. 一次性看每一跳的丢包与延迟看 mtr/路由追踪结果有个必须知道的坑:中间某一跳丢包、但后面的跳和终点都不丢,那是该跳限速 ICMP 的正常现象,不是故障。只有「从某一跳开始一直丢到终点」才说明问题出在那里。
还有一条:对方不回 ping 不等于不通。很多云主机默认在安全组里禁了 ICMP,这时候要用 TCP 去敲端口才准。
站内工具:Ping 在线检测 多地发包,持续 Ping 与延迟曲线 盯一段时间的抖动,路由追踪 看逐跳路径,TCPing 在线检测 用于禁了 ICMP 的目标。
家里那么多设备共用一个公网 IP,靠的就是 NAT。出方向叫 SNAT:路由器把内网包的源地址和端口换成「公网 IP + 一个临时端口」,并在会话表里记下这条映射;回包到达时按表还原,送回对应的内网机器。
内网 192.168.1.20:51314 ──SNAT──▶ 公网 1.2.3.4:40021 ──▶ 目标 93.184.216.34:443
◀──还原── ◀──会话表是按连接建立的,所以外网无法主动连进来——它不知道该给哪台内网机器。要让外面能访问,就得手动加一条反向规则,也就是端口映射(DNAT)。
0.0.0.0 而不是 127.0.0.1,否则只有本机能连;ufw allow、firewalld、Windows 防火墙、云安全组,缺一不可)。对外端口尽量别用默认值,22、3389、3306 这些一暴露到公网,几分钟内就会有人来扫。真要开,配合密钥登录和 fail2ban。
配好之后从外面验证一次,用在线端口扫描或端口检测——在内网里自己连自己是测不出映射有没有生效的。常见端口号对照也在常用端口号里。
UPnP 能让程序自己向路由器申请映射,省事,但也意味着内网里任何程序(包括中招的那个)都能悄悄把自己暴露到公网,不用就在路由器里关掉。
没有公网 IP 时只能走穿透:UDP 打洞依赖 STUN 发现自己的公网映射,打不通再由 TURN 中转。浏览器里的 WebRTC 用的就是这套机制,也正因为它会暴露本机地址,才有了WebRTC 泄漏检测这种工具。
IPv6 环境下这些都不需要:每台机器都有全球地址,开放与否由防火墙决定,配置反而简单——前提是你确实记得配防火墙。
本文由 ip438查询网 原创,正文中的命令与配置片段可直接取用。 内容会随实践持续修订,发现错漏欢迎反馈。