第 5 章 网络设置

[提示]提示

关于GNU/Linux网络的通用手册,请查看Linux 网络管理员手册

[提示]提示

关于Debian专属的网络手册,请查看Debian管理员手册—网络配置

[警告]警告

为代替使用传统的网络接口名称的方案 (“eth0“, “eth1“, “wlan0“, …), 新的 systemd 使用”enp0s25“ 之类的 “可预测网络接口名称“.

[警告]警告

本章是基于 2013 年发布的 Debian 7.0 (Wheezy) 编写的,所以其内容正在变得过时。

[提示]提示

尽管本手册仍用旧的 ifconfig(8) 命令和IPv4协议当作网络配置的例子,Debian在 wheezy 发行版后转向使用ip(8)命令和 IPv4+IPv6 协议。欢迎大家提供补丁,更新这个手册。

[提示]提示

systemd环境下,可以用networkd来配置网络。请参考systemd-networkd(8)。

5.1. 基本网络架构

让我们来回顾一下现代Debian操作系统中的基本网络架构。

表 5.1. 网络配置工具一览表

软件包流行度大小类型说明
ifupdownV:587, I:991217配置::ifupdown用来启动/关闭网络的标准工具(Debian特有)
ifplugdV:3, I:18217同上自动管理有线网络
ifupdown-extraV:0, I:1106同上网络测试脚本,加强”ifupdown“软件包的功能
ifmetricV:0, I:137同上设置网络接口的路由度量
guessnetV:0, I:0422同上脚本文件,利用”/etc/network/interfaces“文件来加强”ifupdown“的功能
ifschemeV:0, I:059同上映射脚本文件,增强”ifupdown“软件包的功能
network-managerV:358, I:44014957配置::NMNetworkManager(守卫进程):自动管理网络
network-manager-gnomeV:132, I:3725540同上NetworkManager(GNOME前端)
wicdI:2436()配置::wicd有线和无线网络管理器(元软件包)
wicd-cliV:0, I:160()同上有线和无线网络管理器(命令行客户端)
wicd-cursesV:0, I:3176()同上有线和无线网络管理器(文本界面客户端)
wicd-daemonV:19, I:26992()同上有线和无线网络管理器(守护进程)
wicd-gtkV:15, I:25576(*)同上有线和无线网络管理器(GTK+客户端)
iptablesV:300, I:9932520配置::Netfilter封包过滤和网络地址转换管理工具(Netfilter
iproute2V:672, I:9262867配置::iproute2iproute2, IPv6和其他高级网络配置:ip(8),tc(8)等等
ifrenameV:0, I:3125同上根据不同的静态标准来重命名网络接口:ifrename(8)
ethtoolV:102, I:261597同上显示或更改以太网设备的设定
iputils-pingV:234, I:997113测试::iproute2测试能否连接远程主机,通过主机名IP 地址iproute2
iputils-arpingV:8, I:12755同上测试能否连接远程主机,通过ARP地址
iputils-tracepathV:4, I:6072同上跟踪访问远程主机的路径
net-toolsV:234, I:634991配置::net-toolsNET-3网络工具箱(net-tools,IPv4网络配置):ifconfig(8)等等。
inetutils-pingV:0, I:1359测试::net-tools测试能否连接远程主机,通过hostnameIP 地址(传统方式,GNU)
arpingV:2, I:2977同上测试能否连接远程主机,通过ARP地址(传统方法)
tracerouteV:63, I:936159同上跟踪连接远程主机的路径(传统方法,控制台)
isc-dhcp-clientV:231, I:979686配置::底层DHCP客户端
wpasupplicantV:332, I:5073436同上WPA和WPA2客户端支持(IEEE 802.11i)
wpaguiV:0, I:2781同上wpasupplicant Qt 图形界面客户端
wireless-toolsV:188, I:254297同上操控Linux无线扩展的工具
pppV:206, I:4741054同上使用chat连接PPP/PPPoE
pppoeconfV:0, I:8192配置::辅助配置助手,以便于使用PPPoE连接
pppconfigV:1, I:2801同上配置助手,以便于使用chat连接PPP
wvdialV:0, I:5249同上配置助手,以便于使用wvdialppp连接PPP
mtr-tinyV:6, I:54161测试::底层追踪连接远程主机的路径(文本界面)
mtrV:4, I:43214同上追踪连接远程主机的路径(文本界面和GTK+界面)
gnome-nettoolV:2, I:452105同上获取常见网络信息的工具(GNOME)
nmapV:31, I:2534452同上网络映射/端口扫描(Nmap,控制台)
zenmapV:2, I:92939同上网络映射/端口扫描(GTK+)
tcpdumpV:19, I:2041329同上网络流量分析(Tcpdump,控制台)
wiresharkI:5564同上网络流量分析(Wireshark,GTK+)
tsharkV:3, I:34407同上网络流量分析(控制台)
tcptraceV:0, I:3401同上根据tcpdump的输出生成的连接数据统计
snortV:0, I:12206同上灵活的网络入侵侦测系统(<a class=”ulink” href=”https://zh.wikipedia.org/wiki/Snort(software)”>Snort)
ntopngV:1, I:2969同上在网页浏览器中展示网络流量
dnsutilsV:64, I:517256同上BIND软件包提供的网络客户端程序:nslookup(8),nsupdate(8),dig(8)
dlintV:0, I:753同上利用域名服务器查询来查看DNS域信息
dnstracerV:0, I:261同上跟踪DNS查询直至源头

5.1.1. 主机名解析

主机名解析,目前也是由 NSS (名字服务转换 Name Service Switch) 机制来支持。这个解析的流程如下。

  1. /etc/nsswitch.conf“ 文件里的 “hosts: files dns“ 这段规定主机名解析顺序。 (代替 “/etc/host.conf“ 文件里的”order“ 这段原有的功能。)

  2. files 方式首先被调用。如果主机名在 “/etc/hosts“ 文件里面发现,则返回所有有效地址并退出。 ( “/etc/host.conf“ 文件包含 “multi on“.)

  3. dns 方式被调用。如果主机名通过查询 “/etc/resolv.conf“ 文件里面写的 互联网域名系统 Domain Name System (DNS) 来找到,则返回所有有效地址并退出。

例如, “/etc/hosts“ 看起来如下。

  1. 127.0.0.1 localhost
  2. 127.0.1.1 <host_name>
  3. # The following lines are desirable for IPv6 capable hosts
  4. ::1 ip6-localhost ip6-loopback
  5. fe00::0 ip6-localnet
  6. ff00::0 ip6-mcastprefix
  7. ff02::1 ip6-allnodes
  8. ff02::2 ip6-allrouters
  9. ff02::3 ip6-allhosts

每一行由 IP 地址 开始,接下来是相关联的主机名.

在这个例子的第二行 127.0.1.1 IP 地址也许不会在其它类 Unix 系统发现。Debian Installer 为没有永久 IP 地址的系统创建这个条目,作为某些软件(如 GNOME)的一个变通方法,见文档 bug #719621.

<host_name> 匹配在”/etc/hostname“里定义的主机名。

对于有永久 IP 地址的系统,这个永久 IP 地址应当代替这里的 127.0.1.1

对于有永久 IP 地址和有 域名系统 Domain Name System (DNS)提供完全资格域名 fully qualified domain name (FQDN) 的系统,规范名 <host_name>.<domain_name> 应当被用来代替 <host_name>.

如果 resolvconf 软件包没有安装,”/etc/resolv.conf“ 是一个静态文件。如果安装了,它是一个符号链接。此外,它包含有解析策略的初始化信息。如 DNS 是 IP=”192.168.11.1“,则包含如下。

  1. nameserver 192.168.11.1

resolvconf 软件包使这个 “/etc/resolv.conf“ 文件成为一个符号链接,并通过钩子脚本自动管理其内容。

对于典型 adhoc 局域网环境下的 PC 工作站,除了基本的 filesdns 方式之外,主机名还能够通过组播 DNS (mDNS, 零配置网络 Zeroconf)进行解析。

  • Avahi) 提供 Debian 下的组播 DNS 发现框架。

  • 它和 Apple Bonjour / Apple Rendezvous 相当.

  • libnss-mdns 插件包提供 mDNS 的主机名解析,GNU C 库 (glibc)的 GNU 名字服务转换 Name Service Switch (NSS) 功能支持 mDNS。

  • /etc/nsswitch.conf“ 文件应当有像 “hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4“ 这样的一段.

  • “.local”结尾的主机名,使用 pseudo-top-level domain (TLD) 来解析.

  • mDNS IPv4 本地连接组播地址 “224.0.0.251“ 或它相应的 IPv6 地址 “FF02::FB“ 被用来作为 “.local“ 结尾名字的 DNS 查询。

较老的 Windows 系统安装 winbind 软件包来提供旧的 NETBios over TCP/IP 主机名解析。为启用这个功能,”/etc/nsswitch.conf“ 文件应当有这样的一段: “hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 wins“。 (现代 Windows 系统通常使用 dns 方式来进行主机名解析。)

[注意]注意

域名系统 Domain Name System 中的扩展通用顶级域名 expansion of generic Top-Level Domains (gTLD) 还在进行中。在局域网内,选择一个域名时,请提防名字冲突 name collision

5.1.2. 网络接口名称

网络接口名称,比如说 eth0, 是在 Linux 内核里分配给每一个硬件的,当这个硬件被内核发现的时候,通过用户层的配置机制udev (参见 第 3.3 节 “udev 系统”)来分配.网卡接口名称也就是 ifup(8) 和 interfaces(5)里的 physical interface

为了保证每个网络接口名称在每次重启后一致,会用到 MAC 地址 等,有一个规则文件”/etc/udev/rules.d/70-persistent-net.rules“. 这个文件是由”/lib/udev/write_net_rules“ 程序自动生成,是由 “persistent-net-generator.rules“ 规则文件来运行. 你可以修改该文件来改变命名规则。

[小心]小心

当编辑 “/etc/udev/rules.d/70-persistent-net.rules“ 规则文件时,你必须保持每条规则在单独的一行中,并且 MAC 地址 要小写。比如说,如果你发现”FireWire device” 和”PCI device” 在这个文件中,你也许想命名”PCI device” 作为 eth0,并配置它为首要网络接口。

5.1.3. 局域网网络地址范围

让我们重新提醒下在 rfc1918 里规定的局域网 local area networks (LANs)IPv4 32 位地址在各类地址的保留范围. 这些地址保证不会与因特网上专有的地址冲突。

表 5.2. 网络地址范围列表

类别网络地址子网掩码子网掩码/位数# 子网数
A10.x.x.x255.0.0.0/81
B172.16.x.x — 172.31.x.x255.255.0.0/1616
C192.168.0.x — 192.168.255.x255.255.255.0/24256
[注意]注意

如果这些地址分配到一个主机,那么这个主机一定不能够直接访问互联网,必须通过一个作为网关的代理服务或通过 网络地址转换 Network Address Translation (NAT). 消费局域网环境,宽带路由器通常使用 NAT。

5.1.4. 网络设备支持

尽管 Debian 系统支持大多数硬件设备,但依旧有一些网络设备需要 DFSG non-free 固件来支持它们。参见 第 9.9.6 节 “硬件驱动和固件”

5.2. 现代的桌面网络配置

对于使用 systemd 的现代 Debian 桌面系统,网络接口通常由两个服务进行初始化:lo 接口通常在“networking.service”处理,而其它接口则由“NetworkManager.service”处理。

Debian squeeze 和新的发行版都可以通过后台守护进程(daemon))管理软件来管理网络连接,例如 NetworkManager (NM)(network-manager 和相关软件包)或 Wicd)(wicd 和相关软件包)。

  • 它们有自己的 GUI 和命令行程序来作为用户界面。

  • 它们有自己的后台守护进程(daemon))作为它们的系统后端。

  • 它们使你可以简单地将系统连接到网络。

  • 它们使你可以简单地管理有线和无线网络的配置。

  • 它们允许你配置网络而不依赖传统的 ifupdown 软件包。

[注意]注意

不要在服务器上使用这些自动网络配置工具。它们主要针对于笔记本电脑上的移动桌面用户。

这些现代的网络配置工具需要进行适当的配置,以避免与传统 ifupdown 软件包发生冲突,它的配置文件位于 “/etc/network/interfaces”。

[注意]注意

这些自动网络配置工具的一些功能可能会带来令人烦扰的问题。它们不像传统的 ifupdown 软件包那样健壮。检查 network-manager 的 BTSwicd 的 BTS,来查看当前的问题和限制。

5.2.1. 图形界面的网络配置工具

Debian 系统 NM 和 Wicd 的官方文档分别位于 “/usr/share/doc/network-manager/README.Debian” 和 “/usr/share/doc/wicd/README.Debian”。

本质上,如下操作即可完成桌面的网络配置。

  1. 通过下列命令使桌面用户 foo 归属 “netdev” 组(另外,例如 GNOME 和 KDE 这样的现代桌面环境会通过 D-bus 自动完成该操作)。

    1. $ sudo adduser foo netdev
  2. 使 “/etc/network/interfaces” 的配置保持下面那样简洁。

    1. auto lo
    2. iface lo inet loopback
  3. 通过下列命令重新启动 NM 或 Wicd。

    1. $ sudo /etc/init.d/network-manager restart
    1. $ sudo /etc/init.d/wicd restart
  4. 通过图形界面配置网络。

[注意]注意

只有列在 “/etc/network/interfaces” 中的接口会被 NM 或 Wicd 管理,以避免与 ifupdown 的冲突。

[提示]提示

如果你想扩展 NM 的网络配置功能,请寻找适当的插件模块和补充软件包,例如 network-manager-openconnectnetwork-manager-openvpn-gnomenetwork-manager-pptp-gnomemobile-broadband-provider-infognome-bluetooth 等等。这同样适用于 Wicd。

[小心]小心

这些自动网络配置工具可能无法兼容 “/etc/network/interfaces” 中传统的 ifupdown 的深奥配置,例如 第 5.6 节 “使用 ifupdown 进行基本网络配置(旧)”第 5.7 节 “使用 ifupdown 的高级网络配置(旧)” 中的那些配置。检查 network-manager 的 BTSwicd 的 BTS 来查看当前的问题和限制。

5.3. 没有图像界面的现代网络配置

使用 systemd 的系统中,可以在 /etc/systemd/network/ 里配置网络。参见 systemd-resolved(8)、resolved.conf(5) 和 systemd-networkd(8)。

这个允许在没有图像界面的情况下配置现代网络。

DHCP 客户端的配置可以通过创建 “/etc/systemd/network/dhcp.network“ 文件来进行设置。例如:

  1. [Match]
  2. Name=en*
  3. [Network]
  4. DHCP=yes

一个静态网络配置能够通过创建 “/etc/systemd/network/static.network“ 来设置.比如:

  1. [Match]
  2. Name=en*
  3. [Network]
  4. Address=192.168.0.15/24
  5. Gateway=192.168.0.1

5.4. 传统的网络连接和配置

如果 第 5.2 节 “现代的桌面网络配置” 中描述的方法无法满足你的需要,那你应该使用结合了许多普通工具的传统网络连接和配置方法。

传统网络连接的每个方法都是特定的(参见 第 5.5 节 “网络连接方式(传统)”)。

用于 Linux 底层网络配置的程序有两种类型(参见 第 5.8.1 节 “Iproute2 命令”)。

  • 来自 Linux NET-3 网络系统的旧 net-tools 程序(ifconfig(8)……)。它们中的大多数都已经过时了。

  • 来自现在的 Linux 网络系统的新 Linux iproute2 程序(ip(8)……)。

尽管底层程序十分强大,但它们使用繁琐。因此创建了高层网络配置系统。

ifupdown 软件包是 Debian 中这种高层网络配置系统的实际标准。它让你可以简单地通过例如 “ifup eth0” 这样的命令来打开网络。它的配置文件位于 “/etc/network/interfaces” 中并且其典型内容如下。

  1. auto lo
  2. iface lo inet loopback
  3. auto eth0
  4. iface eth0 inet dhcp

resolvconf 软件包是为了使 ifupdown 系统支持自动重写解析器配置文件 “/etc/resolv.conf” 来使网络地址解析平滑地重新配置。现在,大多数 Debian 网络配置软件包都使用了 resolvconf 软件包(参见 “/usr/share/doc/resolvconf/README.Debian”)。

ifupdown 软件包的辅助脚本,例如 ifplugdguessnetifscheme等,是为了进行网络环境的自动动态配置,例如位于有线局域网中的移动电脑。这些相对来说比较难使用,但在当前的 ifupdown 系统下工作良好。

详细的案例参见 第 5.6 节 “使用 ifupdown 进行基本网络配置(旧)”第 5.7 节 “使用 ifupdown 的高级网络配置(旧)”

5.5. 网络连接方式(传统)

[小心]小心

在这节描述的连接测试方式仅仅用于测试目的。不应当直接用于日常的网络连接。建议你使用 NM, Wicd, 或 ifupdown 包代替。(参见 第 5.2 节 “现代的桌面网络配置”第 5.6 节 “使用 ifupdown 进行基本网络配置(旧)”).

一台电脑典型的网络连接方式和连接路径,能够使用下面的内容概述。

表 5.3. 网络连接方式和连接路径列表

PC连接方式连接路径
串口 (ppp0)PPPmodem ⇔ POTS ⇔ 拨号接入点 ⇔ ISP
以太网口 (eth0)PPPoE/DHCP/Static⇔ 宽带-modem ⇔ 宽带链路 ⇔ 宽带接入点 ⇔ ISP
以太网口 (eth0)DHCP/Static⇔ LAN ⇔ 网络地址转换 (NAT) 的宽带路由器 (⇔ 宽带-modem …)

每种连接方式配置脚本汇总。

表 5.4. 网络连接配置列表

连接方式配置后端包
PPPpppconfig 创建固定的 chatpppconfig, ppp
PPP (选用)wvdialconf 创建启发式的 chatppp, wvdial
PPPoEpppoeconf 创建固定的 chatpppoeconf, ppp
DHCP在 “/etc/dhcp/dhclient.conf“ 里描述isc-dhcp-client
静态 IP (IPv4)在 “/etc/network/interfaces“ 里描述iproutenet-tools (旧)
静态 IP (IPv6)在 “/etc/network/interfaces“ 里描述iproute

网络连接缩略语意义如下。

表 5.5. 网络连接缩略语列表

缩略语说明
POTS普通老式电话服务
BB宽带
BB-service比如说,数字用户线路(DSL),电视线缆,光纤到户 (FTTP)
BB-modem比如说,DSL modem, 线缆 modem, 或光纤网络终端(ONT)
LAN局域网
WAN广域网
DHCP动态主机配置协议
PPP点到点协议
PPPoE以太网上的点到点协议
ISP互联网服务提供商
[注意]注意

通过电视线缆的广域网服务,通常使用 DHCP 或 PPPoE。ADSL 和 FTTP 通常使用 PPPoE。你需要咨询你的互联网服务提供商来获得广域网连接使用的精确配置。

[注意]注意

当宽带路由器用来搭建家庭局域网环境时,局域网上的电脑需要使用宽带路由器上的 网络地址转换(NAT),来连接到广域网。在这样的情况下,局域网上的电脑网络接口需使用静态 IP 或者宽带路由器提供的 DHCP 服务。宽带路由器必须按 ISP 的指引来配置连接到广域网。

5.5.1. 以太网 DHCP 连接

典型的现代家庭和小的商业网络,也就是局域网,使用一些消费等级的宽带路由器连接到广域网(因特网)。路由器后面的局域网通常使用路由器上运行的动态主机配置协议(DHCP) 服务端提供的服务。

仅仅需要安装 isc-dhcp-client 包为以太网提供动态主机配置协议 (DHCP)服务。

参见 dhclient.conf(5).

5.5.2. 以太网静态 IP 连接

静态 IP 以太网不需要特别的配置动作。

5.5.3. 使用 pppconfig 的 PPP 连接

配置脚本 pppconfig 配置 PPP 连接,仅需要交互式的选择下面内容。

  • 电话号码

  • ISP 用户名

  • ISP 密码

  • 端口速率

  • modem 通信端口

  • 认证方式

表 5.6. 使用 pppconfig 的 PPP 连接配置文件列表

文件功能
/etc/ppp/peers/<isp_name>pppconfig 生成针对 <isp_name> 的 pppd 配置文件
/etc/chatscripts/<isp_name>pppconfig 生成针对 <isp_name> 的 chat 配置文件
/etc/ppp/optionspppd 常用的执行参数
/etc/ppp/pap-secretPAP 的鉴权认证数据 (有安全风险)
/etc/ppp/chap-secretCHAP 的鉴权认证数据(更安全)
[小心]小心

“<isp_name>” 是 “互联网服务提供商“ ,假设 ponpoff 命令调用时,没有参数。

你可以使用下面的底层网络配置工具测试配置。

  1. $ sudo pon <isp_name>
  2. ...
  3. $ sudo poff <isp_name>

参见 “/usr/share/doc/ppp/README.Debian.gz“.

5.5.4. 使用 wvdialconf 的另一种可选的 PPP 连接

一个不同的使用pppd(8) 方案是使用来自 wvdial 包的 wvdial(1)。代替 pppd 运行 chat(8) 来拨号和协商连接,wvdial 进行拨号和初始化协商,然后启动 pppd 进行余下操作。

配置脚本 wvdialconf 配置 PPP 连接,仅需要交互式的选择下面内容。

  • 电话号码

  • ISP 用户名

  • ISP 密码

在大部分情况下,wvdial 能够成功建立连接并自动维护认证鉴权数据。

表 5.7. 使用 wvdialconf 的 PPP 连接配置文件列表

文件功能
/etc/ppp/peers/wvdialwvdialconf 生成针对 wvdialpppd 配置文件
/etc/wvdial.confwvdialconf 生成配置文件
/etc/ppp/optionspppd 常用的执行参数
/etc/ppp/pap-secretPAP 的鉴权认证数据 (有安全风险)
/etc/ppp/chap-secretCHAP 的鉴权认证数据(更安全)

你可以使用下面的底层网络配置工具测试配置。

  1. $ sudo wvdial
  2. ...
  3. $ sudo killall wvdial

参见 wvdial(1) 和 wvdial.conf(5).

5.5.5. 使用 pppoeconf 的 PPPoE 以太网连接

当你的互联网提供商提供 PPPoE 连接,并且你决定把电脑直接连接到广域网,那你的电脑网络必须使用 PPPoE 来配置。PPPoE 表示以太网上的 PPP。配置脚本pppoeconf 交互式的配置 PPPoE 连接。

配置文件在下面。

表 5.8. 使用 pppoeconf 的 PPPoE 连接配置文件列表

文件功能
/etc/ppp/peers/dsl-providerpppoeconf 生成针对pppoepppd 配置文件
/etc/ppp/optionspppd 常用的执行参数
/etc/ppp/pap-secretPAP 的鉴权认证数据 (有安全风险)
/etc/ppp/chap-secretCHAP 的鉴权认证数据(更安全)

你可以使用下面的底层网络配置工具测试配置。

  1. $ sudo /sbin/ifconfig eth0 up
  2. $ sudo pon dsl-provider
  3. ...
  4. $ sudo poff dsl-provider
  5. $ sudo /sbin/ifconfig eth0 down

参见 “/usr/share/doc/pppoeconf/README.Debian“.

5.6. 使用 ifupdown 进行基本网络配置(旧)

Debian 系统上的传统 TCP/IP 网络 搭建,ifupdown 软件包是作为一个上层工具来使用。有两个典型场景。

如果你想设置高级配置,这些传统的设置方法,是相当有用的。在下面的内容中发现细节。

ifupdown 包提供 Debian 系统中标准的高层网络配置框架。在本节中,我们通过 ifupdown 的简单介绍和许多典型列子来学习基本的网络配置。

5.6.1. 简单的命令语法

ifupdown 包包含有两个命令: ifup(8) 和 ifdown(8). 它们提供专注于”/etc/network/interfaces” 配置文件的上层网络配置。

表 5.9. 使用 ifupdown 进行基本网络配置的命令列表

命令操作
ifup eth0如果 “iface eth0“ 节存在,使用 eth0 的配置来启动网络接口 eth0
ifdown eth0如果 “iface eth0“ 节存在,使用 eth0 的配置来关闭网络接口 eth0
[警告]警告

请不要使用 ifconfig(8) 和 ip(8) 这类的底层网络配置工具命令来配置一个 up 状态的接口。

[注意]注意

并没有一个叫 ifupdown 的命令。

5.6.2. “/etc/network/interfaces” 基本语法

在 interfaces(5) 里解释的 “/etc/network/interfaces“ 关键语法,能够用下面的表格概括。

表 5.10. “/etc/network/interfaces“ 里面的节列表

说明
auto <interface_name>当系统启动时,启动接口 < interface_name>
allow-auto <interface_name>同上
allow-hotplug <interface_name>当内核从接口检测到一个热拔插事件时,启动接口 <interface_name>
iface <config_name> …“ 开头的行定义 <config_name> 的网络配置
mapping <interface_name_glob>“ 开头的行定义 <config_name> 的映射值来匹配 <interface_name>
#“ 号开始的行像注释一样忽略(行尾注释被支持)
\“ 反斜杠结尾的行扩展配置到下一行

iface 开头行的节,有下面的语法。

  1. iface <config_name> <address_family> <method_name>
  2. <option1> <value1>
  3. <option2> <value2>
  4. ...

对于基本配置, mapping 节没有被使用,你可以使用网络接口名作为网络配置名。 (参见 第 5.7.5 节 “映射节 mapping stanza”).

[警告]警告

在 “/etc/network/interfaces“里,不要为一个网络接口重复定义”iface“ 节。

5.6.3. 回环网络接口

在启动系统的时候, “/etc/network/interfaces“ 文件里下面的配置条目启动了回环网络接口 lo 。 (通过 auto 节).

  1. auto lo
  2. iface lo inet loopback

这节内容在 “/etc/network/interfaces“ 文件里面一直存在。

5.6.4. 使用 DHCP 的网络接口

第 5.5.1 节 “以太网 DHCP 连接” 准备系统后,在”/etc/network/interfaces“ 里面,按下面的内容创建配置条目后,网络接口的 DHCP 便配置好了。

  1. allow-hotplug eth0
  2. iface eth0 inet dhcp

当 Linux 内核检测到物理接口 eth0, allow-hotplug 节促使 ifup 启动接口,iface 促使 ifup 使用 DHCP 来配置接口。

5.6.5. 使用静态 IP 地址的网络接口

在 “/etc/network/interfaces“ 文件里面创建配置条目,来配置静态 IP 网络接口。如下所示。

  1. allow-hotplug eth0
  2. iface eth0 inet static
  3. address 192.168.11.100
  4. netmask 255.255.255.0
  5. gateway 192.168.11.1
  6. dns-domain example.com
  7. dns-nameservers 192.168.11.1

当 Linux 内核检测到 eth0, allow-hotplug 节促使 ifup 启动接口,iface 节促使 ifup 使用静态 IP 来配置接口。

这里,我假设下面的配置。

  • 局域网的 IP 地址范围: 192.168.11.0 - 192.168.11.255

  • 网关的 IP 地址: 192.168.11.1

  • 电脑的 IP 地址: 192.168.11.100

  • resolvconf 包:已安装

  • 域名: “example.com

  • DNS 服务器的 IP 地址:192.168.11.1

resolvconf 包没有安装时,DNS 相关的配置,需要按下面的方式手工编辑 “/etc/resolv.conf“ 。

  1. nameserver 192.168.11.1
  2. domain example.com
[小心]小心

用在上面例子里的 IP 地址,不意味着照抄。你应当按你实际网络配置调整 IP 地址。

5.6.6. 无线局域网接口基础

无线 LAN (简称 WLAN) 提供快速的无线连接,使用基于 IEEE 802.11 标准集的非授权无线宽带扩频通信技术。

无线接口跟以太网接口非常像,但在初始化时,要求提供一些网络 ID 和密钥数据。他们的上层网络工具差不多和以太网接口一样,除开接口名有一点点不同,按使用的不同内核驱动,像 eth1 , wlan0 , ath0 , wifi0 ……

[提示]提示

wmaster0 设备是主设备,它仅仅只是新的 mac80211 Linux API 里,SoftMAC 使用的一个内部设备。

这里有一些需要记住的 WLAN 关键词。

表 5.11. WLAN 缩写词列表

缩略语全称说明
NWIDNetwork ID802.11 之前 WaveLAN 网络使用的 16 位网络号 (强烈不赞成使用)
(E)SSID(Extended) Service Set Identifier无线接入点 (APs) 的网络名称,互连形成一个完整的 802.11 无线局域网, 域名 ID
WEP, (WEP2)Wired Equivalent Privacy使用 40 位密钥的第一代 64位(128位)无线加密标准(不赞成使用)
WPAWi-Fi Protected Access第二代无线加密标准(实现大部分 802.11i),和 WEP 兼容
WPA2Wi-Fi Protected Access 2第三代无线加密标准(完全的 802.11i),与 WEP 不兼容

实际选择使用的协议是由你配置的无线路由器所限制。

5.6.7. 使用 WPA/WPA2 的无线局域网接口

你需要安装 wpasupplicant 包来支持 WLAN 使用新的 WPA/WPA2.

使用 DHCP 的无线局域网连接,”/etc/network/interfaces“ 文件的条目需要按下面的内容设置。

  1. allow-hotplug ath0
  2. iface ath0 inet dhcp
  3. wpa-ssid homezone
  4. # hexadecimal psk is encoded from a plaintext passphrase
  5. wpa-psk 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f

参见 “/usr/share/doc/wpasupplicant/README.modes.gz“.

5.6.8. 使用 WEP 的无线局域网接口

你需要安装 wireless-tools 包来支撑老的 WEP 无线局域网。(你的消费等级的路由器可能仍然使用不安全的架构,但这总比没有好。)

[小心]小心

请注意:WEP 无线局域网上的网络流量,可以被其他人监听。

使用 DHCP 的无线局域网连接,”/etc/network/interfaces“ 文件的条目需要按下面的内容设置。

  1. allow-hotplug eth0
  2. iface eth0 inet dhcp
  3. wireless-essid Home
  4. wireless-key1 0123-4567-89ab-cdef
  5. wireless-key2 12345678
  6. wireless-key3 s:password
  7. wireless-defaultkey 2
  8. wireless-keymode open

参见 “/usr/share/doc/wireless-tools/README.Debian“.

5.6.9. PPP 连接

你需要按之前的描述配置 PPP 连接(参见 第 5.5.3 节 “使用 pppconfig 的 PPP 连接”). 然后,按下面的方式给第一个 PPP 设备 ppp0 增加 “/etc/network/interfaces“ 文件里的条目.

  1. iface ppp0 inet ppp
  2. provider <isp_name>

5.6.10. 另一种 PPP 连接

你需要按之前的描述先配置好使用 wvdial 的另外一种 PPP 连接(参见第 5.5.4 节 “使用 wvdialconf 的另一种可选的 PPP 连接”). 然后,按下面的方式给第一个 PPP 设备 ppp0 增加 “/etc/network/interfaces“ 文件里的条目.

  1. iface ppp0 inet wvdial

5.6.11. PPPoE 连接

使用 PPPoE 直接连接到广域网的电脑,你需要按之前的描述用 PPPoE 连接配置系统(参见 第 5.5.5 节 “使用 pppoeconf 的 PPPoE 以太网连接”). 然后,按下面的方式给第一个 PPPoE 设备 eth0 增加 “/etc/network/interfaces“ 文件里的条目.

  1. allow-hotplug eth0
  2. iface eth0 inet manual
  3. pre-up /sbin/ifconfig eth0 up
  4. up ifup ppp0=dsl
  5. down ifdown ppp0=dsl
  6. post-down /sbin/ifconfig eth0 down
  7. # The following is used internally only
  8. iface dsl inet ppp
  9. provider dsl-provider

5.6.12. ifupdown 网络配置状态

/etc/network/run/ifstate“ 文件保存了由 ifupdown 软件包管理的当前所有的活动网络接口的期望状态。但不幸的是,即使ifupdown 系统没有按期望的启动某个网络接口,”/etc/network/run/ifstate“ 文件仍然会把它列为激活状态。

如果对一个网络接口的 ifconfig(8) 命令输出没有如下列子中的一行,那它就不能够作为 IPV4 网络的一部分使用.

  1. inet addr:192.168.11.2 Bcast:192.168.11.255 Mask:255.255.255.0
[注意]注意

对于连接到 PPPoE 的以太网设备, ifconfig(8) 命令的输出看起来像上面的列子。

5.6.13. 网络重新配置基础

当你试图重新配置接口,如 eth0 时,你必须首先用 “sudo ifdown eth0“ 命令关闭它. 这将从”/etc/network/run/ifstate“ 文件里面移除 eth0 条目。 (如果 eth0 之前没有被适当配置,或没有激活,这个命令将导致出现一些错误信息。迄今为止,对于简单的单用户工作站,在任何时间执行这个操作,看起来都是安全的。)

你现在可以按需要重新配置网络接口 eth0 ,重写 “/etc/network/interfaces“ 文件的内容。

然后,你可以使用 “sudo ifup eth0“ 命令,重新激活 eth0

[提示]提示

你可以简单的执行 “sudo ifdown eth0;sudo ifup eth0“ 来初始化或重新初始化网络接口。

5.6.14. ifupdown-extra 包

ifupdown-extra 包提供简易的网络连接测试,和 ifupdown 包一道使用.

  • network-test(1) 命令能够在 shell 里使用。

  • 自动脚本将运行每一个 ifup 执行的命令。

network-test 命令把你从麻烦的执行分析网络问题的底层命令中解放出来。

自动脚本安装在 “ /etc/network/*/ “并执行下面的操作。

  • 检查网络线缆连接

  • 检查重复 IP 地址使用

  • 按 “/etc/network/routes“ 的定义,建立系统静态路由

  • 检查网络的网关是否可以到达

  • 在 “/var/log/syslog“ 文件里面记录结果

系统日志记录对管理远程系统的网络问题非常有用。

[提示]提示

ifupdown-extra 包的自动化行为是由 “/etc/default/network-test“ 来配置. 部分自动化检查,会减慢一点系统启动速度,因为这些脚本需要一些时间来监听 ARP 答复.

5.7. 使用 ifupdown 的高级网络配置(旧)

ifupdown 软件包,使用其高级用法,其功能就能够超出在 第 5.6 节 “使用 ifupdown 进行基本网络配置(旧)” 所描述的内容。

描述在这里的这些功能是完全可选的。我,由于懒惰和极简主义,几乎不使用这些令人烦扰的东西。

[小心]小心

如果你不能够通过 第 5.6 节 “使用 ifupdown 进行基本网络配置(旧)” 里的信息建立网络连接,使用下面的信息,你就会使你的情形变得比较糟糕。

5.7.1. ifplugd 软件包

ifplugd 软件包是一个老的自动网络配置工具,它仅能够管理以太网连接。解决了移动 PC 等拔插以太网线缆的问题。如果你有安装 NetworkManagerWicd) (参见 第 5.2 节 “现代的桌面网络配置”),就不需要这个软件包。

这个软件包运行一个后台守护进程(daemon)) 来代替 autoallow-hotplug 的功能 (参见 表 5.10 “”/etc/network/interfaces“ 里面的节列表”),并启动网络连接上的接口。

以太网端口怎样使用 ifplugd 软件包,比如 eth0,请看下面。

  1. 删除 “/etc/network/interfaces“ 里面的节: “auto eth0“ 或 “allow-hotplug eth0“.

  2. 保留 “/etc/network/interfaces“ 里的节: “iface eth0 inet …“ 和 “mapping …“.

  3. 安装 ifplugd 软件包.

  4. 运行 “sudo dpkg-reconfigure ifplugd“.

  5. eth0 作为 “由 ifplugd 监控的静态网卡”.

现在,网络按你希望的方式重新配置了。

  • 在打开电源或发现硬件的时候启动,接口不会自己启动自己。

  • 发现以太网线缆时,启动接口。

  • 在拔掉以太网线缆后启动一段时间,然后接口自动关闭。

  • 在插入另外的以太网线缆时,接口在新的网络环境下启动。

[提示]提示

ifplugd(8) 命令的参数能够设置其行为,比如说重新配置接口的延时。

5.7.2. ifmetric 软件包

ifmetric 软件包使我们能够根据经验来维护路由度量值,即使是 DHCP 的路由度量值。

下面设置 eth0 接口的值,让其在有 wlan0 接口的情况下,更加适当。

  1. 安装 ifmetric 软件包。

  2. 在 “/etc/network/interfaces“ 里,增加一行 “metric 0“,紧挨着放在”iface eth0 inet dhcp“这行下面。

  3. 在 “/etc/network/interfaces“ 里,增加一行 “metric 1“ ,紧挨着放在 “iface wlan0 inet dhcp“ 这行下面.

metric 0 意味着最高路由优先级,是默认值。大的 metric 值意味着较低的路由优先级。具有最低 metric 值的活动的接口 IP 地址,成为原始路由。参见ifmetric(8)。

5.7.3. 虚拟接口

单个物理以太网接口能够配置为使用不同的 IP 地址的多个虚拟接口。这样做的目的,通常是把接口连接到几个 IP 子网。比如说,只有一个网卡的基于 IP 地址的虚拟 web 主机,就是这样一个应用。

举个例子,让我们假设下面的情况。

  • 你主机上的单个以太网接口连接到以太网集线器(不是宽带路由器)。

  • 以太网集线器同时连接到互联网和本地局域网。

  • 局域网使用子网 192.168.0.x/24.

  • 你主机的物理接口 eth0 使用 DHCP 提供的 IP 地址来连接互联网。

  • 你的主机使用 192.168.0.1 作为局域网的虚拟接口 eth0:0 的地址。

/etc/network/interfaces“ 里下面的节配置你的网络。

  1. iface eth0 inet dhcp
  2. metric 0
  3. iface eth0:0 inet static
  4. address 192.168.0.1
  5. netmask 255.255.255.0
  6. network 192.168.0.0
  7. metric 1
[小心]小心

虽然这个配置列子,并使用 netfilter/iptables (参见 第 5.10 节 “Netfilter 网络过滤框架”) 的网络地址转换(NAT),能够给只有单个网络接口的局域网提供廉价的路由器,但这样设置,没有真正的防火墙能力。你应当使用 2 块物理网卡的 NAT 来使本地网络更安全,隔离不安全的互联网。

5.7.4. 高级命令语法

ifupdown 软件包提供高级网络配置,使用网络配置名和网络接口名。我使用的术语和 ifup(8) 以及 interfaces(5)有少量不同。

表 5.12. 网络设备术语列表

man 手册页术语本文术语下面文本的列子说明
物理接口网络接口lo, eth0, <interface_name>Linux 内核给出的名字 (使用 udev 机制)
逻辑接口网络配置config1, config2, <config_name>在 “/etc/network/interfaces“ 里紧跟着 iface 的名字

第 5.6.1 节 “简单的命令语法” 里的基本网络配置命令,需要网络配置名来标识匹配 “/etc/network/interfaces“ 里 iface 节的网络接口名。

高级网络配置命令能够按下面的方式区分 “/etc/network/interfaces“ 里的网络配置名和网络接口名。

表 5.13. ifupdown 高级网络配置命令列表

命令操作
ifup eth0=config1使用配置 config1 启动网络接口 eth0
ifdown eth0=config1使用配置 config1 关闭网络接口 eth0
ifup eth0使用 mapping 节选择的 eth0 配置启动网络接口
ifdown eth0使用 mapping 节选择的 eth0 配置关闭网络接口

5.7.5. 映射节 mapping stanza

为了避免复杂,我们在 第 5.6.2 节 “”/etc/network/interfaces” 基本语法” 里省略了解释 “/etc/network/interfaces“ 里的 mapping 节。

  1. mapping <interface_name_glob>
  2. script <script_name>
  3. map <script_input1>
  4. map <script_input2>
  5. map ...

这给 /etc/network/interfaces 文件提供了一个高级特征,可以自动选择映射脚本 <script_name> 定义的配置。

让我们来跟随下面的执行。

  1. $ sudo ifup eth0

当 “<interface_name_glob>“ 匹配 “eth0“, 这个执行过程执行下面的命令来自动配置 eth0

  1. $ sudo ifup eth0=$(echo -e '<script_input1> \n <script_input2> \n ...' | <script_name> eth0)

这里,” map “ 脚本输入行是可选和可以重复的。

[注意]注意

mapping 节工作的匹配模式,类似于 shell 文件名匹配。 (参见 第 1.5.6 节 “Shell 通配符”).

5.7.6. 手动的可切换网络配置

以下是如何在几个网络配置中进行手动切换,而无需像 第 5.6.13 节 “网络重新配置基础” 中那样重写 “/etc/network/interfaces” 文件。

对于你需要访问的所有网络配置,你需要在 “/etc/network/interfaces” 文件中像下面那样创建一个单独的节。

  1. auto lo
  2. iface lo inet loopback
  3. iface config1 inet dhcp
  4. iface config2 inet static
  5. address 192.168.11.100
  6. netmask 255.255.255.0
  7. gateway 192.168.11.1
  8. dns-domain example.com
  9. dns-nameservers 192.168.11.1
  10. iface pppoe inet manual
  11. pre-up /sbin/ifconfig eth0 up
  12. up ifup ppp0=dsl
  13. down ifdown ppp0=dsl
  14. post-down /sbin/ifconfig eth0 down
  15. # The following is used internally only
  16. iface dsl inet ppp
  17. provider dsl-provider
  18. iface pots inet ppp
  19. provider provider

请注意,iface 后面标识的 网络配置名称 不用于标识 网络接口名称。另外,也没有 autoallow-hotplug 节来根据事件自动启动网络接口 eth0

现在,你可以切换网络配置了。

让我们通过 DHCP 将你的 PC 移动到局域网。你可以通过下列命令开启由网络配置名称(逻辑接口名称)config1 指定的网络接口(物理接口) eth0

  1. $ sudo ifup eth0=config1
  2. Password:
  3. ...

eth0 接口已开启,由 DHCP 配置并连接到了局域网。

  1. $ sudo ifdown eth0=config1
  2. ...

eth0 接口已关闭并断开局域网连接。

让我们通过静态 IP 使你的 PC 移动到局域网。你可以通过下列命令开启由网络配置名称 config2 指定的网络接口 eth0

  1. $ sudo ifup eth0=config2
  2. ...

开启 eth0 接口,使用静态 IP 配置并连接到局域网。像 dns-* 这样的额外参数会配置 “/etc/resolv.conf” 的内容。如果安装了 resolvconf,“/etc/resolv.conf” 会更容易管理。

  1. $ sudo ifdown eth0=config2
  2. ...

eth0 接口再次关闭并断开局域网连接。

让我们将你的 PC 移动到 PPPoE 服务器的 BB-modem 上的一个端口。你可以通过下列命令开启由网络配置名称 pppoe 指定的网络接口 eth0

  1. $ sudo ifup eth0=pppoe
  2. ...

eth0 接口已开启,由 PPPoE 配置直接连接到 ISP。

  1. $ sudo ifdown eth0=pppoe
  2. ...

eth0 接口再次关闭并断开连接。

让我们将你的 PC 移动到使用 POTS 和 modem 的位置,而非局域网或 BB-modem。你可以通过下列命令开启由网络配置名称 ppp0 指定的网络接口 eth0

  1. $ sudo ifup ppp0=pots
  2. ...

开启 ppp0接口,并使用 PPP 连接到互联网。

  1. $ sudo ifdown ppp0=pots
  2. ...

关闭 ppp0 接口并断开网络。

你应该检查 “/etc/network/run/ifstate” 文件,查看ifupdown 系统当前网络配置的状态。

[警告]警告

如果你有多个网络接口,你可能需要调整 ethppp 等的末尾数字。

5.7.7. ifupdown 系统的脚本

ifupdown 系统会自动运行安装在 “/etc/network/*/” 中的脚本,而且会传递环境变量给脚本。

表 5.14. ifupdown 系统传递的环境变量

环境变量传递值
$IFACE处理中的接口的物理名称(接口名称)
$LOGICAL处理中的接口的逻辑名称(配置名称)
$ADDRFAM接口的 <addressfamily>
$METHOD接口的 <method_name> (例如 “static”)
$MODE如果是 ifup 运行的,则值为 “start”;如果是 ifdown 运行的,则值为 “stop”
$PHASE根据 “$MODE”,但有更细致的区分,共分为 pre-uppost-uppre-downpost-down 阶段
$VERBOSITY指示是否使用了 “—verbose”;是为 1,否为 0
$PATH命令搜索路径:“/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$IF<OPTION>位于 iface 这节的相应选项值

这里,每一个环境变量,”$IF_<OPTION>“,是在相应的选项名字 <option1> 和 <option2> 前增加 “$IF_“ 来创建, 把字母转换为大写字母,将中划线替换为下划线,忽略非字母数字的字符。

[提示]提示

<address_family>, <method_name>, <option1> 和 <option2> 的说明,请参见第 5.6.2 节 “”/etc/network/interfaces” 基本语法”

ifupdown-extra 软件包 (参见 第 5.6.14 节 “ifupdown-extra 包”)使用这些环境变量来扩展ifupdown 软件包的功能. ifmetric 软件包 (参见 第 5.7.2 节 “ifmetric 软件包”)安装 “/etc/network/if-up.d/ifmetric“脚本,这个脚本通过”$IF_METRIC“变量来设置 metric 路由度量值. guessnet 软件包 (参见 第 5.7.8 节 “guessnet Mapping 映射”),提供简单和功能强大的框架,用于通过 mapping 映射机制自动选择网络配置,这个软件包也使用了这些环境变量。

[注意]注意

使用这些环境变量进行个性化网络配置的列子,你可以查看”/usr/share/doc/ifupdown/examples/*“里的列子脚本,以及 ifschemeifupdown-scripts-zg2 软件包使用的脚本.这些额外的脚本有部分功能和 ifupdown-extraguessnet 软件包的基本功能重叠. 如果你安装了这些额外脚本,你应当个性化这些脚本来避免互相影响。

5.7.8. guessnet Mapping 映射

为了替代在 第 5.7.6 节 “手动的可切换网络配置” 描述的手工选择配置,你可以使用在 第 5.7.5 节 “映射节 mapping stanza” 描述的映射机制,自动选择个性化脚本来进行配置网络。

guessnet 软件包提供的 guessnet-ifupdown(8) 命令,是被设计作为映射脚本,并提供强力框架来增强ifupdown 系统.

  • iface 节下的每一个网络配置,列出测试条件作为guessnet 选项的值。

  • 映射机制选择第一个没有错误结果的 iface 作为网络配置。

guessnet-ifupdown 使用的映射脚本和 ifupdown的原始网络配置架构,这两种对 “/etc/network/interfaces“ 文件的用法,不会造成负面的影响,因为 guessnet 选项仅仅只导出额外的环境变量到 ifupdown 系统运行的脚本。细节参见 guessnet-ifupdown(8).

[注意]注意

当多个 guessnet 选项行需要在 “/etc/network/interfaces“ 里出现时,选项行使用 guessnet1, guessnet2,这类的开头,因为 ifupdown 软件包不允许选项行开头字符串重复。

5.8. 底层网络配置

5.8.1. Iproute2 命令

Iproute2 命令集提供完整的底层网络配置能力。有个从旧的 net-tools 命令集到新的 iproute2 命令集的转换表。

表 5.15. 从旧的 net-tools 命令集到新的 iproute2 命令集转换表

旧的 net-tools新的 iproute2操作
ifconfig(8)ip addr一个设备上的协议(IP 或 IPv6)地址
route(8)ip route路由表条目
arp(8)ip neighARP 或 NDISC 缓存条目
ipmaddrip maddr多播地址
iptunnelip tunnelIP 隧道
nameif(8)ifrename(8)基于 MAC 地址的网络接口名
mii-tool(8)ethtool(8)以太网设备设置

参见 ip(8) 和 IPROUTE2 工具套件 Howto.

5.8.2. 安全的底层网络操作

你可以按下面的方式安全的使用底层网络命令,这些命令不会改变网络配置。

表 5.16. 底层网络命令列表

命令说明
ifconfig显示活动的网络接口连接和地址状态
ip addr show显示活动的网络接口连接和地址状态
route -n用数字地址显示全部路由表
ip route show用数字地址显示全部路由表
arp显示当前 ARP 缓存表的内容
ip neigh显示当前 ARP 缓存表的内容
plog显示 ppp 后台守护进程(daemon)日志
ping yahoo.com检查到 “yahoo.com“ 的因特网连接
whois yahoo.com在域名数据库里面检查谁注册了 “yahoo.com
traceroute yahoo.com跟踪到 “yahoo.com“ 的因特网连接
tracepath yahoo.com跟踪到 “yahoo.com“ 的因特网连接
mtr yahoo.com跟踪到 “yahoo.com“ 的因特网连接(重复的)
dig [@dns-server.com] example.com [{a|mx|any}]查询由 “dns-server.com“ 提供服务的 “example.com“ 域名的 DNS 记录: “a“, “mx“ 或 “any“ 记录
iptables -L -n查看包过滤
netstat -a找出所有打开的端口
netstat -l —inet找出监听端口
netstat -ln —tcp找出 TCP 监听端口(数字的)
dlint example.com查询 “example.com“ 的 DNS zone 信息
[提示]提示

部分底层网络配置工具放在 “/sbin/“ 目录。你可以像 “/sbin/ifconfig“ 这样使用完整命令路径,或把 “/sbin“ 加到 “~/.bashrc“ 文件列出的 “$PATH“ 环境变量里 。

5.9. 网络优化

通用的网络优化超出了本文的范围。我提及消费等级连接相关的主题。

表 5.17. 网络优化工具列表

软件包流行度大小说明
iftopV:7, I:11597显示一个网络接口上的带宽使用信息
iperfV:4, I:55263互联网协议带宽测量工具
ifstatV:0, I:860接口统计监控
bmonV:1, I:17146便携式带宽监视器和网速估计工具
ethstatusV:0, I:540快速测量网络设备吞吐的脚本
bingV:0, I:180实验性的随机带宽测试器
bwm-ngV:2, I:1790小巧简单的控制台带宽监测器
ethstatsV:0, I:023基于控制台的以太网统计监视器
ipfmV:0, I:078带宽分析工具

5.9.1. 找出最佳 MTU

最大传输单元 Maximum Transmission Unit (MTU) 的值能够通过加 “-M do“ 选项的 ping(8) 实验来确定,它发送从 1500 字节(对于IP+ICMP 包头,有 28 字节的偏移)大小开始的 ICMP 包,来找出 IP 不分片的最大包大小。

尝试下列例子

  1. $ ping -c 1 -s $((1500-28)) -M do www.debian.org
  2. PING www.debian.org (194.109.137.218) 1472(1500) bytes of data.
  3. From 192.168.11.2 icmp_seq=1 Frag needed and DF set (mtu = 1454)
  4. --- www.debian.org ping statistics ---
  5. 0 packets transmitted, 0 received, +1 errors

尝试 1454 代替 1500

你看到用 1454 ping(8) 成功了。

这个过程是 路径 MTU (PMTU) 发现 (RFC1191) , tracepath(8) 命令能够自动完成这个。

[提示]提示

上面的列子,PMTU 的值是 1454,这是我先前的光纤到户提供商,使用了 异步传输模式 Asynchronous Transfer Mode (ATM) 作为他们的骨干网络,并使用 PPPoE 作为客户端。实际 PMTU 值依赖于你的环境,比如说,我新的光纤到户提供商是 1500。

表 5.18. 最佳 MTU 值的基本指引方法

网络环境MTU基本原理
拨号连接(IP: PPP)576标准的
以太网连接 (IP: DHCP 或固定)1500默认标准值
以太网连接 (IP: PPPoE)1492 (=1500-8)PPP 头部 2 字节 和 PPPOE 头部 6 字节
以太网连接 (ISP 骨干网: ATM, IP: DHCP 或固定 IP)1462 (=4831-18-8)作者推断:18 字节的以太网头,8字节 SAR 尾(译注:SAR 为 ATM 技术名词)
以太网连接 (ISP 骨干: ATM, IP: PPPoE)1454 (=4831-8-18-8)参见 “Optimal MTU configuration for PPPoE ADSL Connections“ 来了解基本原理

除了这些基本的指引方法外,你还应当知道下面的信息。

  • 使用任何隧道方式(VPN 等.)的最佳 MTU 需要进一步减去它们上面的头部。

  • MTU 值不应当超过通过实验验证的 PMTU 值。

  • 当遇到其它限制的时候,较大的 MTU 值通常比较好。

5.9.2. 设置 MTU

这里示例设置 MTU 值,从默认的 1500 设置到 1454.

对于 DHCP (参见 第 5.6.4 节 “使用 DHCP 的网络接口”), 你能够使用下面的方式替换 “/etc/network/interfaces“ 文件里 iface 节相关的行.

  1. iface eth0 inet dhcp
  2. pre-up /sbin/ifconfig $IFACE mtu 1454

对于静态 IP (参见 第 5.6.5 节 “使用静态 IP 地址的网络接口”), 你能够使用下面的方式替换 “/etc/network/interfaces“ 文件里 iface 节相关的行.

  1. iface eth0 inet static
  2. address 192.168.11.100
  3. netmask 255.255.255.0
  4. gateway 192.168.11.1
  5. mtu 1454
  6. dns-domain example.com
  7. dns-nameservers 192.168.11.1

对于直接 PPPoE (参见 第 5.5.5 节 “使用 pppoeconf 的 PPPoE 以太网连接”),你能够使用下面的方式替换 “/etc/ppp/peers/dsl-provider“ 里 “mtu“ 相关的行.

  1. mtu 1454

最大分片大小 (MSS) 是另外一种衡量包大小的方法。MSS 和 MTU 的关系如下.

  • 对于 IPv4, MSS = MTU - 40

  • 对于 IPv6,MSS = MTU - 60

[注意]注意

基于 iptables(8) (参见 第 5.10 节 “Netfilter 网络过滤框架”) 的优化,能够通过 MSS 来压缩包大小,路由器会用到 MMS 。参见 iptables(8)中的”TCPMSS” .

5.9.3. WAN TCP 优化

TCP 吞吐量能够通过调整 TCP 缓冲大小的参数来最大化,对现代大带宽和高延时的 WAN,在 “TCP Tuning Guide“ 和 “TCP tuning“里有描述. 到目前为止,当前 Debian 默认设置能够很好的服务好我的 1G bps 光纤到户 LAN 连接。

5.10. Netfilter 网络过滤框架

Netfilter 使用 Linux 内核 模块 (参见 第 3.3.1 节 “内核模块初始化”) 提供 状态防火墙网络地址转换 (NAT) 框架。

表 5.19. 防火墙工具列表

软件包流行度大小说明
iptablesV:300, I:9932520netfilter 管理工具(iptables(8) 用于 IPv4, ip6tables(8) 用于 IPv6)
arptablesV:0, I:296netfilter 管理工具(arptables(8) 用于 ARP)
ebtablesV:15, I:39265netfilter 管理工具 (ebtables(8) 用于以太网桥)
iptstateV:0, I:3116持续性监控 netfilter 状态 (和 top(1) 相似)
shorewall-initV:0, I:068Shoreline 防火墙 初始化
shorewallV:5, I:132458Shoreline 防火墙, netfilter 配置文件生成器
shorewall-liteV:0, I:065Shoreline 防火墙, netfilter 配置文件生成器 (精简版)
shorewall6V:1, I:2779Shoreline 防火墙, netfilter 配置文件生成器(IPv6 版本)
shorewall6-liteV:0, I:064Shoreline 防火墙, netfilter 配置文件生成器 (IPv6,精简版)

netfilter 主要的用户层程序是 iptables(8).你能从 shell 手工交付式的配置 netfilter,使用 iptables-save(8) 保存当前状态,当系统重启时,通过 init 脚本调用 iptables-restore(8) 来恢复。

shorewall 这样的配置帮助脚本能够使这个过程变得更简单。

参见 http://www.netfilter.org/documentation/ 上的文档(或在 “/usr/share/doc/iptables/html/“ 里面的文档).

[提示]提示

虽然这些是为 Linux 2.4 写的,iptables(8) 命令和 netfilter 内核功能都能够在 Linux2.63.x 内核系列实现.