7.3.有线网络 ============ 一旦加载了正确的驱动程序,就需要对网络适配器进行配置。FreeBSD 使用驱动程序名称后面的单元号来命名网络适配器。单元号代表适配器在启动时被检测到或随后被发现的顺序。 例如,\ ``em0`` 是系统中使用 `em(4) `__ 驱动程序的第一个网络接口卡 (NIC)。 要显示网络接口配置,请输入以下命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % ifconfig 输出结果应类似于下面的内容: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session em0: flags=8863 metric 0 mtu 1500 options=481249b 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 ) status: active nd6 options=23 lo0: flags=8049 metric 0 mtu 16384 options=680003 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2 inet 127.0.0.1 netmask 0xff000000 groups: lo nd6 options=21 在此示例中,显示了以下设备: - ``em0``\ : 以太网接口。 - ``lo0``\ :环路接口是一种软件环回机制,可用于性能分析、软件测试和/或本地通信。更多信息请参见 `lo(4) `__\ 。 示例显示 ``em0`` 已启动并运行。 主要指标包括: 1. ``UP`` 表示接口已配置就绪。 2. 接口的 IPv4 (``inet``) 地址是 ``192.168.1.19``\ 。 3. 接口的 IPv6 (``inet6``) 地址是 ``fe80::21f:16ff:fe0f:275a%em0``\ 。 4. 它有一个有效的子网掩码(\ ``netmask``\ ),其中 ``0xffffffff00`` 与 ``255.255.255.0`` 相同。 5. 它有一个有效的广播地址,即 ``192.168.1.255``\ 。 6. 接口(以太网)的 MAC 地址是 ``00:1f:16:0f:27:5a``\ 。 7. 物理介质选择为自动选择模式(介质: 以太网自动选择(1000baseT ))。 8. 链路状态(\ ``status``\ )为活动状态,表示已检测到载波信号。对于 ``em0``\ ,当以太网电缆未插入接口时,状态:无载波状态是正常的。 如果 `ifconfig(8) `__ 的输出显示与下一个输出类似,则表明接口尚未配置: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session em0: flags=8822 metric 0 mtu 1500 options=481249b ether 00:1f:16:0f:27:5a media: Ethernet autoselect status: no carrier nd6 options=29 7.3.1.配置静态 IPv4 地址 ------------------------ 本节将介绍如何在 FreeBSD 系统上配置静态 IPv4 地址。 网络接口卡配置可通过 `ifconfig(8) `__ 命令行执行,但重启后将无法保留,除非配置也添加到 **/etc/rc.conf** 中。 **注意** 如果网络是在安装过程中通过 `bsdinstall(8) `__ 配置的,则网络接口卡 (NIC) 的某些条目可能已经存在。请在执行 `sysrc(8) `__ 之前仔细检查 **/etc/rc.conf**\ 。 可以执行以下命令设置 IP 地址: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # ifconfig em0 inet 192.168.1.150/24 要使更改在重启后仍然有效,请执行以下命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # sysrc ifconfig_em0="inet 192.168.1.150 netmask 255.255.255.0" 执行以下命令添加默认路由器: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # sysrc defaultrouter="192.168.1.1" 将 DNS 记录添加到 **/etc/resolv.conf** 中: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session nameserver 8.8.8.8 nameserver 8.8.4.4 然后重启 ``netif`` 并执行以下 ``routing`` 命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service netif restart && service routing restart 可以使用 `ping(8) `__ 测试连接: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % ping -c2 www.FreeBSD.org 输出结果应类似于下面的内容: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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,请执行以下命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # sysrc ifconfig_em0="DHCP" 可以通过运行以下命令手动使用 `dhclient(8) `__\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # dhclient em0 输出结果应类似于下面的内容: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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) `__\ ,请执行以下命令: .. code:: shell-session # sysrc background_dhclient="YES" 然后执行以下命令重启 ``netif``\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service netif restart 可以使用 `ping(8) `__ 测试连接: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % ping -c2 www.FreeBSD.org 输出结果应类似于下面的内容: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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)的新版本。 与 IPv4 相比,IPv6 具有多项优势和许多新功能: - 其 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 地址有三种不同类型: **Unicast** 发送到单播地址的数据包会到达属于该地址的接口。 **Anycast** 这些地址在语法上与单播地址没有区别,但它们针对的是一组接口。指向任播地址的数据包将到达最近的路由器接口。任播地址只用于路由器。 **Multicast** 这些地址标识一组接口。发送到组播地址的数据包将到达属于组播组的所有接口。IPv4 广播地址(通常为 ``xxx.xxx.xxx.255``\ )在 IPv6 中用组播地址表示。 读取 IPv6 地址时,标准形式表示为 ``x:x:x:x:x: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 地址,请执行以下命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # ifconfig 输出结果应类似于下面的内容: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session em0: flags=8863 metric 0 mtu 1500 options=481249b 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 ) status: active nd6 options=23 在本例中,\ ``em0`` 接口使用的是 ``fe80::21f:16ff:fe0f:275a%em0``\ ,这是一个自动配置的链路本地地址,由 MAC 地址自动生成。 某些 IPv6 地址已被保留。保留地址列表见下表: **表 1.IPv6 保留地址示例** ==================== ==================== =================== ========================================================= **IPv6 地址** **前缀长度(比特)** **描述** **备注** ==================== ==================== =================== ========================================================= ``::`` 128 比特 未指明 相当于 IPv4 中的 ``0.0.0.0``\ 。 ``::1`` 128 比特 回环地址 相当于 IPv4 中的 ``127.0.0.1``\ 。 ``::00:xx:xx:xx:xx`` 96 比特 内置 IPv4 低 32 位是兼容的 IPv4 地址。 ``::ff:xx:xx:xx:xx`` 96 比特 IPv4 映射 IPv6 地址 低 32 位是不支持 IPv6 的主机的 IPv4 地址。 ``fe80::/10`` 10 比特 链接本地 相当于 IPv4 中的 169.254.0.0/16。 ``fc00::/7`` 7 比特 唯一本地 唯一的本地地址用于本地通信,只能在一组合作站点内路由。 ``ff00::`` 8 比特 组播 ``2000::-3fff::`` 3 比特 全局单播 所有全局单播地址都从该地址池中分配。前 3 位是 ``001``\ 。 ==================== ==================== =================== ========================================================= 有关 IPv6 地址结构的更多信息,请参阅 `RFC3513 `__\ 。 7.3.4.配置静态 IPv6 地址 ------------------------ 要将 FreeBSD 系统配置为具有静态 IPv6 地址的 IPv6 客户端,必须设置 IPv6 地址。 执行以下命令以满足要求: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # sysrc ifconfig_em0_ipv6="inet6 2001:db8:4672:6565:2026:5043:2d42:5344 prefixlen 64" 要指定默认路由器,请执行以下命令指定其地址: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # sysrc ipv6_defaultrouter="2001:db8:4672:6565::1" 7.3.5.配置动态 IPv6 地址 ------------------------ 如果网络有 DHCP 服务器,则很容易将网络接口配置为使用 DHCP。\ `dhclient(8) `__ 会自动提供 IP、掩码和默认路由器。 要使接口启用 DHCP,请执行以下命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # sysrc ifconfig_em0_ipv6="inet6 accept_rtadv" # sysrc rtsold_enable="YES" 7.3.6.路由器通告和主机自动配置 ------------------------------ 本节演示如何在 IPv6 路由器上设置 `rtadvd(8) `__\ ,以公告 IPv6 网络前缀和默认路由。 要启用 `rtadvd(8) `__\ ,请执行以下命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # sysrc rtadvd_enable="YES" 指定 IPv6 路由器通告的接口非常重要。例如,告诉 `rtadvd(8) `__ 使用 ``em0``\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # sysrc rtadvd_interfaces="em0" 接下来,创建配置文件 **/etc/rtadvd.conf**\ ,如本例所示: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session em0:\ :addrs#1:addr="2001:db8:1f11:246::":prefixlen#64:tc=ether: 用要使用的接口替换 ``em0``\ ,用分配的前缀替换 ``2001:db8:1f11:246::``\ 。 对于专用的 ``/64`` 子网,无需更改任何其他内容。否则,请将 ``prefixlen#`` 更改为正确的值。 7.3.7.IPv6 和 IPv4 地址映射 --------------------------- 当服务器启用 IPv6 时,可能需要启用 IPv4 映射 IPv6 地址通信。这种兼容性选项允许将 IPv4 地址表示为 IPv6 地址。允许 IPv6 应用程序与 IPv4 通信,反之亦然,这可能是一个安全问题。 大多数情况下可能不需要此选项,仅为兼容而提供。该选项允许纯 IPv6 应用程序在双协议栈环境中与 IPv4 一起工作。这对可能不支持纯 IPv6 环境的第三方应用程序最有用。 要启用此功能,请执行以下命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # sysrc ipv6_ipv4mapping="YES"