调整 Tux,第 1 部分

作者:Marcel Gagné

大家好,真正的信徒们。你们对“泄密的心”系列(特别是 /proc 总结)的反应令人感动,也让我内心振奋。*嗅* 紧随上期专栏之后,我想开始一些新的东西,我称之为“调整 Tux”。虽然对某些人来说,这可能会让人联想到一个白色蓬松的角色在肚子被戳时大笑的画面,但我希望这个形象是:为了性能、乐趣和收益而调整您的 Linux 系统。好吧,也许只是为了乐趣。

好的,这是我的计划。在本系列的接下来几期中,我们将探讨另一个似乎没人愿意谈论的话题(比如打印 - 好吧,你能怪他们吗?)。早在很久以前,当我刚开始使用 UNIX 系统时,我们总是必须编译自己的内核(就像早期的 Linux 那样)。我们这样做是因为每个系统在硬件、驱动程序、用户数量等方面都不同,所有这些参数都必须在您启动系统之前加以考虑。否则,第 20 个人登录后,系统就会崩溃。资源和容量规划以及性能调优都是必须考虑的底层问题。今天的系统则不然。在大多数情况下,当有人问我他们应该何时重建内核时,我这样回答。

"永远不要。"

除非你必须这样做。不,本系列不是关于重建你的内核。而是关于重建你的内核。也是关于重启。

上周,我们讨论了 /proc 文件系统及其所有奇妙之处。我给你们留下了一个关于修改正在运行的内核的小问题,就是这样。在本系列中,我们将开始更详细地探索 /proc,但会一点一点地进行。我还想谈谈性能、限制以及了解您的系统何时需要更多资源。但首先,再多谈一点关于 /proc 的内容。

好的。切换到 /etc/sysconfig 目录,并对您的 network 文件执行 cat 命令。它应该看起来像这样

   NETWORKING=yes
   FORWARD_IPV4=no
   HOSTNAME=netgate.mycompany.com
   GATEWAY=192.168.22.10
   GATEWAYDEV=

特别注意第二行 (FORWARD_IPV4)。对于那些还不熟悉这个概念的人来说,IP 转发意味着路由。路由意味着联网的计算机将在网络之间转发或定向数据包,特别是来自您网络上其他计算机的数据包。通过这种方式,具有单个拨号 Internet 连接的计算机可以充当整个计算机网络的网关。默认情况下,您的系统不执行 IP 转发。如果您想更改它,以便在启动时(或网络重启时)您确实启用了转发,您需要将 FORWARD_IPV4 的值更改为“yes”而不是“no”。现在,对于所有升级用户来说,这里有一个小问题。

如果您正在升级到 Red Hat 6.2 并且当前正在运行 IP 转发,您可能会发现事情似乎无法使用旧的配置文件正常工作。如果您从一个全新的 6.2 系统开始,您的 /etc/sysconfig/network 文件将有一个条目,内容大致如下(凭记忆说的)

   # FORWARD_IPV4 removed; see /etc/sysctl.conf

/etc/sysctl.conf 文件看起来像这样

   # Disables packet forwarding
   net.ipv4.ip_forward = 0
   # Enables source route verification
   net.ipv4.conf.all.rp_filter = 1
   # Disables automatic defragmentation (needed for masquerading, LVS)
   net.ipv4.ip_always_defrag = 0
   # Disables the magic-sysrq key
   kernel.sysrq = 0

在这两种情况下,发生的事情是相同的。由于设置了这些参数,因此对 /proc 文件系统中的条目进行了更改,在本例中为 /proc/sys/net/ipv4/ip_forward。如果您 cat 此文件,您将看到一个简单的“0”或“1”(如果您正在运行转发)。长话短说,将您的网络从不转发更改为转发就像更改 /proc 条目一样简单。

将您自己的条目写入 proc 条目(在本例中特指 ip_forward)的方法如下

   echo "1" > /proc/sys/net/ipv4/ip_forward

这将与修改其他网络启动脚本具有完全相同的效果。为了确保在启动时发生这种情况,只需将该行(带有适合您自己的注释)添加到您的 /etc/rc.d/rc.local 脚本中。

酷吗?重点(我是在强调重点吗?)是您可以更改正在运行的系统上的内容,实际上是在修改正在运行的内核。事实上,/proc 中的许多条目都可以在您的系统运行时进行修改。这样做原因各不相同;从更改事物的行为到扩展在编译时内置到内核中的限制,再到提高性能。缺点是,您最终可能会让事情变得比您开始接触这些东西之前更糟,这就是为什么我要发出以下警告。 <模棱两可的措辞> 小心。当您更改 /proc 中的内容时,请非常小心。 </模棱两可的措辞>

到现在,我们都熟悉 DoS(拒绝服务)攻击。一个相当简单的攻击是 TCP SYN 洪水攻击。对此的简单解释是,在与远程网络建立通信时,您发送一个数据包,该数据包随后被该网络确认,然后您确认该确认。有点像下面这个愚蠢的对话。

  “你好,远程。”

  “你好。”

  “很好,你在家而且在说话。我们聊聊吧。”

通常,当您给某人打电话时,您希望他们说“你好”,这时您会回复“你好”。如果我在几秒钟内给您家打一千次电话并立即挂断,我可能很快就会让您发疯或感到危险。在您系统的情况下,TCP SYN 洪水攻击就像电话在很短的时间内响了数千次。与此同时,您的系统仍在保持警惕,希望能听到对其“你好”的回应,但回应却没有到来。强制系统跟踪太多此类单方面消息(有一个系统/内核表执行此操作),您的网络可能会变得不可用(或更糟)。这就是 syncookies 的用途:一种机制,如果回复时间过长,您的系统可以转储未确认的确认(真拗口)。如果您的网络恰好受到攻击,syncookies 也会转储任何可能将您的系统推向崩溃边缘的 SYN 数据包。

现在,任何最新的 Linux 内核都内置了对 TCP syncookies 的支持,默认未启用。如果您的系统作为网关连接到 Internet,您肯定希望启用此功能。要做到这一点,您需要回到 /proc。对 /proc/sys/net/ipv4/tcp_syncookie 执行 cat 命令将显示它被设置为 0(表示“关闭”)。要启用 syncookie 保护,请将其更改为 1,就像您对 IP 转发所做的那样。

     echo "1" > /proc/sys/net/ipv4/tcp_syncookies

在我们继续之前,这里还有另一个有趣的例子。执行 netstat -a 命令并查看显示结果。您将看到类似这样的内容

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address      State
tcp        0   0 gate1.mycorp.com:2354   www.mycorp.com:pop3   TIME_WAIT
tcp        0   6 gate1.mycorp.com:2344   news.whodat.ca:nntp   ESTABLISHED
tcp        1   0 gate1.mycorp.com:2277   visit.rsite.org:www   CLOSE_WAIT
tcp       57   0 gate1.mycorp.com:2195   host.somsite.org:ftp  CLOSE_WAIT

请注意附加到本地地址的数字(例如,gate1.mycorp.com:2195)。这些是 TCP 套接字,它们的编号由系统根据需要分配。您可能已经猜到,远程站点可以通过这些套接字(或端口)与您的站点通信,其数量存在上限。该数字有一个下限和一个上限。下限是 1024,上限是 4099。自己检查一下。

     # cat /proc/sys/net/ipv4/ip_local_port_range
     1024 4999

如果您正在运行一个繁忙的网站,您可能会发现自己遇到了这个限制。在这样一个(繁忙的)网站上,建议的步骤是将其从 1024 4099 更改为 32768 61000,就像这样

     echo "32768   61000" > /proc/sys/net/ipv4/ip_local_port_range

好的,最后一个小问题。系统是如何做到这一点的?这是方法 1。在我的一个系统(Red Hat 6.0)上,/etc/rc.d/init.d/network 脚本中有这样一小段代码

         if [ "$FORWARD_IPV4" = "no" -o "$FORWARD_IPV4" = "false" ]; then
             value=0
             message="Disabling IPv4 packet forwarding"
         else
             value=1
             message="Enabling IPv4 packet forwarding"
         fi
         if [ $value != `cat /proc/sys/net/ipv4/ip_forward` ]; then
             action "$message" /bin/true
             echo "$value" > /proc/sys/net/ipv4/ip_forward
         fi

请注意底部的 echo "$value" > 行。看起来和我们在命令行中所做的几乎相同。这是一个方法;这是方法 2。早些时候,我提到 Red Hat 6.2 的做法略有不同。那时我们查看了 sysctl.conf 文件以设置 IP 转发。这与系统设置这些参数的方式有什么关系呢?答案是 /etc/sysctl.conf 文件由 sysctl 命令使用。查看您的 /etc/rc.d/init.d/network 脚本(使用 vicat 命令),并查找以下行

   action "Setting network parameters" sysctl -p /etc/sysctl.conf

sysctl-p 选项告诉命令从指定的文件中读取其参数,在本例中是 /etc/sysctl.conf,其中一个参数是 ip_forward。这是我的最后一个问题。在不查看源代码的情况下,您认为“sysctl”是做什么的?

我们在这里停下来,为下次做准备,届时我们将开始深入研究性能问题,查看更多工具,并找到其他有趣的 /proc 用法。下次再见,给 Tux 调整一下。你们可能会喜欢它。

电子邮件:ljeditors@ssc.com

加载 Disqus 评论