# 14.1 网络基础配置

网络基础配置是指对 FreeBSD 操作系统网络通信基础设施进行设置的过程，包括 DNS 配置、网络接口管理、IP 地址设置等内容。这些配置构成了 FreeBSD 网络通信的基础，对于系统的网络连通性和可用性至关重要。

## 手动设置 `resolv.conf` 文件

### DNS 配置文件的动态特性

手动编辑 `/etc/resolv.conf` 后，重启系统时该文件可能被重置，这是因为动态主机配置协议（Dynamic Host Configuration Protocol，DHCP）客户端在获取网络配置时会通过 resolvconf 服务重写该文件。resolvconf 是一个管理系统 DNS 配置的框架，它协调多个来源（如 DHCP、PPP、静态配置等）对 `resolv.conf` 的修改，确保 DNS 配置的一致性。

### 防止 DNS 配置被覆写的方法

若需要使用手动配置的 DNS 服务器而不被系统自动更新覆盖，可通过禁用 resolvconf 服务实现。编辑 `/etc/resolvconf.conf` 文件（如果不存在则创建），写入 `resolvconf=NO` 一行，该配置将禁用系统对 DNS 配置文件的自动更新功能。

### 参考文献

* FreeBSD Project. resolvconf\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/cgi/man.cgi?query=resolvconf>，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 配置被覆写的解决方案。

## `ifconfig` 命令

### 网络接口配置工具概述

`ifconfig` 是用于配置和显示网络接口状态的常用命令，该命令是 FreeBSD 网络配置的核心工具之一，通过与内核网络子系统交互，实现对网络接口的参数配置和状态查询。用户可以使用该命令设置 IP 地址、子网掩码、广播地址等网络参数。

### 网络接口识别

在进行网络配置前，需要确认系统已识别并加载了网卡驱动。使用 `ifconfig` 命令可查看系统中的网络接口列表及其状态。

示例输出：

```sh
# ifconfig
genet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=68000b<RXCSUM,TXCSUM,VLAN_MTU,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
	ether dc:a6:1a:2e:f4:4f
	inet 192.168.123.157 netmask 0xffffff00 broadcast 192.168.123.255
	media: Ethernet autoselect (1000baseT <full-duplex>)
	status: active
	nd6 options=29<PERFORMNUD,IFDISABLED,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>
```

`lo0` 是本地回环接口，用于本机内部通信，不属于物理网卡。如果 `ifconfig` 输出中仅包含 `lo0` 接口，说明系统未识别物理网卡，此时需要检查网卡硬件连接和驱动加载情况。可以通过 `dmesg | grep ether` 命令查看网卡驱动加载日志。

## 配置 DNS 文件

### DNS 解析服务器配置

DNS 配置文件用于指定域名解析服务器，该文件定义了系统进行域名解析时使用的递归 DNS 服务器列表。编辑 `/etc/resolv.conf` 文件，可根据需要清空原有内容或保留现有配置，然后添加 DNS 服务器条目：

```ini
nameserver 223.5.5.5   # 指定首选 DNS 服务器为阿里公共 DNS
nameserver 223.6.6.6   # 指定备用 DNS 服务器为阿里公共 DNS 备选
nameserver 8.8.8.8     # 指定备用 DNS 服务器（Google 公共 DNS）
```

修改 DNS 配置后，需要重启网络服务以使配置生效。重启网络服务将重新加载 `/etc/rc.conf` 中的网络配置参数：

```sh
# service netif restart
```

配置完成后，可使用 `ping` 命令测试与目标域名的连通性（按 Ctrl + C 可中断测试），示例输出如下：

```sh
# ping 163.com
PING 163.com (123.58.180.7): 56 data bytes
64 bytes from 123.58.180.7: icmp_seq=0 ttl=55 time=30.617 ms
64 bytes from 123.58.180.7: icmp_seq=1 ttl=55 time=30.608 ms
64 bytes from 123.58.180.7: icmp_seq=2 ttl=55 time=30.633 ms
Ctrl+C
--- 163.com ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 30.608/30.619/30.633/0.010 ms
```

若能正常收到 ICMP 响应报文，说明网络已连通。

## 混杂模式

### 混杂模式的技术原理

混杂模式（Promiscuous Mode）是一种网络接口工作模式。在该模式下，网络接口控制器（NIC）不再仅过滤目标 MAC 地址与本机地址匹配的帧，而是接收网络链路层上传输的所有数据帧，无论其目标媒体访问控制（Media Access Control，MAC）地址是否为本机。

### 应用场景

这种工作模式在网络协议分析、网络流量监控、安全审计、虚拟化网络环境与容器网络等场景中具有重要应用价值。

如需在系统启动时为指定网络接口配置 IPv4 地址、子网掩码并启用混杂模式，可在 `/etc/rc.conf` 中添加以下配置：

```ini
ifconfig_igc0="inet 192.168.31.77 netmask 255.255.255.0 promisc"
```

### 参考文献

* FreeBSD Project. ifconfig(8)\[EB/OL]. \[2026-03-26]. <https://man.freebsd.org/cgi/man.cgi?ifconfig(8)>，提供 ifconfig 命令的完整技术文档，为网络接口配置提供权威参考。

## `/etc/rc.conf` 网络配置持久化

### 系统启动配置文件概述

`/etc/rc.conf` 是 FreeBSD 系统启动配置文件，用于存储各种系统和服务的启动参数。该文件是系统初始化过程中的核心配置文件之一。

### 网络配置的持久化机制

使用 `ifconfig` 命令进行的网络配置多为一次性配置，系统重启后配置将失效。与一次性配置不同，将网络配置写入 `/etc/rc.conf` 文件可实现配置的持久化，系统启动时会自动读取并应用该文件中的配置参数。

### 网络配置相关文件结构

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

> **注意**：
>
> 修改 `rc.conf` 后，需要重启系统或运行 `/etc/rc.d/netif restart` 来应用网络更改。

```ini
hostname="ykla"  # 主机名，不能为空，否则无法使用 Xorg
ifconfig_igc0="DHCP"  # 让网卡 igc0 使用 DHCP
ifconfig_igc0="inet 192.168.31.77 netmask 255.255.255.0"  # 设置网卡 igc0 的 IPv4 为 192.168.31.77，子网掩码为 255.255.255.0（静态 IP）
defaultrouter="192.168.31.1"  # 默认网关/默认路由，在家中一般是路由器 IP
ifconfig_igc0_alias0="inet 192.168.1.33 netmask 255.255.255.0"  # 设置网卡 igc0 别名 IPv4 192.168.1.33，子网掩码为 255.255.255.0 即拥有额外的 IPv4 地址
static_routes="static1 static2"  # 静态路由，需结合下文使用①
route_static1="-net 10.0.10.0/24 10.0.1.1"  # 如果要访问 10.0.10.0/24 这个网络（10.0.10.0 到 10.0.10.254），就将数据包发送给 10.0.1.1，由它来转发
route_static2="-net 172.16.30.0/24 172.16.1.254"  # 如果要访问 172.16.30.0/24 这个网络（172.16.30.1 到 172.16.30.254），就将数据包发送给 172.16.1.254，由它来转发
```

① 在 `/etc/rc.conf` 中，如果需要一次性写入多个配置项，只能使用 `ABC_XYZ="xxx yyy ccc ddd"` 这种格式。

如果在 `/etc/rc.conf` 中写成以下形式：

```ini
ABC_XYZ="xxx"	# 第一行
ABC_XYZ="yyy"
ABC_XYZ="ccc"
ABC_XYZ="ddd"
```

这种形式下，后续的 `ABC_XYZ` 配置行会覆盖前一行，因此只有最后一行会生效。

## 查看网卡速率

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

```sh
# systat -if 2
```

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

## 查看 FreeBSD 下载流量（bwm-ng）

如需查看更详细的网络流量统计，可安装 `bwm-ng` 工具，该工具提供了多种流量显示格式和交互功能：

```sh
# 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` 可以查阅更多使用方法。

## 课后习题

1. 在 FreeBSD 系统上配置双静态 IP 地址，分别设置不同的 DNS 服务器，然后使用 `dig` 命令验证每个 DNS 服务器的解析行为，分析为什么系统允许同时配置多个 DNS 服务器而不产生冲突。
2. 修改网络接口的 MTU 值为 9000（巨型帧），使用 `ping -M do -s 8972` 命令测试连通性。
3. 禁用 `resolvconf` 服务，然后手动修改 `/etc/resolv.conf` 并重启网络服务，验证配置是否持久化。
