下一步 上一步 目录

3. 配置网络

好的,到现在为止,您已经在您的网关计算机上安装了 Linux。您甚至可能已经配置了您的一个网卡,并设置了到 Internet 的连接。但是,我们将从头开始,假设什么都没有配置。

root 身份登录。本文档中给出的所有说明都假定您以 root 身份登录。

Linux 内核将您的两个以太网卡称为 eth0eth1,所以从现在开始我也会这样称呼它们。问题是,哪个是哪个?这是一个“简单”的找出方法,保证至少 50% 的时间有效:将您的计算机水平放置在桌面上,背面板朝向您(就像您要打开它并进行一些工作一样)。最左边的卡是 eth0 -- 您可能想用一些遮蔽胶带标记它。现在,在一张纸上写下 eth0eth1 的制造商和型号。

好的,让我们看看内核是否自动识别了 eth0eth1。输入 ifconfig eth0ifconfig eth1。在这两种情况下,如果内核识别您的网卡,您应该看到类似这样的内容(请记住,数字和其他内容会有所不同)

eth0   Link encap: Ethernet   HWaddr 00:60:67:4A:02:0A 
       inet addr:0.0.0.0  Bcast:0.0.0.0  Mask:255.255.255.255
       UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
       RX packets:466 errors:0 dropped:0 overruns:0 frame:0
       TX packets:448 errors:0 dropped:0 overruns:0 carrier:0
       collisions:85 txqueuelen:100 
       Interrupt:10 Base address:0xe400
 

如果内核无法识别您的网卡,您将看到类似这样的内容

eth0: error fetching interface information: Device not found.
 

3.1 配置网络驱动程序

如果您的两张卡都被找到,请跳到下一节。否则,请阅读本节。

好的,所以您的一张或两张卡未被内核识别。这实际上不是问题。我们要做的是更明确地告诉内核如何找到您的卡。这里有很多曲折,我不会涵盖所有内容。记住,当情况变得艰难时,强者会转向 Ethernet HOWTO。以下是一些总结性建议

现在,既然您知道 eth0eth1 的制造商和型号,您可以转到 兼容性页面Ethernet HOWTO 并查找您的卡。记下推荐的驱动程序,以及有关您的卡可能需要的特殊选项的任何信息。写下来。

是时候编辑配置文件了!我们将要编辑的文件是 /etc/conf.modules。在您选择的文本编辑器中打开此文件。因为这个文件中可能包含如此多的可能性和组合,我将以我自己的网关为例。我有一张基于 VIA Rhine 芯片的 PCI 10/100Mb 卡,以及一张普通的 10Mb NE2000 ISA 克隆卡。我将 100Mb 卡用于内部网络,将 10Mb 卡用于外部连接。我的 /etc/conf.modules 文件看起来像这样

alias parport_lowlevel parport_pc 
alias eth0 ne 
options ne io=0x300 irq=10 
alias eth1 via-rhine 
 

我的 conf.modules 文件布局如下

您将需要确保您的 conf.modules 中有您两张卡的别名条目,以及所有 ISA 卡的正确选项行。您可能已经在 conf.modules 中为安装期间配置的任何以太网卡添加了行。

当您完成编辑 conf.modules 后,再次尝试 ifconfig eth0ifconfig eth1。如果您在没有制造商手册的情况下乱用 IO 地址和 IRQ,您可能需要进行一些试错。

两张相同的网卡

所以,您真的很聪明,为您的 Linux 网关购买了两张相同的网卡,现在您无法让它们一起工作?不要担心,让它们共存只是在 /etc/conf.modules 中使用正确的语法的问题。对于此示例,地址和 IRQ 编号是编造的,我将假设您购买了一对匹配的 NE2000 克隆卡(一种常见的选择)。您的 /etc/conf.modules 文件应如下所示

alias eth0 ne
alias eth1 ne
options ne io=0x330,0x360 irq=7,9 
 

寻址选项都放在同一行,每种寻址类型的第一个数字用于 eth0,第二个数字用于 eth1

3.2 配置内部网络

“内部网络”是您所有家庭/办公室机器将要通信的网络。“外部网络”是 Linux 盒子另一侧的大型可怕的互联网。总的来说,内部网络将完全与外部网络隔离,由 Linux 盒子充当一个中等强度的防火墙。

网络设备

现在您的驱动程序正在工作,您可以在 ifconfig 中看到 eth0eth1,是时候设置内部家庭网络了。我假设您要将您的内部网络放在 eth1 上,并将您的外部设备放在 eth0 上。

您的内部网络将是一个私有网络,因此将位于为内部网络保留的特殊网络上:192.168.1.0。这是一个“私有 C 类网络”,以防您想给您的朋友留下深刻印象。

首先我们需要确保网络已开启。编辑文件 /etc/sysconfig/network 并确保存在以下行

NETWORKING=yes 
FORWARD_IPV4=yes
 

第一行告诉 Linux 我们希望在启动时启动网络设备。第二行告诉 Linux 启用 IP 转发。当我们开始在第 4 节中配置伪装时,这是必需的。

Redhat 6.2 注意: 为了正确支持 IP 转发和伪装,Red Hat 6.2 需要更改 /etc/sysctl.conf 文件。确保存在以下行并设置为正确的值

net.ipv4.ip_forward = 1 
net.ipv4.ip_always_defrag = 1 
 

Red Hat 和 Red Hat 衍生产品的所有网络接口设置都包含在 /etc/sysconfig/network-scripts 目录中的文件中。进入该目录,并创建一个新文件 ifcfg-eth1。将以下内容放入 ifcfg-eth1 文件中

DEVICE=eth1 
IPADDR=192.168.1.1 
ONBOOT=yes
 

此代码告诉网络脚本在启动时配置 eth1,并为其提供特定的 IP 地址。使用以下命令激活您的具有新设置的网络:/etc/rc.d/init.d/network restart

DHCP 服务器

DHCP 服务器将自动为您的内部家庭网络上的设备配置 IP 地址。这对拥有笔记本电脑的人非常有用:他们只需插入他们的机器,即可立即正确配置。如果您不希望在您的内部网络上使用 DHCP 服务器,只需跳到下一节。

首先您需要确保您已安装 DHCP 服务器。挂载您的 Linux CD 并安装 dhcp RPM。现在编辑 /etc/dhcpd.conf 文件并将以下内容(并且仅以下内容)放入其中

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.2 192.168.1.60;
  default-lease-time 86400;
  max-lease-time 86400;
  option routers 192.168.1.1;
  option ip-forwarding off;
  option broadcast-address 192.168.1.255;
  option subnet-mask 255.255.255.0;
}
 

如果您要将您的 Linux 盒子设置为缓存域名服务器,请插入以下选项

option domain-name-servers 192.168.1.1;
 

如果您知道您的外部 DNS 地址,并且您打算将 Linux 盒子用于 DNS,请插入以下选项,其中 x.x.x.x 和 y.y.y.y 是 DNS 服务器的 IP 号码

option domain-name-servers x.x.x.x, y.y.y.y;
 

如果您要在 Linux 盒子上为您的 Windows 计算机运行 Samba 文件共享,请添加以下选项以将 Linux 盒子用作默认的 WINS 和浏览服务器

option netbios-name-servers 192.168.1.1; 
option netbios-dd-server 192.168.1.1; 
option netbios-node-type 8; 
option netbios-scope "";
 

配置 Samba 和 WINS 超出了本文档的范围。如果您需要一些指导,请从 SMB HOWTO 开始,然后继续。

还有一些步骤。接下来,编辑 /etc/rc.d/init.d/dhcpd 文件并查找以下行

/sbin/route add -host 255.255.255.255 dev eth1
 

Windows DHCP 客户端需要在 DHCP 响应中使用特定的广播地址,此命令强制 Linux TCP/IP 堆栈生成它。如果您在文件中找不到该行,请添加它。如果您确实找到类似这样的行,请确保它引用的设备是 eth1

下一步是更改 /etc/rc.d/init.d/dhcpd 文件以使用 eth1 作为默认设备。替换行

daemon /usr/sbin/dhcpd
 

daemon /usr/sbin/dhcpd eth1
 

好的,现在我们准备启动 DHCP 了。首先使用命令启动 DHCP 服务器:/etc/rc.d/init.d/dhcpd start

最后,我们必须确保 DHCP 服务器在重新启动时启动。DHCP 服务器的某些 RPM 包不包含确保服务器每次都启动的指令,因此我们将通过调用命令 chkconfig dhcpd on 来确保它启动。

此命令使 RedHat 将 dhcp 启动脚本添加到 /etc/rc.d 下的各种运行级别目录中。在运行级别 3 和 5(多用户控制台和多用户 X)中,DHCP 服务器已启动。在运行级别 0、1 和 6(关机、单用户和重启)中,DHCP 服务器已停止。

客户端计算机

如果您已设置 DHCP,则配置您的客户端计算机非常容易:只需启用 DHCP 配置即可。对于 Windows 计算机,这涉及到打开“控制面板”,然后打开“网络”选项。找到“TCP/IP”协议并选择“配置”。选中标记为“自动配置 TCP/IP 地址”的框,应用您的更改,然后重新启动。

在重新启动之前,您可能想要键入以下命令:tail -f /var/log/messages。这将持续监视 Linux 系统日志。如果一切顺利,当您重新启动 Windows 计算机时,您将看到它请求 IP 地址并看到 DHCP 服务器响应。Control-C 退出 tail -f 命令。

如果您未设置 DHCP,配置仍然相当容易。同样,从“控制面板”打开“网络”选项,并选择配置 TCP/IP 协议。您可以为您的客户端计算机分配 192.168.1.0 网络中的任何地址,除了 192.168.1.0(网络地址)、192.168.1.255(广播地址)或 192.168.1.1(您的 Linux 服务器)。永远不要给两台计算机相同的 IP 地址。将“网关”地址设置为 192.168.1.1,以便传出的流量通过您的 Linux 网关路由。

IP Masquerading HOWTO配置部分 中提供了关于客户端配置的非常详细的信息。

通常,要配置客户端计算机,请启用 DHCP 配置,或手动为其分配 192.168.1.X 网络中的地址,网关为 192.168.1.1。如果运行缓存 DNS 服务器(见下文),则 DNS 服务器为 192.168.1.1,否则将 DNS 指向您的网络提供商分配的地址。

DNS 服务器

将您的 Linux 盒子设置为缓存 DNS 服务器将(稍微)提高您的网上冲浪速度,因为常用的 DNS 地址将被缓存在您的网络内部,而无需从外部检索。

如果您对进行全面的 DNS 感兴趣,则需要学习大量的复杂性。有一个可用的 DNS HOWTO,并且 DNS and BIND 这本书是一个很好的(且非常全面的)纸质参考。

为了使您的客户端计算机能够利用缓存服务器,必须将它们配置为使用 Linux 网关作为其主 DNS 服务器。第 3.2.2 节中给出的 DHCP 指令是实现此目的的一种方法。如果您手动配置您的客户端计算机,您可以在用于设置机器 IP 地址的相同控制选项卡中更改 DNS 配置。

要安装 DNS 服务器,首先安装 bind RPM,然后安装 caching-nameserver RPM。此时,您几乎准备就绪。

安装后,缓存服务器将正常工作,但是如果您知道互联网提供商 DNS 服务器的 IP 地址,您可以通过编辑 /etc/named.conf 文件并在 directory 行之后添加以下行来稍微提高性能(其中 x.x.x.x 和 y.y.y.y 是主 DNS 服务器和辅助 DNS 服务器)

forwarders { x.x.x.x; y.y.y.y; }; 
 

此更改使您的 DNS 服务器首先查询 ISP 的 DNS 服务器,然后再遍历互联网以搜索给定的地址。ISP 的服务器通常具有丰富的 DNS 信息缓存,并且可以提供比您的服务器快得多的答案。

named 守护程序在过去 12 个月中遇到了一些安全问题,因此非常重要的是,您运行的是最新版本,并对默认设置进行一些更改以增强安全性。

  1. 检查您的 bind 版本,并确保它至少为 8.2.2。转到 Red Hat UpdatesMandrake Updates 站点以检查最新版本。
  2. 通过将行 allow-query { 192.168.1/24; 127.0.0.1/32; }; 添加到 forwarders 行之后的 /etc/named.conf 文件中,将对您的名称服务器的访问限制为仅限本地网络。
  3. 避免以 root 身份运行您的名称服务器。如果您的服务器以 root 身份运行,则对服务器的利用将授予利用程序 root 权限。如果您以无权用户(如 nobody)身份运行服务器,则可以降低名称服务器被利用的风险。要以 nobody 身份运行您的名称服务器,请编辑 /etc/rc.d/init.d/named 文件并将行 daemon named 更改为 daemon named -u nobody -g nobody

确保您的 DNS 服务器将在启动时启动:chkconfig named on。同样,这确保服务器将在启动时的常用运行级别(3 和 5)中启动。

好的,现在您可以启动您的 DNS 服务器了:/etc/rc.d/init.d/named start

测试内部网络

在我们配置外部网络之前,DNS 服务将无法工作(因为它必须与互联网上的其他 DNS 服务器通信),但是我们可以使用 ping 程序测试基本的内部连接。

在您的一个客户端计算机上,打开一个终端 (MSDOS) 窗口,然后键入 ping 192.168.1.1。这将定期向您的 Linux 计算机发送数据包,您的 Linux 计算机将反射数据包。如果一切正常,您应该看到一组数据包返回时间。

3.3 配置外部网络

现在我们准备配置外部网络。有时这会很困难,具体取决于您的互联网提供商对 Linux 的支持程度。如果您遇到困难,有一个 ADSL mini-HOWTO,其中详细介绍了 ADSL 问题。如果我能找到 Cable Modem HOWTO,我也会链接到它。

大多数外部连接的主要问题是获取 IP 地址。一些互联网提供商向有线或 ADSL 用户分发静态 IP 地址,在这种情况下配置很容易。但是,大多数提供商现在已经转向通过(您猜对了)DHCP 进行动态配置。这意味着您的 Linux 计算机很可能在您的 eth1 接口上是 DHCP 服务器,而在您的 eth0 接口上是 DHCP 客户端

此外,许多提供商已经开始以专门的非标准方式提供他们的服务,这些方式假定他们的客户将使用 Windows。其中一些情况将在第 3.3.2 节末尾讨论。

使用静态 IP

如果您的互联网提供商已为您分配了静态 IP 地址,那么您就处境不错。首先,创建一个新的接口配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 并将以下内容放入其中

DEVICE=eth0
IPADDR=x.x.x.x
NETMASK=y.y.y.y
ONBOOT=yes
 

只需用您的互联网提供商给出的值填写 x.x.x.x 和 y.y.y.y。现在编辑 /etc/resolv.conf 文件并输入以下信息

search provider_domain_here
nameserver n.n.n.n
nameserver m.m.m.m
 

provider_domain 应由您的互联网提供商提供。还要在 n.n.n.n 和 m.m.m.m 行中输入主 DNS 服务器和辅助 DNS 服务器。如果您已将 Linux 盒子设置为 DNS 服务器,则可以在其他 nameserver 条目之前添加一行:nameserver 127.0.0.1。这将使您的 Linux 服务器在使用缓存服务器之前先向外部服务器请求 DNS 信息。

使用 DHCP

如果您的互联网提供商使用 DHCP 配置,您需要创建一个新的接口配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 并将以下内容放入其中

DEVICE=eth0 
BOOTPROTO=dhcp 
ONBOOT=yes
 

现在确保 dhcpcd 客户端守护程序已安装在您的系统上。转到您的 Linux CD 并安装 dhcpcd RPM 包。

是时候测试您的新网络配置了。只需使用命令 /etc/rc.d/init.d/network restart。现在使用 ping 测试您的外部连接。ping 互联网上的计算机,例如 www.yahoo.com,看看是否有任何返回。

怪癖和异常

您的情况可能与上面描述的非常简单的情况不同。以下是一些关于各种困难的简短评论,以及指向更权威资源和解决这些困难的链接。感谢 John Mellor 提供链接和添加此部分的动力。

以太网上的 PPP (PPPoE)

几家 ADSL 提供商(例如 Bell Atlantic)现在坚持要求他们的新客户使用“以太网上的 PPP”协议 (PPPoE) 连接到服务。为此,他们提供了一个 Windows 客户端程序:对于 Linux 用户来说不是很有用。幸运的是,PPPoE 是一个简单的协议,并且正在努力在 Linux 下支持它。

愚蠢的 DHCP 技巧

网络提供商玩弄的最喜欢的技巧之一是将您的服务绑定到唯一的主机名,甚至唯一的网卡。据推测,这是为了防止您使用集线器将多台计算机插入您的以太网端口(当然,通过使用 Linux 和伪装,您正在获得相同的效果,并且安全性更高,而且有线电视公司无法知道!)。

如果提供商给了您一个主机名,并坚持要求您使用该名称设置您的 Windows 盒子才能使用他们的服务,那么您必须确保您的 Linux 盒子在从 DHCP 服务器请求地址时发送该主机名。

当您在接口配置文件中将 BOOTPROTO 设置为 dhcp 时,将调用 Red Hat DHCP 客户端,但在调用时未引用主机名。要在 Red Hat 6.1 中使用主机名调用程序,请编辑 /etc/sysconfig/network 文件,并更改行

HOSTNAME=

读取为

HOSTNAME=your_isp_assigned_name

这可能在某些 Red Hat 变体中不起作用。如果它不起作用,请检查 /sbin/ifup 脚本,看看对 dhcpcd 和 pump 的调用是否包含 -h $HOSTNAME 开关。如果它们没有,请添加它们,以便调用看起来像 /sbin/dhcpcd -i $DEVICE -h $HOSTNAME/sbin/pump -i $DEVICE -h $HOSTNAME

Road Runner

Road Runner 有线服务有一个特殊的登录过程,必须在服务器可以使用之前运行。幸运的是,有一个详细的 Linux Road Runner HOWTO 可用。

查看网络条目

现在您可以欣赏您的工作了。键入 ifconfig 以查看所有已配置的设备。在我的网关计算机上,它看起来像这样

eth0  Link encap:Ethernet  HWaddr 00:60:67:4A:02:0A 
      inet addr:24.65.182.43  Bcast:24.65.182.255  Mask:255.255.255.0 
      UP BROADCAST RUNNING MULTICAST  MTU:1500 Metric:1 
      RX packets:487167 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:467064 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:89 txqueuelen:100 
      Interrupt:10 Base address:0xe400
eth1  Link encap:Ethernet  HWaddr 00:80:C8:D3:30:2C 
      inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0 
      UP BROADCAST RUNNING MULTICAST  MTU:1500 Metric:1 
      RX packets:284112 errors:0 dropped:0 overruns:0 frame:1 
      TX packets:311533 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:37938 txqueuelen:100 
      Interrupt:5 Base address:0xe800
lo    Link encap:Local Loopback 
      inet addr:127.0.0.1  Mask:255.0.0.0 
      UP LOOPBACK RUNNING  MTU:3924  Metric:1 
      RX packets:12598 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:12598 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0
 

请注意,eth0 接口有一个漂亮的外部 IP 地址,而 eth1 地址有一个私有内部地址。

您可以通过键入 route 命令来查看网络路由。在我的网关计算机上,它看起来像这样

  Kernel IP routing table 
  Destination     Gateway      Genmask         Flags Metric Ref Use Iface 
  255.255.255.255 *            255.255.255.255 UH    0      0     0 eth1 
  192.168.1.0     *            255.255.255.0   U     0      0     0 eth1 
  24.65.182.0     *            255.255.255.0   U     0      0     0 eth0 
  127.0.0.0       *            255.0.0.0       U     0      0     0 lo 
  default         24.65.182.1  0.0.0.0         UG    0      0     0 eth0
 

在这里我们可以看到外部网络已设置,内部网络已设置,本地设备已设置,特殊的 255.255.255.255 广播地址已设置,并且默认路由已设置为指向互联网提供商的网关。完美!

现在您有了外部和内部。剩下的就是打开两者之间的门。但是首先,我们必须确保没有怪物可以从外部进入。

3.4 安全

通过 ADSL 或有线电视永久连接到互联网的缺点之一是,您的计算机 24 小时/7 天都暴露于潜在的安全威胁之下。使用 Linux 作为网关可以降低风险,因为它隐藏了您的所有其他计算机:就互联网的其余部分而言,只有您的 Linux 盒子可用于连接。这意味着您的网络的安全性仅与您的 Linux 盒子一样安全,因此在这一点上,我将提供一些基本技巧来使您的盒子更安全。

首先,您需要将所有坏人拒之门外。为此,请编辑文件 /etc/hosts.deny 并确保它看起来像这样

# 
# hosts.deny  This file describes the names of the hosts which are 
#             *not* allowed to use the local INET services, as decided 
#             by the '/usr/sbin/tcpd' server. 
# 
#            The portmap line is redundant, but it is left to remind you that 
#        the new secure portmap uses hosts.deny and hosts.allow. In particular 
#             you should know that NFS uses portmap! 
ALL: ALL 
 

这告诉“TCP wrappers” -- 它控制 95% 的传入连接 -- 拒绝来自所有主机的全部连接。这是一个非常好的规则!但是,它也会阻止您从家庭网络内部连接到您的 Linux 盒子,这很烦人,因此我们将做一个例外。编辑文件 /etc/hosts.allow 并确保它看起来像这样

# 
# hosts.allow  This file describes the names of the hosts which are 
#              allowed to use the local INET services, as decided 
#              by the '/usr/sbin/tcpd' server. 
# 
ALL: 127.0.0.1 
ALL: 192.168.1.
 

这告诉“TCP wrappers”,他们可以允许来自本地设备 (127.0.0.1) 和您的家庭网络 (192.168.1.) 的所有服务的连接。

您现在已经用坚固的挂锁将怪物锁在外面了。如果您想安装栏杆和警报系统,您将必须更加复杂。如果您想了解更多关于保护您的 Linux 盒子的信息,Security HOWTO 是一个不错的起点。


下一步 上一步 目录