3. 模块化网络

内容:

3.a. 网络模块

我们现在支持模块化的网络脚本,这意味着我们可以很方便地增添新的网络接口和配置模块,同时和原来已存在的模块或是接口保持良好的兼容性。

只要模块需要的软件包已安装,它就会被默认载入。如果你指定一个模块而它需要的软件包未被安装,则你就会收到一个错误信息通知你需要安装哪一个软件包。一般来说,只有当你安装了提供相同服务的两个及以上的软件包时,你才需要使用模块设定来选择你想使用其中的哪一个。

注意: 除非有特别说明,这里所讨论的全部设定都保存在/etc/conf.d/net中。

代码 1.1: 模块选择

# 选择iproute2而不用ifconfig
modules=( "iproute2" )

# 你也可以为一个网络接口指定其他的模块
# 这个例子中我们希望使用pump来代替dhcpcd
modules_eth0=( "pump" )

# 你也可以指定不使用哪一个模块——例如你一方面想使用supplicant或是
# linux-wlan-ng来控制无线网络配置,一方面又想配置每一个ESSID相关联的网络设定。
modules=( "!iwconfig" )

3.b. 网络接口处理程序

目前我们提供了两个网络接口处理程序:ifconfigiproute2。你可以使用i这两个程序中的一个进行任意种类的网络配置。

ifconfig是目前Gentoo默认使用的网络接口处理程序,而且它也包含在系统的profile之中。iproute2是另一个灵活且强大的软件包,但是默认的系统配置中并不包含它。

代码 2.1: 安装iproute2

# emerge sys-apps/iproute2

# 在iproute2和ifconfig都已安装的情况下,选用iproute2
modules=( "iproute2" )

由于ifconfigiproute2的功能很类似,我们允许使用它们的基本配置功能以使二者可以通用。例如说下面的代码片段对于它们之中的任何一个来说都是起效的。

代码 2.2: ifconfig和iproute2示例

config_eth0=( "192.168.0.2/24" )
config_eth0=( "192.168.0.2 netmask 255.255.255.0" )

# 我们也可以指定广播地址
config_eth0=( "192.168.0.2/24 brd 192.168.0.255" )
config_eth0=( "192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255" )

3.c. DHCP

DHCP是一种通过DHCP服务器来获得相关的网络信息(比如IP地址、DNS服务器、网关等)的方式。这意味着如果在网络上存在着一个DHCP服务器的话,你只要让每一个客户端使用DHCP,这些客户端就会自动地配置好相关的网络设置。当然,如果在使用DHCP之前还需要配置无线网络或是PPP等其他设定的话,你就必须先配置好这些才行。

dhclientdhcpcd或者pump都可以提供DHCP功能。每一种DHCP模块都有各自的优缺点——下面是一个快速的检阅。

DHCP模块 软件包 优点 缺点
dhclient net-misc/dhcp 由ISC(也是BIND DNS软件的开发人员)制作;高度可配置性。 配置起来过于复杂;软件十分臃肿;无法通过DHCP获得NTP服务器;默认不发送主机名。
dhcpcd net-misc/dhcpcd Gentoo一直以来的预设软件;不依赖其他外部软件;由Gentoo开发的。 有时很慢;当租约为无穷大时不会变成守护进程。
pump net-misc/pump 轻量级的;不依赖其他外部软件 不再被上游维护,不可靠,尤其在使用modem的时候;不能通过DHCP获得NIS服务器。

当你在系统上安装有不止一种DHCP客户端,你需要指定使用哪一个——否则如果系统装有dhcpcd,我们将默认使用它。

你可以使用module_eth0="..."(把module改成你所使用DHCP模块的名称——例如:dhcpcd_eth0为DHCP模块指定选项。

我们尝试使DHCP的配置更加灵活——所以我们通过dhcp_eth0变量来支持下面这些命令,默认不使用它们中的任何一个:

代码 3.1: 在/etc/conf.d/net中的DHCP配置范例

# 只在你安装了一个以上的DHCP模块后才需要
modules=( "dhcpcd" ) 

config_eth0=( "dhcp" )
dhcpcd_eth0="-t 10" # 10秒后超时
dhcp_eth0="release nodns nontp nonis" # 只获取IP地址

注意: 由于dhcpcdpump默认会把主机名发送给DHCP服务器,所以你就可以不用去指定它了。

3.d. 基于PPPoE/PPPoA的ADSL

首先我们安装ADSL软件。

代码 4.1: 安装ppp软件包

# emerge net-dialup/ppp

注意: 如果你需要PPPoA,确保你使用的是>=baselayout-1.12.x

其次,创建PPP网络脚本和PPP所使用的以太网卡的网络脚本:

代码 4.2: 创建PPP和以太网卡网络脚本

# ln -s /etc/init.d/net.lo /etc/init.d/net.ppp0
# ln -s /etc/init.d/net.lo /etc/init.d/net.eth0

确保在/etc/conf.d/rc设定RC_NET_STRICT_CHECKING="yes"。

现在我们需要配置/etc/conf.d/net

代码 4.3: 一个基本的PPPoE设定

config_eth0=( null ) (指定你的以太网卡)
config_ppp0=( "ppp" )
link_ppp0="eth0" (指定你的以太网卡)
plugins_ppp0=( "pppoe" )
username_ppp0='user'
password_ppp0='password'
pppd_ppp0=(
       "noauth"
       "defaultroute"
       "usepeerdns"
       "holdoff 3"
       "child-timeout 60"
       "lcp-echo-interval 15"
       "lcp-echo-failure 3"
       noaccomp noccp nobsdcomp nodeflate nopcomp novj novjccomp
)

depend_ppp0() {
    need net.eth0
}

你也可以在/etc/ppp/pap-secrets中定义你的密码。

代码 4.4: /etc/ppp/pap-secrets范例

# *号非常重要
"username"  *  "password"

如果你通过一个USB调制解调器来使用PPPoE,你需要emerge br2684ctl。请阅读/usr/portage/net-dialup/speedtouch-usb/files/README来了解如果正确的配置它。

重要: 请仔细阅读/etc/conf.d/net.example里有关ADSL和PPP的部分。它包含了你的PPP设定可能需要的设置的详尽解释。

3.e. APIPA(自动获得私有的IP地址)

APIPA通过在某网络接口arping在169.254.0.0-169.254.255.255范围内的某个随机地址的方式来在该范围内尝试寻找空闲地址。如果没有收到任何ARP应答,该IP地址就会被绑定到这个网络接口上。

只有在网络上不存在DHCP服务器,同时本机不直接连接到internet并且其他所有的计算机都使用APIPA时才适用。

为了支持APIPA,请emerge net-misc/iputilsnet-analyzer/arping

代码 5.1: /etc/conf.d/net中的APIPA配置

# 首先尝试DHCP——如果DHCP失败则使用APIPA
config_eth0=( "dhcp" )
fallback_eth0=( "apipa" )

# 只使用APIPA
config_eth0=( "apipa" )

3.f. 绑定

为了使用连接绑定,请emerge net-misc/ifenslave

绑定可以用来增加网络带宽。如果你有两块网卡连接到同一个网络,你可以把它们绑定在一起这样你的应用程序只看到一个网卡,但实际上却是在同时使用两个物理网卡传送数据。

代码 6.1: 在/etc/conf.d/net中配置绑定

# 把网络接口绑定在一起
slaves_bond0="eth0 eth1 eth2"

# 你可以不为绑定而得的网络接口配置IP地址
config_bond0=( "null" )

# 依赖eth0、eth1和eth2, 因为它们需要额外的配置
depend_bond0() {
  need net.eth0 net.eth1 net.eth2
}

3.g. 桥接(802.1d的支持)

为了获得对桥接支持,请emerge net-misc/bridge-utils

桥接是用来把两个网络连接在一起。举例来说,你有一台通过ADSL modem接入internet的服务器,它同时通过无线网卡为其他计算机提供internet接入服务。你就可以创建桥接把这两个网络接口连接在一起。

代码 7.1: /etc/conf.d/net中桥接的配置

# 配置桥接——可以使用"man brctl"来获得更多信息
brctl_br0=( "setfd 0" "sethello 0" "stp off" )

# 增加端口到网桥br0中
bridge_br0="eth0 eth1"

# 你需要把端口配置成null,这样dhcp就不会启动了
config_eth0=( "null" )
config_eth1=( "null" )

# 最后为网桥配置一个IP地址——你也可以使用DHCP
config_br0=( "192.168.0.1/24" )

# 依赖eth0和eth1,因为它们需要额外的配置
depend_br0() {
  need net.eth0 net.eth1
}

重要: 在使用一些桥接的设定时,你可能需要参考文档变量名称

3.h. MAC地址

如果你使用的是sys-apps/baselayout-1.11.14或者更新版本的话,你无需安装任何软件就可以更改网络接口对应的MAC地址或者为某个网络接口指定一个MAC地址。不过,如果你需要为网络接口指定一个随机的MAC地址或者你的baselayout的版本比上述版本要旧的话,你需要安装好net-analyzer/macchanger后才能使用这些功能。

代码 8.1: MAC地址变更示例

# 设置网络接口的MAC地址
mac_eth0="00:11:22:33:44:55"

# 只随机选择MAC地址的最后3个字节
mac_eth0="random-ending"

# 在同种物理连接类型(比如: 光纤、铜缆、无线)中随机选择,范围至所有制造商
mac_eth0="random-samekind"

# 在任意物理连接类型(比如: 光纤、铜缆、无线)中随机选择,范围至所有制造商
mac_eth0="random-anykind"

# 完全随机——警告: 一些通过这个方式获得的MAC地址有可能无法正常工作
mac_eth0="random-full"

3.i. 隧道

你不需要安装任何软件就可以使用隧道,因为网络接口处理程序会帮你做好这些事。

代码 9.1: 在/etc/conf.d/net中配置隧道

# GRE隧道
iptunnel_vpn0="mode gre remote 207.170.82.1 key 0xffffffff ttl 255"

# IPIP隧道
iptunnel_vpn0="mode ipip remote 207.170.82.2 ttl 255"

# 配置网络接口
config_vpn0=( "192.168.0.2 peer 192.168.1.1" ) 

3.j. VLAN(802.1q的支持)

为了获得对VLAN的支持,请emerge net-misc/vconfig.

虚拟局域网(Virtual LAN)是一组有如运作在同个网段的一组网络设备的集合——尽管实际上可能不是。VLAN成员只能看到同一VLAN的成员,哪怕和其他VLAN成员处于同一物理网段中。

代码 10.1: 在/etc/conf.d/net中配置VLAN

# 像这样为网络接口指定VLAN号
# 请确认每个VLAN号前面没有以0填充
vlans_eth0="1 2"

# 你也可以配置VLAN
# 查看vconfig的手册页获取更多的信息
vconfig_eth0=( "set_name_type VLAN_PLUS_VID_NO_PAD" )
vconfig_vlan1=( "set_flag 1" "set_egress_map 2 6" )

# 按通常方法配置网络接口
config_vlan1=( "172.16.3.1 netmask 255.255.254.0" )
config_vlan2=( "172.16.2.1 netmask 255.255.254.0" )

重要: 在使用一些VLAN的设定时,你可能需要查看文档变量名称