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 命令管理。以太网帧的发送和接收、地址解析 ARPAddress Resolution Protocol 均在该层完成
第二层 互联网层 Internet Layer 负责数据包的路由和转发,核心协议为 IP Internet Protocol ,同时处理逻辑寻址 IP 地址 、分片与重组、路由选择等功能。路由表管理和 route 命令操作均属于该层
第三层 传输层 Transport Layer 提供端到端的通信服务,主要协议为 TCP Transmission Control ProtocolUDP 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.2550xffffffff

例如,假设以下情况: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: 高级网络