UP | HOME

网络基础

Table of Contents

FreeBSD 是理想的互联网或内网服务器操作系统,能在极高负载下提供稳健的网络服务

并高效使用内存,在数千个并发用户进程下保持良好响应时间

FreeBSD 网络配置涉及多个核心命令和配置文件:

命令/文件 用途
ifconfig 配置网络接口参数
route 手动操作网络路由表
/etc/rc.conf 系统启动配置的核心文件,网络接口的持久化配置均存储在此文件中
/etc/resolv.conf 配置 DNS 解析器信息
/etc/hosts 提供本地主机名到 IP 地址的静态映射

网络模型基础

计算机网络是将地理位置不同、具有独立功能的多台计算机及其外部设备,通过通信线路连接起来的系统。在网络操作系统、网络管理软件及网络通信协议的管理和协调下,该网络实现资源共享和信息传递

FreeBSD 网络子系统基于 TCP/IP 协议族实现,遵循互联网协议套件的分层架构

TCP/IP 协议族采用四层模型组织网络功能:

Table 1: TCP 四层模型
层次 名称 功能说明
第一层 网络接口层 Link Layer 负责在物理网络介质上发送和接收数据帧,处理硬件地址 MAC 地址 解析。该层对应 FreeBSD 中的网络接口驱动程序,其配置由 ifconfig 命令管理。以太网帧的发送和接收、地址解析 ARP , Address Resolution Protocol 均在该层完成
第二层 互联网层 Internet Layer 负责数据包的路由和转发,核心协议为 IP Internet Protocol ,同时处理逻辑寻址 IP 地址 、分片与重组、路由选择等功能。路由表管理和 route 命令操作均属于该层
第三层 传输层 Transport Layer 提供端到端的通信服务,主要协议为 TCP Transmission Control Protocol 和 UDP User Datagram Protocol 。TCP 提供可靠的面向连接传输,UDP 提供无连接的不可靠传输。FreeBSD 实现了多 TCP 栈共存架构,允许系统同时加载多个 TCP 协议栈实现
第四层 应用层 Application Layer 包含多种面向用户的网络应用协议,如 HTTP、SSH、DNS、SMTP 等。FreeBSD 通过 Ports 和 pkg 提供了大量网络服务软件

TCP/IP 四层模型与数据封装过程如下:

network_layer.avif

识别网络适配器

FreeBSD 支持多种有线和无线网络适配器。查看所用 FreeBSD 版本的硬件兼容性列表,确认网络适配器是否受支持

通过 pciconf 命令识别网络适配器

要获取系统使用的网络适配器,执行以下命令:

$ pciconf -lv | grep -A1 -B3 network

输出示例如下:

em0@pci0:2:1:0: class=0x020000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x100f subvendor=0x15ad subdevice=0x0750
vendor     = 'Intel Corporation'
device     = '82545EM Gigabit Ethernet Controller (Copper)'
class      = network
subclass   = ethernet

iwm0@pci0:3:0:0: class=0x028000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x4237 subvendor=0x8086 subdevice=0x1211
vendor     = 'Intel Corporation'
device     = 'PRO/Wireless 5100 AGN [Shiloh] Network Connection'
class      = network

@ 符号前的文本是控制该设备的驱动程序名称

在此示例中,分别是 em(4) 和 iwm(4)

通过 ifconfig 命令识别网络适配器

使用 ifconfig 命令可查看系统中的网络接口列表及其状态。输出应类似于以下内容:

em0: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
options=4e504bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,LRO,VLAN_HWFILTER,VLAN_HWTSO,RXCSUM_IPV6,TXCSUM_IPV6,HWSTATS,MEXTPG>
ether 00:0c:29:84:0f:86
inet 192.168.5.22 netmask 0xffffff00 broadcast 192.168.5.255
inet6 fe80::20c:29ff:fe84:f86%em0 prefixlen 64 scopeid 0x1
inet6 240e:341:207:a600:2d60:b653:3a68:8605 prefixlen 64 autoconf pltime 101808 vltime 188208
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
nd6 options=823<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL,STABLEADDR>
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
groups: lo
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=200001<RXCSUM,RXCSUM_IPV6>
ether 20:0d:b0:c4:ab:59
inet 192.168.5.23 netmask 0xffffff00 broadcast 192.168.5.255
groups: wlan
ssid test_5G channel 153 (5765 MHz 11a vht/80-) bssid e4:60:4d:97:00:e8
regdomain FCC country US authmode WPA2/802.11i privacy ON
deftxkey UNDEF AES-CCM 2:128-bit AES-CCM ucast:128-bit txpower 17
bmiss 7 mcastrate 6 mgmtrate 6 scanvalid 60 ampdulimit 64k
ampdudensity 2 shortgi -stbc -uapsd vht vht40 vht80 -vht160 -vht80p80
wme roaming MANUAL
parent interface: rtwn0
media: IEEE 802.11 Wireless Ethernet VHT mode 11ac
status: associated
nd6 options=829<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL,STABLEADDR>

FreeBSD 采用 驱动程序名称 后接 单元号 的方式为网络接口命名。单元号表示适配器在启动时被检测到的顺序,或后续被检测到时的顺序

例如,em0 是系统中使用 em(4) 驱动程序的第一块网卡,wlan0 是使用 rtwn(4) 驱动创建的第一个无线接口

该示例显示以下设备:

  • em0:以太网接口
  • lo0:本地回环接口,用于本机内部通信,不属于物理网卡。可用于性能分析、软件测试与本地通信
  • wlan0:通用 WiFi 802.11 链路层接口,用于连接无线网络
如果 ifconfig 输出中仅显示 lo0 接口,则表示系统未识别物理网卡

此时应检查网卡硬件连接和驱动加载状态

可通过 dmesg | grep ether 命令查看网卡驱动加载日志

该示例显示 em0、wlan0 已启动且运行正常

关键指示项:

指示项 说明
UP 表示接口已被管理员启用(处于 up 状态),当前 em0 和 wlan0 均已启用
inet(IPv4 地址) 有线接口 em0 的地址更新为 192.168.5.22;无线接口 wlan0 的地址为 192.168.5.23
inet6(IPv6 地址) em0 当前拥有两个 IPv6 地址,分别是链路本地地址 fe80::20c:29ff:fe84:f86%em0 和全局动态地址 240e:341:207:a600:2d60:b653:3a68:8605
netmask(子网掩码) em0 和 wlan0 的掩码均为 0xffffff00,这等同于标准的 255.255.255.0
broadcast(广播地址) 两个接口当前所在网段的有效广播地址均为 192.168.5.255
ether(MAC 地址) 有线接口 em0 的物理地址是 00:0c:29:84:0f:86;无线接口 wlan0 的物理地址是 20:0d:b0:c4:ab:59
media(物理媒体) em0 显示为以太网自动选择模式(Ethernet autoselect (1000baseT <full-duplex>));wlan0 显示为无线高速模式(IEEE 802.11 Wireless Ethernet VHT mode 11ac)
status(链接状态) em0 的状态为 active,说明网线已连接且载波信号正常;wlan0 的状态为 associated,说明已成功关联到无线基站(SSID 外部显示为 test_5G)

此外, wlan0 的关键指示项如下:

指示项 说明
ssid(无线网络名称) 当前连接的 Wi-Fi 名称为 test_5G
channel(工作信道与频率) 当前工作在 153 信道,频率为 5765 MHz(属于 5GHz 频段),且启用了 80MHz 的频宽(vht/80-)
bssid(无线路由器 MAC 地址) 当前所连 Wi-Fi 热点的物理地址是 e4:60:4d:97:00:e8
country / regdomain(国家区域代码与无线监管域) 当前遵从美国标准(country US)以及美国联邦通信委员会(regdomain FCC)的无线电法律法规
authmode / privacy(认证与加密模式) 认证方式为 WPA2/802.11i(目前主流的安全无线认证标准),且隐私加密已开启(privacy ON),单播与传输密钥采用 AES-CCM (128-bit)
txpower(发射功率) 当前无线的发射功率为 17 dBm

如果 ifconfig(8) 输出类似于以下内容,则表示网络接口待配置:

em0: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
options=4e504bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,L
RO,VLAN_HWFILTER,VLAN_HWTSO,RXCSUM_IPV6,TXCSUM_IPV6,HWSTATS,MEXTPG>
ether 00:0c:29:84:0f:86
inet6 fe80::20c:29ff:fe84:f86%em0 prefixlen 64 scopeid 0x1
inet6 240e:341:207:a600:2d60:b653:3a68:8605 prefixlen 64 autoconf pltime 1018
08 vltime 188208
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
nd6 options=823<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL,STABLEADDR>
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
groups: lo
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>

网关和路由

路由 是系统寻找通往其他系统的网络路径的机制

  • 每条路由由一对地址定义,分别表示 目标 和 网关
  • 路由表明:连接指定目标时,应经由指定网关发送数据包
    • 目标分为三种类型: 单台主机 、 子网 和 默认
      • “默认路由”在其他路由均不适用时生效
    • 网关同样分为三种类型: 单台主机 、 接口 (也称为 链路 )和 以太网硬件 MAC地址
      • 已知路由存储于路由表中

路由基础

使用 netstat(1) 可查看 FreeBSD 系统的路由表

  • 添加 -n 选项可避免反向 DNS 解析延迟

    这在排查网络问题时尤为重要
    
$ netstat -rn
Routing tables

Internet:       # IPv4
# 路径                            网关                        标志                    接口  过期时间
Destination        Gateway            Flags         Netif Expire
default            192.168.179.2      UGS             em0   # 默认路由,通过 em0 接口
localhost          link#3             UH              lo0   # 回环地址,使用 lo0 接口
192.168.5.0/24     link#2             U               em1   # 192.168.5.0/24
192.168.5.16       link#3             UHS             lo0   # 192.168.5.16
192.168.179.0/24   link#1             U               em0   # 192.168.179.0/24 子网
192.168.179.128    link#3             UHS             lo0   # 本地主机地址 192.168.179.128

Internet6:      # IPv6
Destination        Gateway            Flags         Netif Expire
::/96              link#3             URS             lo0   # IPv4 兼容 IPv6 地址块(已废弃,RFC 4291)
default            fe80::5%em1        UG              em1   # 默认 IPv6 路由,下一跳是链路本地地址 fe80::5,标志 UG 表示可达且为网关
localhost          link#3             UHS             lo0   # IPv6 本地回环地址 ::1
::ffff:0.0.0.0/96  link#3             URS             lo0   # IPv4 映射 IPv6 地址
240e:341:22b:ae00: link#2             U               em1   # 全球单播地址
240e:341:22b:ae00: link#3             UHS             lo0   # 本地主机路由
fe80::%lo0/10      link#3             URS             lo0   # 链路本地 IPv6 网络
fe80::%em0/64      link#1             U               em0   # em0 接口链路本地 IPv6 地址
fe80::20c:29ff:fe8 link#3             UHS             lo0   # 静态主机路由
fe80::%em1/64      link#2             U               em1   # em1 接口链路本地 IPv6 地址
fe80::20c:29ff:fe8 link#3             UHS             lo0   # 静态主机路由(与前条 fe80::20c:29ff:fe8 条目重复,属路由表缓存正常现象)
fe80::%lo0/64      link#3             U               lo0   # lo0 接口链路本地子网
fe80::1%lo0        link#3             UHS             lo0   # lo0 本地主机链路本地地址,静态主机路由
ff02::/16          link#3             URS             lo0   # IPv6 多播地址

该示例的条目如下:

  • default : 默认路由。本地系统需连接远程主机时,检查路由表以确定是否存在已知路径。如果远程主机匹配表中某条目,系统即检查能否通过该条目指定的接口完成连接。 默认路由在无更具体前缀匹配时采用,不受其他路径状态的影响。对于局域网中的主机,默认路由的 Gateway 字段应设为可直接连接互联网的系统。读取该条目时,应确认 Flags 列指示 网关可达 UG

    该机器具备双栈网络能力,IPv4 和 IPv6 出口分别依赖不同网卡(em0 和 em1)
    
    • IPv4 网络中,默认网关为 192.168.179.2,标记为 UGS(Up、Gateway、Static)。所有发往未知外部网络(如互联网)的 IPv4 流量均经 em0 接口发送至该路由器转发
    • IPv6 部分中,默认路由以链路本地地址 fe80::5%em1 指定下一跳,该下一跳通常为 ISP 提供的路由器。标志为 UG
      • 所有未匹配的 IPv6 流量经 em1 接口发出
      • 链路本地地址为 IPv6 特性,仅用于本地链路通信,不等同于公网可达地址
    • 对于充当对外网关的主机,其默认路由指向与 互联网服务提供商 ISP 相连的网关
  • localhost:第二条路由。Netif 列中为 localhost 指定的接口是 lo0,也称为回环设备

    所有发往该目标的流量均保留于本机内部,不通过网络发送
    
  • 子网: IPv4 路由表显示该设备同时接入两个局域网:192.168.5.0/24 和 192.168.179.0/24

    • 对应网关分别为 link#2 和 link#1
    • 标志仅含 U Up ,表明二者均为 直连网络
    该机器与这两个网段内其他设备(如 192.168.5.x 范围内的计算机)通信时,数据包无须经由路由器
    
    而是通过 ARP 解析目标 MAC 地址后,直接经 em1 和 em0 接口以链路层单播帧发送
    
  • 全球单播地址: IPv6 路由(Internet6)中,以 240e:341:22b:ae00: 为首的条目绑定于 em1 接口。该地址属于 全球单播地址 Global Unicast Address

    通常由运营商(如中国电信,以 240e 开头)分配
    
    理论上可在互联网中路由,但实际访问能力取决于防护策略与服务配置
    
  • 标志: Flags 列展示各路由的属性。下表汇总了常见的路由表标志及其含义

    Table 2: 常见的路由表标志
    标志 目的
    U 路由可用
    H 路由目标是单个主机
    G 将此目的地的任何流量转发到此网关,由网关决定如何进一步转发
    S 该路由是静态配置的
    M 路由已被重定向修改
    B 黑洞路由:静默丢弃匹配的数据包
    D 由重定向动态创建
    L 链路层路由,涉及以太网硬件地址引用
    R 拒绝路由:目标主机或网络不可达
    b 路由表示广播地址

跟踪路由信息

地址空间 分配给某网络后,服务提供商会配置自身路由表,确保所有流量均发往该站点链路。外部站点如何确定应将数据包发往该网络的 ISP

互联网通过 全球路由系统 跟踪所有已分配地址空间,并界定其与 互联网主干网 承载互联网流量的核心线路 的连接节点。每台主干路由器均保存一份 主路由表 ,将特定网络的流量指向对应的主干运营商,再经由一系列服务提供商逐级传递至目标网络

服务提供商必须向主干站点通告自身的连接点,使流量能够到达该网络。该过程称为 路由传播

router_propagation.avif

路由传播偶尔出现故障,导致部分站点无法连通。此时,查找路由断点的常用命令是 traceroute

IPv6 使用 traceroute6,在 ping 失败时尤为有用

使用 traceroute 必须提供远程主机的地址。输出将显示路径上的网关主机,最终抵达目标主机或因连接中断而终止。以下为对 freebsd.org 域名的 IPv6 路径跟踪:

$ traceroute6 freebsd.org
traceroute6 to freebsd.org (2610:1c1:1:606c::50:15) from 240e:341:22b:ae00:f534:e5cb:2367:c033, 64 hops max, 28 byte packets
1  * * *
2  240e:c::201 (240e:c::201)  6.427 ms  5.508 ms  6.578 ms
3  *
240e:c:1:20e::2 (240e:c:1:20e::2)  6.229 ms  5.737 ms
4  * * *
5  240e::1:11:46:5c02 (240e::1:11:46:5c02)  10.729 ms * *
6  240e::f:1:6601:503 (240e::f:1:6601:503)  13.093 ms *  11.332 ms
7  240e:0:a::c9:360d (240e:0:a::c9:360d)  15.618 ms
240e:0:a::c9:3649 (240e:0:a::c9:3649)  16.334 ms *
8  * * *
9  *
zayo.ae10.mpr4.sjc7.us.zip.zayo.com (2001:438:ffff::407e:2f9)  180.002 ms  179.112 ms
10  ae34.mpr1.ewr4.us.zip.zayo.com (2001:438:ffff::407d:1455)  244.026 ms  243.263 ms *
11  2001:438:fffe::24ba (2001:438:fffe::24ba)  246.736 ms *  245.756 ms
12  cs89-cs80.nyinternet.net (2610:1c1::2502)  218.700 ms  218.396 ms  217.715 ms
13  2610:1c1::803 (2610:1c1::803)  228.099 ms  227.280 ms  226.003 ms
14  wfe0.nyi.freebsd.org (2610:1c1:1:606c::50:15)  214.724 ms  216.682 ms *
Table 3: tcproute 详细解释
序号 节点 说明
1 * 本地网络第一跳无响应
2 240e:c::201 (240e:c::201) 运营商接入网关
3、4 * 骨干网前级节点无响应,可能丢弃了 ICMPv6
5 240e::1:11:46:5c02 (240e::1:11:46:5c02) 中国电信核心骨干路由器,国内长途汇聚节点
6 240e::f:1:6601:503 (240e::f:1:6601:503) 中国电信国际出口前的骨干节点,部分探测包丢失
7 240e:0:a::c9:360d (240e:0:a::c9:360d), 240e:0:a::c9:3649 (240e:0:a::c9:3649) 中国电信向海外出口的跨洲骨干路由器
8 * 无响应节点,可能丢弃了 ICMPv6
9 zayo.ae10.mpr4.sjc7.us.zip.zayo.com (2001:438:ffff::407e:2f9) Zayo 美国加州圣何塞骨干网(Zip Zayo)入口节点
10 ae34.mpr1.ewr4.us.zip.zayo.com (2001:438:ffff::407d:1455) Zayo 美国纽瓦克骨干网节点,负责东海岸流量汇聚
11 2001:438:fffe::24ba (2001:438:fffe::24ba) Zayo 美国骨干网最后一跳,接近 NYInternet 入口
12 cs89-cs80.nyinternet.net (2610:1c1::2502) NYInternet 美国运营商核心路由器,接入 freebsd.org 网络
13 2610:1c1::803 (2610:1c1::803) NYInternet 核心骨干节点,负责 freebsd.org 服务器的流量分发
14 wfe0.nyi.freebsd.org (2610:1c1:1:606c::50:15) freebsd.org 服务器终端节点,traceroute6 的目标

配置 IPv4

配置动态 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 restart

配置静态 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 响应报文,表明网络已连通

配置 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 地址有三种不同类型:

Table 4: 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 地址为保留地址:

Table 5: 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 地址前缀

配置动态 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 地址

配置静态 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 响应报文,表明网络已连通

网卡别名

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

网卡 em0 的 IP 别名结构如下图所示:

network_card_alias.avif

以下 /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"

主机名

主机名代表主机在网络上的完全限定域名 FQDN Fully Qualified Domain Name

  • 检查当前主机名:

    $ hostname
    ykla
    
  • 临时更改主机名:

    root@ykla:/home/ykla $ hostname f       # 将主机名由 ykla 临时修改为 f
    root@f:/home/ykla $
    
  • 更改主机名并使其在重启后持久化:

    $ sysrc hostname="f"
    

DNS

可将 DNS 类比为电话簿,其中 IP 地址与主机名相互对应。除非 /etc/nsswitch.conf 文件中另有说明,FreeBSD 将首先查看 /etc/hosts 文件中的地址,随后查看 /etc/resolv.conf 文件中的 DNS 信息

相关文件结构:

/etc/
├── rc.conf              # 系统启动配置文件
├── resolv.conf          # DNS 解析服务器配置文件
└── resolvconf.conf      # resolvconf 服务配置文件

本地地址 hosts 文件

/etc/hosts 文件是一个简单的文本数据库,提供主机名到 IP 地址的映射。通过 LAN 连接的本地计算机条目可添加到此文件中,用于简单的主机名解析,无须设置 DNS 服务器

  • 此外,/etc/hosts 文件可提供互联网域名的本地记录,减少对外部 DNS 服务器的查询需求。

例如,在本地环境中有 www/gitlab-ce 的本地实例,可以将如下行添加到 /etc/hosts 文件:

192.168.1.150 git.example.com git

配置 DNS 名称服务器

FreeBSD 系统访问 Internet 域名系统(DNS)的方式由 resolv.conf(5) 控制。 /etc/resolv.conf 文件中最常见的条目是:

Table 6: resolv.conf 常见条目
条目 说明
nameserver 解析器应查询的名称服务器的 IP 地址。服务器按列出的顺序查询,最多三个
search 主机名查找的搜索列表。通常由本地主机名的域确定
domain 本地域名

典型的 /etc/resolv.conf 文件如下:

search example.com
nameserver 223.5.5.5
nameserver 223.6.6.6
  • search 和 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 配置文件的自动更新

网络故障排除

首先检查以下基本要素:

  • 电源连接是否正常?
  • 路由器是否正常工作?
  • 宽带或网络费用是否缴纳?
  • 是否是区域性大规模网络中断事件?
  • 计算机的时间是否正确?
  • 网线是否连接正常?
  • 网络服务是否正确配置?
  • 防火墙是否正确配置?
  • 网卡是否受 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 无规则时默认放行

查看网卡速率

如需实时监控网络接口的流量统计信息,可使用 systat 工具的网络接口视图。该命令以指定的刷新间隔显示各网络接口的接收和发送流量数据:

$ systat -ifstat 2

其中 -ifstat 参数指定显示网络接口信息,数字 2 表示刷新间隔为 2 秒

查看 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

附录:/etc/rc.conf 网络配置示例

修改 /etc/rc.conf 文件后,需重启系统或依次运行命令 service netif restart 与 service routing restart 来应用网络更改

主机名(不得为空,否则无法使用 Xorg):

hostname="ykla"

动态 DHCP 方式

动态 DHCP 方式:使网卡 igc0 使用 DHCP:

ifconfig_igc0="DHCP"

静态 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"
Next:无线网络 Home: 高级网络