freebsd下通过 sysctl 进行调优

现象一:系统响应变慢

系统由于某些原因在I/O操作上消耗了时间。可以通过执行systat -vm命令,通过显示的信息检查硬盘是否存在非常多的I/O操作,同时运行sysctl -a|grep “ufs.dirhash”命令查看vfs.ufs.dirhash_mem和vfs.ufs.dirhash_maxmem的值,如下:
[[email protected] ~]#sysctl -a|grep “ufs.dirhash”
vfs.ufs.dirhash_mem: 62741
vfs.ufs.dirhash_maxmem: 2097152
[[email protected] ~]#
如果vfs.ufs.dirhash_mem的值接近vfs.ufs.dirhash_maxmem的值,那么说明有可能系统由于存在大量文件的目录,而dirhash 缓存不足而导致大量的I/O阻塞,此时应将dirhash_maxmem提高至少1倍。

现象二:出现很多TIME_WAIT连接

FreeBSD默认情况下,TIME_WAIT的timeout为60秒,并不是所有出现很多TIME_WAIT连接的情况都需要采取行动。但是,通过配置TCP socket的回收,能够改善某些应用的响应速度。
FreeBSD的TCP/IP协议栈会在必要时,自动将TCP协议允许回收的TIME_WAIT状态的TCP socket回收,因此假如应用程序不受这种状态的连接的影响,就没有必要进行任何调整。某些应用程序,如Apache HTTPD,有可能由于连接回收问题导致负载过高,此时,可以对此超时时间进行调整。
FreeBSD的TIME_WAIT状态默认超时时间为2*MSL;这是目前唯一可以影响这一超时时间的配置。对应的sysctl变量是 net.inet.tcp.msl。一般说来,对于多数网络而言,这个值设置应为2000或2500是不会致导致问题的。请注意,这个数值也是 TCP三次握手的超时时间,如果设置的太短,可能会导致网络状况较差的用户无法连接网站。参考:
[[email protected] ~]#sysctl -a|grep “net.inet.tcp.msl”
net.inet.tcp.msl: 30000
[[email protected] ~]#

现象三:有人在扫描TCP/UDP端口

默认情况下,FreeBSD会对未开放端口的连接请求回应ICMP unreachable消息(默认设置为200条每秒)。对于半开式端口扫描而言,这些信息会帮助他们进行扫描。
一般说来,我们并不建议阻止这种扫描;如果希望完全阻止这类扫描,可以设置以下参数:
net.inet.tcp.blackhole=1
net.inet.udp.blackhole=1
来禁止回应RST;这种做法的一个明显的缺陷是,一旦服务死掉,探测程序必须等待超时才能够知道服务的状态,对于前面有负载均衡设备的服务器而言,这种设置是不能使用的;此外,完全禁止扫描,并不会提高任何安全性。

建议的做法是降低这种扫描的有效性,方法是:
net.inet.icmp.icmplim=5
这里,5是一个经验数值。每秒钟能够得到最多5次unreachable消息,对于攻击者而言,意味着需要花费更多的精力和代价进行扫描,这意味着你会有更多的机会抓到他。

现象四:提示Limiting *** from XXX to 200 packets/sec信息

出现Limiting *** from XXX to 200 packets/sec信息需要分情况讨论。如果你的服务很繁忙,并且看到的是open port RST,这种情况必须重视,因为它显示你的服务响应能力不足。如果是closed port RST,说明有人在尝试扫描你的端口,或者某个被人经常访问的服务死掉了。对于后一种情况,假如感觉这种提示很烦,可以考虑用下列配置:
net.inet.icmp.icmplim_output=0
来禁止输出,然而这可能不是一个好主意;另一个办法是提高limit:
net.inet.icmp.icmplim=1000
这同样不是一个好主意,因为它可能造成杠杆式 DoS(通过伪造源 IP 地址来让你的服务器互相发 RST)。最后一种办法是禁止发送 closed port RST 回应:
net.inet.tcp.blackhole=1
net.inet.udp.blackhole=1
这种方法会削弱多数负载均衡设备的探测能力。
可根据实际情况进行适当的配置。
最后一点,抛弃SYN+FIN 包有用吗?一些人建议采用 net.inet.tcp.drop_synfin=1 来防止TCP工具,如nmap探测操作系统。这是一种十分幼稚的建议。因为TCP探测工具并不仅仅依赖SYN+FIN来判断操作系统。抛弃SYN+FIN包是违反TCP协议的,不建议使用这个选项。