7.2 基础网络管理
本节介绍网络管理基础知识与故障排除技巧。
7.2.1 配置 IPv4
7.2.1.1 配置动态 IPv4 地址
如果网络中有 DHCP 服务器,可使用 DHCP 动态获取 IP 地址。FreeBSD 使用 dhclient(8) 作为 DHCP 客户端,dhclient(8) 可自动获取 IP 地址、子网掩码和默认路由器。
注意
dhclient(8) 不支持 DHCPv6(RFC 3315/RFC 8415),IPv6 动态地址需使用 rtsold(8)(SLAAC)或第三方 DHCPv6 客户端(如
dhcp6c)。
要使接口使用 DHCP,执行以下命令:
# sysrc ifconfig_em0="DHCP"可以手动运行 dhclient(8):
# dhclient em0
DHCPREQUEST on em0 to 255.255.255.255 port 67
DHCPACK from 192.168.1.1
bound to 192.168.1.19 -- renewal in 43200 seconds.dhclient(8) 也可在后台启动。后台运行可能影响依赖网络的程序,但多数情况下能加快启动速度。
要在后台执行 dhclient(8),执行以下命令:
# sysrc background_dhclient="YES"随后重启网络接口:
# service netif restart7.2.1.2 配置静态 IPv4 地址
也可在命令行通过 ifconfig(8) 配置网络接口,但若不同时将这些配置写入 /etc/rc.conf 文件,重启后配置将丢失。
可通过以下命令设置 IP 地址:
# ifconfig em0 inet 192.168.1.150/24要使更改在重启后持久化,执行以下命令:
# sysrc ifconfig_em0="inet 192.168.1.150 netmask 255.255.255.0"一次性设置默认路由:
# route add default 192.168.1.1永久添加默认路由器:
# sysrc defaultrouter="192.168.1.1"将 DNS 服务器地址添加到 /etc/resolv.conf 文件:
nameserver 223.5.5.5 # 指定首选 DNS 服务器为阿里云公共 DNS
nameserver 223.6.6.6 # 指定备用 DNS 服务器为阿里云公共 DNS随后重启网络接口和路由:
# service netif restart
# service routing restart可使用 ping(8) 测试连接:
$ ping -4c2 FreeBSD.org
PING FreeBSD.org (96.47.72.84): 56 data bytes
64 bytes from 96.47.72.84: icmp_seq=0 ttl=51 time=239.916 ms
64 bytes from 96.47.72.84: icmp_seq=1 ttl=51 time=236.443 ms
--- FreeBSD.org ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 236.443/238.179/239.916/1.737 ms如能正常收到 ICMP 响应报文,表明网络已连通。
7.2.2 配置 IPv6
IPv6 是 IPv4 的后继协议。IPv6 相对于 IPv4 提供了多项优势和新功能:
- 其 128 位地址空间可容纳约 3.4×10^38 个地址,从而解决了 IPv4 地址短缺与耗尽问题。
- 路由器仅在路由表中存储网络聚合地址,通过地址聚合减少路由表条目,这与 IPv4 相比大幅降低了路由器的内存和 CPU 需求。
- 地址自动配置(RFC 4862)。
- 以多播取代广播地址。
- 支持 IPsec(IP 安全),但非强制要求(RFC 6434 已将 IPv6 节点对 IPsec 的实现要求由 MUST 调整为 SHOULD,因此成为推荐而非必选)。
- 简化的头部结构。
- 对移动 IP 的支持。
- IPv6 到 IPv4 的过渡机制。
FreeBSD 集成了 KAME 项目 IPv6 参考实现,并包含 IPv6 所需的全部组件。KAME 项目已于 2006 年结束,其代码由 FreeBSD 项目继续维护和演进。
IPv6 地址有三种不同类型:
| 类型 | 说明 |
|---|---|
| 单播(Unicast) | 发送到单播地址的数据包到达属于该地址的接口 |
| 任播(Anycast) | 地址在语法上与单播地址无法区分,但指向一组接口。发往任播地址的数据包将到达最近的接口 |
| 多播(Multicast) | 地址标识一组接口。发往多播地址的数据包将到达属于多播组的所有接口。IPv4 广播地址(通常为 xxx.xxx.xxx.255)在 IPv6 中由多播地址表示 |
读取 IPv6 地址时,规范形式表示为 x:x:x:x:x:x:x:x,其中每个 x 代表一个 16 位十六进制值。例如 FEBC:A574:382B:23C1:AA49:4592:4EFE:9982。
IPv6 地址中常出现连续的全零字段。::(双冒号)可用于替换地址中一段连续的全零字段。此外,每个十六进制值最多可省略三个前导零。例如,fe80::1 对应规范形式 fe80:0000:0000:0000:0000:0000:0000:0001。
部分 IPv6 地址为保留地址:
| IPv6 地址 | 描述 | 说明 |
|---|---|---|
| ::/128 | 未指定地址 | 等同于 IPv4 中的 0.0.0.0 |
| ::1/128 | 回环地址 | 等同于 IPv4 中的 127.0.0.1 |
| ::ffff:0.0.0.0/96 | IPv4 映射的 IPv6 地址 | 低 32 位是 IPv4 地址 |
| fe80::/10 | 链路本地单播 | 等同于 IPv4 中的 169.254.0.0/16 |
| fc00::/7 | 唯一本地 | 仅在协作站点集合内可路由 |
| ff00::/8 | 多播 | — |
| 2000::/3 | 全局单播 | 所有全局单播地址从此池分配 |
| 2001:db8::/32 | 文档用途 | 用于文档中的 IPv6 地址前缀 |
7.2.2.1 配置动态 IPv6 地址
要使用 SLAAC 动态配置接口的 IPv6 地址:
# sysrc ifconfig_em0_ipv6="inet6 accept_rtadv"
# sysrc rtsold_enable="YES"注意,启用 IPv6 数据包转发(即 ipv6_gateway_enable=YES)后,除非将 net.inet6.ip6.rfc6204w3 sysctl(8) 变量设置为 1,否则系统不会配置 SLAAC 地址。
7.2.2.2 配置静态 IPv6 地址
要将 FreeBSD 系统配置为具有静态 IPv6 地址的 IPv6 客户端,需设置 IPv6 地址:
# sysrc ifconfig_em0_ipv6="inet6 2001:db8:4672:6565:2026:5043:2d42:5344 prefixlen 64"要分配默认路由器:
# sysrc ipv6_defaultrouter="2001:db8:4672:6565::1"可使用 ping(8) 测试连接:
$ ping -6c2 FreeBSD.org
PING(56=40+8+8 bytes) 240e:341:228:f400:cfbe:d56:7f75:26e0 --> 2610:1c1:1:606c::50:15
16 bytes from 2610:1c1:1:606c::50:15, icmp_seq=0 hlim=47 time=223.377 ms
16 bytes from 2610:1c1:1:606c::50:15, icmp_seq=1 hlim=47 time=223.348 ms
--- FreeBSD.org ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 223.348/223.362/223.377/0.014 ms如能正常收到 ICMP 响应报文,表明网络已连通。
7.2.2.3 参考文献
- Li Q, Jinmei T, Shima K. IPv6 详解:卷 1,核心协议实现[M]. 陈涓,赵振平,译. 北京:人民邮电出版社,2009:846. ISBN: 978-7-115-18950-9 (英文影印版本 ISBN: 978-7-115-19551-7). 详解 IPv6 核心协议实现,基于 FreeBSD KAME 项目代码分析。
- Li Q, Jinmei T, Shima K. IPv6 详解:卷 2,高级协议实现[M]. 王嘉祯,等,译. 北京:人民邮电出版社,2009:869. ISBN: 978-7-115-20891-0 (英文影印版本 ISBN: 978-7-115-19519-7). 详解 IPv6 高级协议与扩展机制,包含移动 IPv6 等关键技术。
7.2.3 网卡别名
FreeBSD 的常见用途之一是虚拟站点托管,即一台服务器在网络中呈现为多台服务器。其实现方式是将多个网络地址分配给单个接口。
一个网络接口可配置一个主 IP 地址(Primary Address)以及任意数量的附加 IP 地址(Secondary Addresses),它们在底层网络通信中具有同等效力。
技巧
“别名”(alias)地址只是早期操作系统为了方便管理而沿用的传统称呼,对于物理网卡而言并无区别。实际上,IPv6 本身即支持多地址。
这些别名通常通过在 /etc/rc.conf 中添加别名条目来实现,如下所示:
# sysrc ifconfig_em0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"别名条目必须以 alias0 开头,使用递增的数字,如 alias0、alias1,依此类推。配置过程将在第一个缺失的数字处停止。
别名子网掩码的计算非常重要。对于给定的接口,必须有一个地址正确表示网络的子网掩码。任何其他属于该网络的地址必须使用全 1 的子网掩码,表示为 255.255.255.255 或 0xffffffff。
例如,假设以下情况:em0 接口连接到两个网络:
- 10.1.1.0、子网掩码为 255.255.255.0;
- 202.0.75.16、子网掩码为 255.255.255.240。
我们需要为系统配置两个网段的 IP 地址范围:10.1.1.1 到 10.1.1.5,以及 202.0.75.17 到 202.0.75.20。
只有给定网络范围中的第一个地址应具有实际的子网掩码。其余地址(10.1.1.2 到 10.1.1.5 和 202.0.75.18 到 202.0.75.20)必须配置为子网掩码为 255.255.255.255。
以下 /etc/rc.conf 条目将接口配置为适应此场景:
# sysrc ifconfig_em0="inet 10.1.1.1 netmask 255.255.255.0"
# sysrc ifconfig_em0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
# sysrc ifconfig_em0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
# sysrc ifconfig_em0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
# sysrc ifconfig_em0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
# sysrc ifconfig_em0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
# sysrc ifconfig_em0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
# sysrc ifconfig_em0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
# sysrc ifconfig_em0_alias7="inet 202.0.75.20 netmask 255.255.255.255"一种更简洁的表达方式是使用以空格分隔的 IP 地址范围。第一个地址将使用指定的子网掩码,而额外的地址将使用子网掩码 255.255.255.255。
# sysrc ifconfig_em0_aliases="inet 10.1.1.1-5/24 inet 202.0.75.17-20/28"7.2.4 主机名
主机名代表主机在网络上的完全限定域名(FQDN,Fully Qualified Domain Name)。
检查当前主机名:
$ hostname
ykla临时更改主机名:
root@ykla:/home/ykla # hostname f # 将主机名由 ykla 临时修改为 f
root@f:/home/ykla #更改主机名并使其在重启后持久化:
# sysrc hostname="f"7.2.5 DNS
可将 DNS 类比为电话簿,其中 IP 地址与主机名相互对应。除非 /etc/nsswitch.conf 文件中另有说明,FreeBSD 将首先查看 /etc/hosts 文件中的地址,随后查看 /etc/resolv.conf 文件中的 DNS 信息。
相关文件结构:
/etc/
├── rc.conf # 系统启动配置文件
├── resolv.conf # DNS 解析服务器配置文件
└── resolvconf.conf # resolvconf 服务配置文件7.2.5.1 本地地址 hosts 文件
/etc/hosts 文件是一个简单的文本数据库,提供主机名到 IP 地址的映射。通过 LAN 连接的本地计算机条目可添加到此文件中,用于简单的主机名解析,无须设置 DNS 服务器。此外,/etc/hosts 文件可提供互联网域名的本地记录,减少对外部 DNS 服务器的查询需求。
例如,在本地环境中有 www/gitlab-ce 的本地实例,可以将如下行添加到 /etc/hosts 文件:
192.168.1.150 git.example.com git7.2.5.2 配置 DNS 名称服务器
FreeBSD 系统访问 Internet 域名系统(DNS)的方式由 resolv.conf(5) 控制。/etc/resolv.conf 文件中最常见的条目是:
| 条目 | 说明 |
|---|---|
nameserver | 解析器应查询的名称服务器的 IP 地址。服务器按列出的顺序查询,最多三个 |
search | 主机名查找的搜索列表。通常由本地主机名的域确定 |
domain | 本地域名 |
典型的 /etc/resolv.conf 文件如下:
search example.com
nameserver 223.5.5.5
nameserver 223.6.6.6search 和 domain 选项互斥;如果两者都指定,只有最后一个生效。使用 DHCP 时,dhclient(8) 通常会用从 DHCP 服务器接收的信息重写 /etc/resolv.conf 文件。
由于动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)客户端在获取网络配置时会通过 resolvconf 服务重写 /etc/resolv.conf,手动编辑该文件后,系统重启时配置可能被覆盖。
如需使用手动配置的 DNS 服务器而不希望系统自动更新覆盖,可禁用 resolvconf 服务。编辑 /etc/resolvconf.conf 文件(如不存在则创建),写入 resolvconf=NO 一行,该配置将禁用系统对 DNS 配置文件的自动更新。
7.2.5.3 参考文献
- FreeBSD Project. resolvconf[EB/OL]. [2026-03-26]. https://man.freebsd.org/cgi/man.cgi?query=resolvconf&sektion=8. man 手册,提供 resolvconf 工具的完整技术文档,为 DNS 配置管理提供重要参考。
- FreeBSD Forums. 8.8.8.8 or 1.1.1.1 if set in etc resolv conf doesn't stay as an entry in the file after a network restart[EB/OL]. [2026-03-26]. https://forums.freebsd.org/threads/8-8-8-8-or-1-1-1-1-if-set-in-etc-resolv-conf-doesnt-stay-as-an-entry-in-the-file-after-a-network-restart.85951/. 实际案例分析,提供防止覆写 DNS 配置的解决方案。
7.2.6 网络故障排除
首先检查以下基本要素:
- 电源连接是否正常?
- 路由器是否正常工作?
- 宽带或网络费用是否缴纳?
- 是否是区域性大规模网络中断事件?
- 计算机的时间是否正确?
- 网线是否连接正常?
- 网络服务是否正确配置?
- 防火墙是否正确配置?
- 网卡是否受 FreeBSD 支持?
如果网卡工作正常但性能不佳,可参阅 tuning(7)。不正确的网络设置可能导致连接缓慢,应同时检查网络配置。
“No route to host”消息表示系统无法将数据包路由到目标主机。这通常是因为未指定默认路由或网线未连接。可使用 route get <目标地址> 命令查看系统对特定目标的路由决策,再检查 netstat -rn 的输出,确保有到主机的有效路由。
错误消息 ping: sendto: Permission denied 通常由防火墙配置错误引起。如果直接加载了 IPFW 防火墙模块但未配置任何规则,IPFW 的默认规则 65535 会拒绝所有流量,甚至是 ping(8)。
通过 rc.conf 启用防火墙时:
firewall_type的默认值为"UNKNOWN",此时不会添加任何放行规则,仅有默认规则 65535(deny all)生效- 若将
firewall_type显式设置为"open",则 IPFW 会在规则 65000 处添加放行规则,覆盖默认的拒绝行为。
PF 和 IPFilter 无规则时默认放行。
7.2.7 查看网卡速率
如需实时监控网络接口的流量统计信息,可使用 systat 工具的网络接口视图。该命令以指定的刷新间隔显示各网络接口的接收和发送流量数据:
# systat -ifstat 2其中 -ifstat 参数指定显示网络接口信息,数字 2 表示刷新间隔为 2 秒。
7.2.8 查看 FreeBSD 下载流量(bwm-ng)
如需查看更详细的网络流量统计,可安装 bwm-ng 工具,该工具提供多种流量显示格式和交互功能:
# pkg install bwm-ng # 安装 bwm-ng
# bwm-ng
bwm-ng v0.6.3 (probing every 0.500s), press 'h' for help
input: getifaddrs type: rate
/ iface Rx Tx Total
==============================================================================
em0: 2.04 MB/s 6.03 KB/s 2.05 MB/s
lo0: 0.00 B/s 0.00 B/s 0.00 B/s
vm-public: 2.04 MB/s 2.05 MB/s 4.09 MB/s
tap0: 5.49 KB/s 2.04 MB/s 2.04 MB/s
------------------------------------------------------------------------------
total: 4.09 MB/s 4.09 MB/s 8.18 MB/s按字母 d 可切换流量显示格式,按 h 可查阅更多使用方法。
7.2.9 附录:/etc/rc.conf 网络配置示例
注意:
修改 /etc/rc.conf 文件后,需重启系统或依次运行命令
service netif restart与service routing restart来应用网络更改。
主机名(不得为空,否则无法使用 Xorg):
hostname="ykla"7.2.9.1 动态 DHCP 方式
动态 DHCP 方式:使网卡 igc0 使用 DHCP:
ifconfig_igc0="DHCP"7.2.9.2 静态 IP 方式
静态 IP 方式:将网卡 igc0 的 IPv4 设置为 192.168.5.77,子网掩码为 255.255.255.0:
ifconfig_igc0="inet 192.168.5.77 netmask 255.255.255.0"默认网关/默认路由,通常为路由器 IP 地址:
defaultrouter="192.168.5.1"为网卡 igc0 设置别名 IPv4 192.168.5.12,子网掩码为 255.255.255.255(与主地址同子网时必须使用全 1 掩码)从而拥有额外的 IPv4 地址:
ifconfig_igc0_alias0="inet 192.168.5.12 netmask 255.255.255.255"注意:
如果别名地址与主地址位于同一子网,必须将子网掩码设为 255.255.255.255(0xffffffff),否则会产生重复路由错误。不同子网的别名则使用该子网正常的子网掩码。
静态路由:
static_routes="static1 static2" # ①① 在 /etc/rc.conf 文件中,如果需要一次性写入多个配置项,只能使用 ABC_XYZ="xxx yyy ccc ddd" 这种格式。如果写成以下形式是 错误的:
ABC_XYZ="xxx" # 第一行
ABC_XYZ="yyy"
ABC_XYZ="ccc"
ABC_XYZ="ddd"因为在这种形式下,后续的 ABC_XYZ 配置行会覆盖前一行,因此只有最后一行会生效。
示例:如需访问 192.168.50.0/24 地址块(可用主机 IP 从 192.168.50.1 到 192.168.50.254),将数据包发送给 192.168.1.1,由其转发:
route_static1="-net 192.168.50.0/24 192.168.1.1"示例:如需访问网络 10.88.200.0/24 地址块(可用主机 IP 从 10.88.200.1 到 10.88.200.254),则将数据包发送至 10.10.10.254,由其转发:
route_static2="-net 10.88.200.0/24 10.10.10.254"7.2.10 课后习题
- 在 FreeBSD 系统上配置双静态 IP 地址,分别设置不同的 DNS 服务器,使用
dig命令验证每个 DNS 服务器的解析行为,分析 /etc/resolv.conf 中多 DNS 服务器条目的查询顺序与容错机制。 - 修改网络接口的 MTU(Maximum Transmission Unit)值为 9000(巨型帧),使用
ping测试连通性,记录 MTU 变化对大包传输的影响,分析巨型帧在局域网与广域网中的适用场景。 - 禁用
resolvconf服务,手动修改 /etc/resolv.conf 文件并重启网络服务,验证配置是否持久化,分析resolvconf对 DNS 配置动态管理的机制。