% pciconf -lv | grep -A1 -B3 network
第7章 网络
目录
7.1 概要
本章深入探讨了网络配置和性能主题,展示了 FreeBSD 操作系统强大的网络功能。无论是在有线网络还是无线网络中工作,本章都提供了在 FreeBSD 中配置和优化网络连接的全面指南。
在深入探讨细节之前,读者最好对网络概念有所了解,例如协议、网络接口和寻址。
本章涵盖以下内容:
配置 FreeBSD 中的有线网络,包括网络接口设置、地址分配和自定义选项。
掌握在 FreeBSD 中配置无线网络的技能,涵盖无线网络接口设置、安全协议和故障排除技术。
FreeBSD 的网络功能及其在网络性能方面的卓越声誉。
了解 FreeBSD 支持的各种网络服务和协议,并提供 DNS、DHCP 等的配置说明。
有关如何在高级网络中进行高级网络配置的更多信息。
7.2. 设置网络
设置有线或无线连接是 FreeBSD 用户的常见任务。本节将介绍如何识别有线和无线网络适配器以及如何配置它们。
在开始配置之前,有必要了解以下网络数据
如果网络具有 DHCP
如果网络没有 DHCP,则要使用的静态 IP 地址
网络掩码
默认网关的 IP 地址
网络连接可能在安装时由bsdinstall(8)配置。 |
7.2.1. 识别网络适配器
FreeBSD 支持各种各样的网络适配器,包括有线和无线网络。查看所用FreeBSD 版本的硬件兼容性列表,以查看网络适配器是否受支持。
要获取系统使用的网络适配器,请执行以下命令
输出应类似于以下内容
em0@pci0:0:25:0: class=0x020000 rev=0x03 hdr=0x00 vendor=0x8086 device=0x10f5 subvendor=0x17aa subdevice=0x20ee vendor = 'Intel Corporation' (1) device = '82567LM Gigabit Network Connection' (2) class = network subclass = ethernet -- iwn0@pci0:3:0:0: class=0x028000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x4237 subvendor=0x8086 subdevice=0x1211 vendor = 'Intel Corporation' (1) device = 'PRO/Wireless 5100 AGN [Shiloh] Network Connection' (2) class = networ
1 | 显示供应商名称 |
2 | 显示设备名称 |
只有在 FreeBSD 未正确检测到网络接口卡模块时,才需要加载它。 例如,要加载alc(4) 模块,请执行以下命令
或者,要在启动时将驱动程序加载为模块,请将以下行放在/boot/loader.conf中 if_alc_load="YES" |
7.3. 有线网络
加载正确的驱动程序后,需要配置网络适配器。FreeBSD 使用驱动程序名称后跟一个单元编号来命名网络接口适配器。单元编号表示适配器在启动时检测到的顺序,或稍后发现的顺序。
例如,em0
是系统上使用em(4) 驱动程序的第一个网络接口卡 (NIC)。
要显示网络接口配置,请输入以下命令
% ifconfig
输出应类似于以下内容
em0: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=481249b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LRO,WOL_MAGIC,VLAN_HWFILTER,NOMAP> ether 00:1f:16:0f:27:5a inet6 fe80::21f:16ff:fe0f:275a%em0 prefixlen 64 scopeid 0x1 inet 192.168.1.19 netmask 0xffffff00 broadcast 192.168.1.255 media: Ethernet autoselect (1000baseT <full-duplex>) status: active nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL> lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384 options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6> inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2 inet 127.0.0.1 netmask 0xff000000 groups: lo nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
在此示例中,显示了以下设备
em0
:以太网接口。lo0
:环回接口是一种软件环回机制,可用于性能分析、软件测试和/或本地通信。更多信息请参见lo(4)。
此示例显示 em0
正在运行。
关键指标是
UP
表示接口已配置并准备就绪。该接口具有 IPv4 Internet (
inet
) 地址192.168.1.19
。该接口具有 IPv6 Internet (
inet6
) 地址fe80::21f:16ff:fe0f:275a%em0
。它具有有效的子网掩码 (
netmask
),其中0xffffff00
等于255.255.255.0
。它具有有效的广播地址
192.168.1.255
。接口的 MAC 地址 (
ether
) 为00:1f:16:0f:27:5a
。物理介质选择处于自动选择模式 (
media: Ethernet autoselect (1000baseT <full-duplex>)
)。链路状态 (
status
) 为active
,表示检测到载波信号。对于em0
,当未将以太网电缆插入接口时,status: no carrier
状态是正常的。
如果ifconfig(8) 输出显示的内容类似于下一个输出,则表明接口尚未配置
em0: flags=8822<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=481249b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LRO,WOL_MAGIC,VLAN_HWFILTER,NOMAP> ether 00:1f:16:0f:27:5a media: Ethernet autoselect status: no carrier nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
7.3.1. 配置静态 IPv4 地址
本节提供了有关在 FreeBSD 系统上配置静态 IPv4 地址的指南。
可以使用ifconfig(8) 从命令行执行网络接口卡配置,但除非将配置也添加到/etc/rc.conf,否则在重新引导后不会持久保留。
如果网络在安装期间由bsdinstall(8)配置,则网络接口卡 (NIC) 的某些条目可能已存在。在执行sysrc(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"
添加默认路由器,执行以下命令
# sysrc defaultrouter="192.168.1.1"
将 DNS 记录添加到/etc/resolv.conf
nameserver 8.8.8.8 nameserver 8.8.4.4
然后重新启动 netif
和 routing
,执行以下命令
# service netif restart && service routing restart
可以使用ping(8)测试连接
% ping -c2 www.FreeBSD.org
输出应类似于以下内容
PING web.geo.FreeBSD.org (147.28.184.45): 56 data bytes 64 bytes from 147.28.184.45: icmp_seq=0 ttl=51 time=55.173 ms 64 bytes from 147.28.184.45: icmp_seq=1 ttl=51 time=53.093 ms --- web.geo.FreeBSD.org ping statistics --- 2 packets transmitted, 2 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 53.093/54.133/55.173/1.040 ms
7.3.2. 配置动态 IPv4 地址
如果网络具有 DHCP 服务器,则配置网络接口以使用 DHCP 非常容易。FreeBSD 使用dhclient(8) 作为 DHCP 客户端。dhclient(8) 将自动提供 IP、网络掩码和默认路由器。
要使接口与 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 unknown dhcp option value 0x7d bound to 192.168.1.19 -- renewal in 43200 seconds.
这样可以验证使用 DHCP 分配地址是否正常工作。
dhclient(8) 客户端可以在后台启动。这可能会导致依赖于正常网络的应用程序出现问题,但在许多情况下,它将提供更快的启动速度。 要在后台执行dhclient(8),请执行以下命令
|
然后重新启动 netif
,执行以下命令
# service netif restart
可以使用ping(8)测试连接
% ping -c2 www.FreeBSD.org
输出应类似于以下内容
PING web.geo.FreeBSD.org (147.28.184.45): 56 data bytes 64 bytes from 147.28.184.45: icmp_seq=0 ttl=51 time=55.173 ms 64 bytes from 147.28.184.45: icmp_seq=1 ttl=51 time=53.093 ms --- web.geo.FreeBSD.org ping statistics --- 2 packets transmitted, 2 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 53.093/54.133/55.173/1.040 ms
7.3.3. IPv6
IPv6 是众所周知的 IP 协议的新版本,也称为 IPv4。
IPv6 在提供 IPv4 的所有优势的同时,还提供了许多新功能
其 128 位地址空间允许使用 340,282,366,920,938,463,463,374,607,431,768,211,456 个地址。这解决了 IPv4 地址短缺和最终的 IPv4 地址耗尽问题。
路由器仅在其路由表中存储网络聚合地址,从而将路由表的平均空间减少到 8192 个条目。这解决了与 IPv4 相关的可扩展性问题,IPv4 要求在互联网路由器之间交换每个分配的 IPv4 地址块,导致其路由表变得过大,无法实现高效路由。
地址自动配置 (RFC2462)。
强制性多播地址。
内置 IPsec(IP 安全)。
简化的报头结构。
支持移动 IP。
IPv6 到 IPv4 的过渡机制。
FreeBSD 包含KAME 项目 的 IPv6 参考实现,并附带使用 IPv6 所需的一切。
本节重点介绍如何配置和运行 IPv6。
IPv6 地址有三种不同的类型
- 单播
发送到单播地址的数据包将到达属于该地址的接口。
- 任播
这些地址在语法上与单播地址没有区别,但它们是针对一组接口的。发送到任播地址的数据包将到达最近的路由器接口。任播地址仅由路由器使用。
- 多播
这些地址标识一组接口。发送到多播地址的数据包将到达属于该多播组的所有接口。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
。
通常,地址将具有长串的全零子字符串。可以使用 ::
(双冒号)替换每个地址的一个子字符串。此外,每个十六进制值的前面最多可以省略三个 0
。例如,fe80::1
对应于规范形式 fe80:0000:0000:0000:0000:0000:0000:0001
。
第三种形式是用众所周知的 IPv4 表示法编写最后 32 位。例如,2002::10.0.0.1
对应于十六进制规范表示 2002:0000:0000:0000:0000:0000:0a00:0001
,这又等效于 2002::a00:1
。
要查看 FreeBSD 系统的 IPv6 地址,请执行以下命令
# ifconfig
输出应类似于以下内容
em0: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=481249b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LRO,WOL_MAGIC,VLAN_HWFILTER,NOMAP> ether 00:1f:16:0f:27:5a inet 192.168.1.150 netmask 0xffffff00 broadcast 192.168.1.255 inet6 fe80::21f:16ff:fe0f:275a%em0 prefixlen 64 scopeid 0x1 media: Ethernet autoselect (1000baseT <full-duplex>) status: active nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
在此示例中,em0
接口使用 fe80::21f:16ff:fe0f:275a%em0
,这是一个从 MAC 地址自动生成的自动配置的链接本地地址。
一些 IPv6 地址是保留的。可以在下表中查看保留地址列表
IPv6 地址 | 前缀长度(位) | 描述 | 注释 |
---|---|---|---|
| 128 位 | 未指定 | 相当于 IPv4 中的 |
| 128 位 | 环回地址 | 相当于 IPv4 中的 |
| 96 位 | 嵌入式 IPv4 | 较低的 32 位是兼容的 IPv4 地址。 |
| 96 位 | IPv4 映射的 IPv6 地址 | 较低的 32 位是不支持 IPv6 的主机的 IPv4 地址。 |
| 10 位 | 链接本地 | 相当于 IPv4 中的 169.254.0.0/16。 |
| 7 位 | 唯一本地 | 唯一本地地址旨在用于本地通信,并且仅在特定的一组协作站点内可路由。 |
| 8 位 | 多播 | |
| 3 位 | 全局单播 | 所有全局单播地址都从此池分配。前 3 位为 |
有关 IPv6 地址结构的更多信息,请参阅RFC3513。
7.3.4. 配置静态 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"
7.3.5. 配置动态 IPv6 地址
如果网络具有 DHCP 服务器,则配置网络接口以使用 DHCP 非常容易。dhclient(8) 将自动提供 IP、网络掩码和默认路由器。
要使接口在没有 DHCP 的情况下工作,请执行以下命令
# sysrc ifconfig_em0_ipv6="inet6 accept_rtadv"
# sysrc rtsold_enable="YES"
7.3.6. 路由器通告和主机自动配置
本节演示如何在 IPv6 路由器上设置rtadvd(8) 以通告 IPv6 网络前缀和默认路由。
要启用rtadvd(8),请执行以下命令
# sysrc rtadvd_enable="YES"
指定进行 IPv6 路由器通告的接口非常重要。例如,要告诉 rtadvd(8) 使用 em0
# sysrc rtadvd_interfaces="em0"
接下来,创建配置文件 /etc/rtadvd.conf,如本例所示
em0:\ :addrs#1:addr="2001:db8:1f11:246::":prefixlen#64:tc=ether:
将 em0
替换为要使用的接口,将 2001:db8:1f11:246::
替换为分配的前缀。
对于专用的 /64
子网,无需更改其他内容。否则,将 prefixlen#
更改为正确的值。
7.4. 无线网络
大多数无线网络基于 IEEE® 802.11 标准。
802.11ac 在 FreeBSD 上的支持目前正在开发中。 |
基本的无线网络由多个站点组成,这些站点通过无线电进行通信,这些无线电在 2.4GHz 或 5GHz 频段广播,尽管这因地区而异,并且还在发生变化以支持在 2.3GHz 和 4.9GHz 范围内进行通信。
配置无线网络有三个基本步骤
扫描并选择接入点
对站点进行身份验证
配置 IP 地址或使用 DHCP。
以下各节将讨论每个步骤。
7.4.1. 连接到无线网络的快速入门
将 FreeBSD 连接到现有的无线网络是一种非常常见的情况。
此过程显示了所需的步骤
第一步是从网络管理员处获取无线网络的 SSID(服务集标识符)和 PSK(预共享密钥)。
第二步是为此网络添加一个条目到 /etc/wpa_supplicant.conf 中。如果文件不存在,请创建它
network={ ssid="myssid" (1) psk="mypsk" (2) }
1 | 是无线网络的 SSID。将其替换为无线网络的名称。 |
2 | 是无线网络的 PSK。将其替换为无线网络的密码。
|
# sysrc wlans_iwn0="wlan0"
# sysrc ifconfig_wlan0="WPA DHCP"
最后一步是重新启动
netif
服务,执行以下命令
# service netif restart
7.4.2. 基本无线配置
第一步是将无线网卡配置到接口。要了解系统中有哪些无线网卡,请查看 识别网络适配器 部分。
# ifconfig wlan0 create wlandev iwm0
要使更改在重新引导后保持持久,请执行以下命令
# sysrc wlans_iwm0="wlan0"
由于世界各地的监管情况不同,因此有必要正确设置适用于您所在位置的域,以便获得有关可以使用哪些信道的正确信息。 可在 /etc/regdomain.xml 中找到可用的区域定义。要设置运行时数据,请使用
要使设置持久化,请将其添加到 /etc/rc.conf 中
|
7.4.3. 扫描无线网络
可以使用 ifconfig(8) 扫描可用的无线网络。
要列出无线网络,请执行以下命令
# ifconfig wlan0 up list scan
输出应类似于以下内容
SSID/MESH ID BSSID CHAN RATE S:N INT CAPS FreeBSD e8:d1:1b:1b:58:ae 1 54M -47:-96 100 EP RSN BSSLOAD HTCAP WPS WME NetBSD d4:b9:2f:35:fe:08 1 54M -80:-96 100 EP RSN BSSLOAD HTCAP WPS WME OpenBSD fc:40:09:c6:31:bd 36 54M -94:-96 100 EPS VHTPWRENV APCHANREP RSN WPS BSSLOAD HTCAP VHTCAP VHTOPMODE WME GNU-Linux dc:f8:b9:a0:a8:e0 44 54M -95:-96 100 EP WPA RSN WPS HTCAP VHTCAP VHTOPMODE WME VHTPWRENV Windows 44:48:b9:b3:c3:ff 44 54M -84:-96 100 EP BSSLOAD VHTPWRENV HTCAP WME RSN VHTCAP VHTOPMODE WPS MacOS 46:48:b9:b3:c3:ff 44 54M -84:-96 100 EP BSSLOAD VHTPWRENV HTCAP WME RSN VHTCAP VHTOPMODE WPS
SSID/MESH ID 标识网络的名称。
BSSID 标识接入点的 MAC 地址。
CAPS 字段标识每个网络的类型以及在其上运行的站点的功能(有关详细信息,请参阅 ifconfig(8) 中
list scan
的定义)。
7.4.4. 连接和身份验证到无线网络
从扫描到的网络列表中选择无线网络后,需要执行连接和身份验证。在绝大多数无线网络中,身份验证是通过在路由器中配置的密码完成的。其他方案需要在数据流量开始流动之前完成加密握手,方法是使用预共享密钥或机密,或更复杂的方案,这些方案涉及后端服务(如 RADIUS)。
7.4.4.1. 使用 WPA2/WPA/Personal 进行身份验证
无线网络中的身份验证过程由 wpa_supplicant(8) 管理。
wpa_supplicant(8) 配置将在 /etc/wpa_supplicant.conf 文件中进行。有关更多信息,请参阅 wpa_supplicant.conf(5)。
完成无线网络扫描后,选择了网络并获得了密码(PSK),该信息将添加到 /etc/wpa_supplicant.conf 文件中,如下例所示
network={ scan_ssid=1 (1) ssid="FreeBSD" (2) psk="12345678" (3) }
1 | SSID 扫描技术。仅当网络隐藏时才需要使用此选项。 |
2 | 网络名称。 |
3 | 无线网络的密码。 |
下一步是在 /etc/rc.conf 文件中配置无线连接。
要使用静态地址,需要执行以下命令
# sysrc ifconfig_wlan0="inet 192.168.1.20 netmask 255.255.255.0"
要使用动态地址,需要执行以下命令
# sysrc ifconfig_wlan0="WPA DHCP"
然后重新启动网络,执行以下命令
# service netif restart
有关如何执行更高级别的身份验证方法的更多信息,请参阅 无线高级身份验证。 |
7.4.4.2. 使用开放网络进行身份验证
重要的是,用户在连接到没有任何身份验证的开放网络时要非常小心。 |
完成无线网络扫描并选择无线网络的 SSID 后,执行以下命令
# ifconfig wlan0 ssid SSID
然后执行 dhclient(8) 以获取配置的地址
# dhclient wlan0
7.4.5. 使用有线和无线连接
有线连接提供更好的性能和可靠性,而无线连接提供灵活性和移动性。笔记本电脑用户通常希望在这两种类型的连接之间无缝漫游。
在 FreeBSD 上,可以以“故障转移”方式将两个或更多网络接口组合在一起。这种类型的配置使用一组网络接口中最优选且可用的连接,并且当链路状态发生变化时,操作系统会自动切换。
链路聚合和故障转移在 链路聚合和故障转移 中进行了介绍,并在 以太网和无线接口之间的故障转移模式 中提供了一个使用有线和无线连接的示例。
7.6. DNS
DNS 可以理解为 电话簿,其中将 IP 标识为主机名,反之亦然。
有三个文件处理 FreeBSD 系统如何与 DNS 交互。这三个文件是 hosts(5)、resolv.conf(5) 和 nsswitch.conf(5)
除非 /etc/nsswitch.conf 文件中另有说明,否则 FreeBSD 将查看 /etc/hosts 文件中的地址,然后查看 /etc/resolv.conf 文件中的 DNS 信息。
nsswitch.conf(5) 文件指定 nsdispatch(名称服务切换调度程序)应如何操作。 默认情况下,/etc/nsswitch.conf 文件的 hosts 部分如下所示 hosts: files dns 例如,在使用 nscd(8) 服务的情况下。可以通过将行保留如下所示来更改首选项顺序 hosts: files cache dns |
7.6.1. 本地地址
/etc/hosts 文件是一个简单的文本数据库,它提供主机名到 IP 地址的映射。可以将通过 LAN 连接的本地计算机的条目添加到此文件中,以实现简单的命名目的,而不是设置 DNS 服务器。此外,/etc/hosts 可用于提供 Internet 名称的本地记录,从而减少查询外部 DNS 服务器以获取常用名称的需要。
例如,在本地环境中拥有 www/gitlab-ce 的本地实例的情况下,可以将其作为如下添加到 /etc/hosts 文件中
192.168.1.150 git.example.com git
7.6.2. 配置名称服务器
FreeBSD 系统如何访问 Internet 域名系统 (DNS) 由 resolv.conf(5) 控制。
对 /etc/resolv.conf 的最常见条目是
| 解析器应查询的名称服务器的 IP 地址。这些服务器按照列出的顺序进行查询,最多查询三个。 |
| 主机名查找的搜索列表。这通常由本地主机名的域名确定。 |
| 本地域名。 |
一个典型的 /etc/resolv.conf 文件如下所示
search example.com nameserver 147.11.1.11 nameserver 147.11.100.30
只能使用 |
当使用 DHCP 时,dhclient(8) 通常会使用从 DHCP 服务器接收到的信息重写 /etc/resolv.conf 文件。
如果正在进行配置的机器 **不是** DNS 服务器,则可以使用 local-unbound(8) 来提高 DNS 查询性能。 要在启动时启用它,请执行以下命令
要启动 local-unbound(8) 服务,请执行以下命令
|
7.7. 故障排除
在对硬件和软件配置进行故障排除时,请先检查简单的事项。
网络电缆是否已插入?
网络服务是否已正确配置?
防火墙是否已正确配置?
FreeBSD 是否支持网卡?
路由器是否正常工作?
在发送错误报告之前,请务必检查 FreeBSD 发布页面 中的硬件说明,将 FreeBSD 版本更新到最新的稳定版本,检查邮件列表存档并搜索互联网。 |
7.7.1. 有线网络故障排除
如果网卡工作正常,但性能不佳,请阅读 tuning(7)。此外,请检查网络配置,因为不正确的网络设置会导致连接速度缓慢。
如果系统无法将数据包路由到目标主机,则会出现 No route to host
消息。如果未指定默认路由或电缆已拔出,则可能发生这种情况。检查 netstat -rn
的输出,并确保存在到主机的有效路由。如果不存在,请阅读 网关和路由。
7.7.2. 无线网络故障排除
本节介绍了一些帮助解决常见无线网络问题的步骤。
如果扫描时未列出访问点,请检查配置是否已将无线设备限制在有限的信道集中。
如果设备无法与访问点关联,请验证配置是否与访问点上的设置匹配。这包括身份验证方案和任何安全协议。尽可能简化配置。如果使用 WPA2 或 WPA 等安全协议,请将访问点配置为开放身份验证且无安全设置,以查看是否可以通过流量。
一旦系统可以与访问点关联,请使用 ping(8) 等工具诊断网络配置。
还有许多更低级别的调试工具。可以使用 wlandebug(8) 在 802.11 协议支持层中启用调试消息。
上次修改时间:2024 年 9 月 20 日,作者 Fernando Apesteguía