Linux的sysctl 命令参数详解

本文的目的是为了调整UNIX
IP堆栈以更有效的防止现今多种类型的攻击,详细描述了一些UNIX服务系统中网络服务如HTTP或者routing的推荐设置,其中系统包括了如下不同的UNIX:A.
IBM AIX 4.3.XB. Sun Solaris 7C. Compaq Tru64 UNIX 5.XD. HP HP-UX 11.0
(research ongoing)E. Linux kernel 2.2 (tested both SuSE Linux 7.0 和
RedHat 7.0)F. FreeBSDG. IRIX
6.5.10下面叙述的一些调整参数和句法在重新启动后将不会自动激活,所以如果你需要在每次启动的时候长期保持这些参数,你就需要增加这些实时命令到如下的启动文件中:AIX

Linux内核通过/proc虚拟文件系统向用户导出内核信息,用户也可以通过/proc文件系统或通过sysctl命令动态配置内核。比如,如果我们想启动NAT,除了加载模块、配置防火墙外,还需要启动内核转发功能。我们有三种方法:

  • /etc/rc.netSolaris – /etc/init.d/inetinitTru64 UNIX – 使用sysconfigdb
    或者 dxkerneltuner 命令HP-UX – /etc/rc.config.d/nddconfLinux kernel 2.2
  • /etc/sysctl.confFreeBSD – /etc/rc.confIRIX –
    使用systune命令====================================================================以下是一些IP堆栈调整建议:1,调节TCP发送和接受空间(TCP
    send and receive spaces)TCP发送和接受的空间直接影响TCP 窗口大小参数(TCP
    window size
    parameter),一定程度上的窗口大小增加有助于更有效的传输,尤其是一些需要大数量传输的服务如FTP和HTTP,默认的一些设置不是每个系统都是最优化的,一般我们需要增加这个窗口大小为32768字节。除非你设置的时候很清楚的理解RFC1323()和RFC2018(),否则你不要把这个值增加到高于64K字节。A.
    AIX/usr/sbin/no -o tcp_sendspace=32768/usr/sbin/no -o
    tcp_recvspace=32768B. Solaris/usr/sbin/ndd -set /dev/tcp
    tcp_xmit_hiwat 32768/usr/sbin/ndd -set /dev/tcp tcp_recv_hiwat
    32768C. Tru64 UNIX没有推荐的调整.D.
    HP-UX默认情况下TCP发送和接受空间已经设置为32768.E. Linux kernel
    2.2Linux自动分配TCP发送和接受空间并默认共同支持RFC1323 (large window
    support,net.ipv4.tcp_window_scaling) 和 RFC2018 (SACK support,
    net.ipv4.tcp_sack).F. FreeBSDsysctl -w
    net.inet.tcp.sendspace=32768sysctl -w net.inet.tcp.recvspace=32768G.
    IRIX默认情况下TCP发送和接受空间设置为64K字节.2,调整套接口序列防止SYN攻击各种网络应用软件一般必须开放一个或者几个端口供外界使用,所以其必定可以会被恶意攻击者向这几个口发起拒绝服务攻击,其中一个很流行的攻击就是SYNFLOOD,在攻击发生时,客户端的来源IP地址是经过伪造的(spoofed),现行的IP路由机制仅检查目的IP地址并进行转发,该IP包到达目的主机后返回路径无法通过路由达到的,于是目的主机无法通过TCP三次握手建立连接。在此期间因为TCP套接口缓存队列被迅速填满,而拒绝新的连接请求。为了防止这些攻击,部分UNIX变种采用分离入站的套接口连接请求队列,一队列针对半打开套接口(SYN
    接收,SYN|ACK 发送),
    另一队列针对全打开套借口等待一个accept()调用,增加这两队列可以很好的缓和这些SYN
    FLOOD攻击并使对服务器的影响减到最小程度:A. AIX/usr/sbin/no -o
    clean_partial_conns=1这个设置会指示内核随机的从q0队列中去掉半打开套接口来为新的套接口增加所需空间。B.
    Solaris/usr/sbin/ndd -set /dev/tcp tcp_conn_req_max_q 1024使q
    队列拥有接口等待来自应用程序的accept()调用./usr/sbin/ndd -set /dev/tcp
    tcp_conn_req_max_q0 2048使q0 队列能维护半打开套接口.C. Tru64
    UNIX/sbin/sysconfig -r socket
    sominconn=65535这个sominconn的值决定了系统能同时处理多少个相同的进入的SYN信息包./sbin/sysconfig
    -r socket
    somaxconn=65535这个somaxconn值设置了系统能保留多少个待处理TCP连接.D.
    HP-UX/usr/sbin/ndd -set tcp_syn_rcvd_max 1024/usr/sbin/ndd -set
    tcp_conn_request_max 200E. Linux kernel 2.2/sbin/sysctl -w
    net.ipv4.tcp_max_syn_backlog=1280有效的增加q0的套接口队列大小./sbin/sysctl
    -w net.ipv4.tcp_syn_cookies=1启用TCP SYN cookies支持,能有效的减轻SYN
    FLOOD的攻击,但是这个参数会对一些大的窗口引起一些性能问题(参看RFC1323
    and RFC2018.F. FreeBSDsysctl -w kern.ipc.somaxconn=1024G.
    IRIXlisten()队列被硬性设置为32.但是系统实际采用待处理连接数为((3 *
    backlog) / 2) +
    1,其中的backlog数值最大值为49.3,调整Redirects参数恶意用户可以使用IP重定向来修改远程主机中的路由表,在设计良好的网络中,末端的重定向设置是不需要的,发送和接受重定向信息包都要关闭。A.
    AIX/usr/sbin/no -o ipignoreredirects=1/usr/sbin/no -o
    ipsendredirects=0B. Solaris/usr/sbin/ndd -set /dev/ip
    ip_ignore_redirect 1/usr/sbin/ndd -set /dev/ip ip_send_redirects 0C.
    Tru64 UNIX没有推荐的调整设置.D. HP-UX/usr/sbin/ndd -set /dev/ip
    ip_send_redirects 0E. Linux kernel 2.2/sbin/sysctl -w
    net.ipv4.conf.all.send_redirects=0/sbin/sysctl -w
    net.ipv4.conf.all.accept_redirects=0F. FreeBSDsysctl -w
    net.inet.icmp.drop_redirect=1sysctl -w
    net.inet.icmp.log_redirect=1sysctl -w net.inet.ip.redirect=0sysctl -w
    net.inet6.ip6.redirect=0G. IRIX/usr/sbin/systune icmp_dropredirects to
    14,调整ARP清理设置通过向IP路由缓冲填充伪造的ARP条目可以让恶意用户产生资源耗竭和性能减低攻击。在Solaris中,有2个参数可以管理间隔的清理IP路由缓冲,针对未请求的ARP响应可以通过arp_cleanup_interval调整,AIX可以通过artp_killc来设置。A.
    AIX/usr/sbin/no -o arpt_killc=20B. Solaris/usr/sbin/ndd -set /dev/arp
    arp_cleanup_interval 60000C. Tru64 UNIX没有参考的调整设置.D.
    HP-UX默认设置为5分钟.E. Linux kernel 2.2没有参考的调整设置.F.
    FreeBSDsysctl -w net.link.ether.inet.max_age=1200G.
    IRIX没有参考的调整设置.5,调整源路由的设置通过源路由,攻击者可以尝试到达内部IP地址
    –包括RFC1918中的地址,所以不接受源路由信息包可以防止你的内部网络被探测。A.
    AIX/usr/sbin/no -o ipsrcroutesend=0关闭源路由信息包发送./usr/sbin/no -o
    ipsrcrouteforward=0如果你这个系统要做路由工作如防火墙,这个参数就很重要,关闭这个特征就可以很好的防止转发源路由信息包.B.
    Solaris/usr/sbin/ndd -set /dev/ip ip_src_route_forward
    0如果你这个系统要做路由工作如防火墙,这个参数就很重要,关闭这个特征就可以很好的防止转发源路由信息包.C.
    Tru64 UNIX没有推荐的调整.D. HP-UXndd -set /dev/ip
    ip_forward_src_routed
    0关闭这个特征就可以很好的防止转发源路由信息包.E. Linux kernel
    2.2/sbin/sysctl -w
    net.ipv4.conf.all.accept_source_route=0丢弃所有源地址信息包./sbin/sysctl
    -w net.ipv4.conf.all.forwarding=0/sbin/sysctl -w
    net.ipv4.conf.all.mc_forwarding=0不转发源路由帧.F. FreeBSDsysctl -w
    net.inet.ip.sourceroute=0sysctl -w net.inet.ip.accept_sourceroute=0G.
    IRIX/usr/sbin/systune ipforward to 26. 调整TIME_WAIT setting
    设置在一些比较繁忙的WEB服务器上,许多套接口可能就处于TIME_WAIT状态,这是由于一些不正规编码的客户端应用程序没有很正确的处理套接口所引起的,这就可能引起如DDOS的攻击。A.
    AIX没有推荐设置.B. Solaris/usr/sbin/ndd -set /dev/tcp
    tcp_time_wait_interval
    60000这个参数影响了TCP套接口保持TIME_WAIT状态的时间数,默认情况下对于一个繁忙的WEB服务器太高了,所以需要设置到低于每60秒,这个参数名字适用与Solaris7或者更高的版本,在Solaris
    7之前的版本,其名字不正确的表识为tcp_close_wait_interval.C. Tru64
    UNIX没有推荐的调整设置.D. HP-UXndd -set /dev/tcp
    tcp_time_wait_interval 60000套接口将保持TIME_WAIT状态不超过60秒.E.
    Linux kernel 2.2/sbin/sysctl -w
    net.ipv4.vs.timeout_timewait=60套接口将保持TIME_WAIT状态不超过60秒.F.
    FreeBSD没有推荐的调整设置.G. IRIX/usr/sbin/systune tcp_2msl to
    607,调整广播ECHO响应Smurf攻击就是一个伪造的地址通过发送ICMP 8 0 (ECHO
    REQUEST)
    信息到一个广播地址,一些IP堆栈默认情况下会响应这些信息,所以必须关闭这个特征。如果这个主机作为防火墙使用(router),关闭这个特征就不能处理处理广播。A.
    AIX/usr/sbin/no -o directed_broadcast=0不响应直接广播.B.
    Solaris/usr/sbin/ndd -set /dev/ip ip_respond_to_echo_broadcast
    0不响应直接广播./usr/sbin/ndd -set /dev/ip
    ip_forward_directed_broadcasts 0不转发直接广播.C. Tru64
    UNIX没有推荐调整设置.D. HP-UXndd -set /dev/ip
    ip_respond_to_echo_broadcast 0不响应直接广播.ndd -set /dev/ip
    ip_forward_directed_broadcasts 0不转发直接广播.�E. Linux kernel
    2.2/sbin/sysctl -w
    net.ipv4.icmp_echo_ignore_broadcasts=1不响应直接广播.F. FreeBSDsysctl
    -w net.inet.icmp.bmcastecho=0G. IRIX/usr/sbin/systune
    allow_brdaddr_srcaddr to
    08,针对其他广播探测的调整其他还有2个广播探测可以让恶意用户利用,一个就是地址掩码查询可以用来探测网络段大小和范围。时间戳广播可以映射和鉴定主机类型。A.
    AIX/usr/sbin/no -o icmpaddressmask=0防止地址掩玛查询.B.
    Solaris/usr/sbin/ndd -set /dev/ip
    ip_respond_to_address_mask_broadcast
    0防止地址掩玛查询./usr/sbin/ndd -set /dev/ip
    ip_respond_to_timestamp_broadcast 0关闭对时间戳广播询问的响应.C.
    Tru64 UNIX没有推荐的调整.D. HP-UXndd -set /dev/ip
    ip_respond_to_address_mask_broadcast
    0防止泄露主机配置的网络掩码.ndd -set /dev/ip
    ip_respond_to_timestamp_broadcast 0关闭对时间戳广播询问的响应.E.
    Linux kernel 2.2没有推荐的调整.F. FreeBSDsysctl -w
    net.inet.icmp.maskrepl=0G. IRIX使用ipfilterd
    来阻塞不需要的ICMP类型.9,调整参数以支持RFC1948下面几个调整会利用RFC1948()TCP/IP序列号产生技术来保证给一个TCP
    套接口的序列号码非常难猜测:B. SolarisSet TCP_STRONG_ISS=2 in
    /etc/default/inetinit.这需要重新启动才能使能.G. IRIX/usr/sbin/systune
    tcpiss_md5 to 1
  1. 直接写/proc文件系统
    # echo 1 > /proc/sys/net/ipv4/ip_forward

  2. 利用sysctl命令
    # sysctl -w net.ipv4.ip_forward=1
    sysctl -a可以查看内核所有导出的变量

  3. 编辑/etc/sysctl.conf
    添加如下一行,这样系统每次启动后,该变量的值就是1
    net.ipv4.ip_forward = 1

sysctl是procfs软件中的命令,该软件包还提供了w, ps, vmstat, pgrep, pkill,
top, slabtop等命令。

sysctl配置与显示在/proc/sys目录中的内核参数.可以用sysctl来设置或重新设置联网功能,如IP转发、IP碎片去除以及源路由检查等。用户只需要编辑/etc/sysctl.conf文件,即可手工或自动执行由sysctl控制的功能。

    命令格式:    sysctl [-n] [-e] -w variable=value    sysctl
[-n] [-e] -p <filename> (default /etc/sysctl.conf)    sysctl
[-n] [-e] -a    常用参数的意义:    -w  
临时改变某个指定参数的值,如         sysctl -w net.ipv4.ip_forward=1   
-a   显示所有的系统参数    -p  
从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载   
如果仅仅是想临时改变某个系统参数的值,可以用两种方法来实现,例如想启用IP路由转发功能:   
1) #echo 1 > /proc/sys/net/ipv4/ip_forward    2) #sysctl -w
net.ipv4.ip_forward=1   
以上两种方法都可能立即开启路由功能,但如果系统重启,或执行了     #
service network
restart命令,所设置的值即会丢失,如果想永久保留配置,可以修改/etc/sysctl.conf文件将
net.ipv4.ip_forward=0改为net.ipv4.ip_forward=1

 

sysctl是一个允许您改变正在运行中的Linux系统的接口。它包含一些 TCP/IP
堆栈和虚拟内存系统的高级选项,
这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。基于这点,sysctl(8)
提供两个功能:读取和修改系统设置。
查看所有可读变量:
% sysctl -a
读一个指定的变量,例如 kern.maxproc:
% sysctl kern.maxproc kern.maxproc: 1044
要设置一个指定的变量,直接用 variable=value 这样的语法:
# sysctl kern.maxfiles=5000
kern.maxfiles: 2088 -> 5000
您可以使用sysctl修改系统变量,也可以通过编辑sysctl.conf文件来修改系统变量。sysctl.conf
看起来很像 rc.conf。它用 variable=value
的形式来设定值。指定的值在系统进入多用户模式之后被设定。并不是所有的变量都可以在这个模式下设定。
sysctl 变量的设置通常是字符串、数字或者布尔型。 (布尔型用 1
来表示’yes’,用 0 来表示’no’)。

sysctl -w kernel.sysrq=0
sysctl -w kernel.core_uses_pid=1
sysctl -w net.ipv4.conf.default.accept_redirects=0
sysctl -w net.ipv4.conf.default.accept_source_route=0
sysctl -w net.ipv4.conf.default.rp_filter=1
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_synack_retries=2
sysctl -w net.ipv4.tcp_keepalive_time=3600
sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.ipv4.tcp_sack=1

配置sysctl

编辑此文件:

vi /etc/sysctl.conf

如果该文件为空,则输入以下内容,否则请根据情况自己做调整:

# Controls source route verification
# Default should work for all interfaces
net.ipv4.conf.default.rp_filter = 1
# net.ipv4.conf.all.rp_filter = 1
# net.ipv4.conf.lo.rp_filter = 1
# net.ipv4.conf.eth0.rp_filter = 1

# Disables IP source routing
# Default should work for all interfaces
net.ipv4.conf.default.accept_source_route = 0
# net.ipv4.conf.all.accept_source_route = 0
# net.ipv4.conf.lo.accept_source_route = 0
# net.ipv4.conf.eth0.accept_澳门新葡亰3522平台游戏,source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core
filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Increase maximum amount of memory allocated to shm
# Only uncomment if needed!
# kernel.shmmax = 67108864

# Disable ICMP Redirect Acceptance
# Default should work for all interfaces
net.ipv4.conf.default.accept_redirects = 0
# net.ipv4.conf.all.accept_redirects = 0
# net.ipv4.conf.lo.accept_redirects = 0
# net.ipv4.conf.eth0.accept_redirects = 0

# Enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
# Default should work for all interfaces
net.ipv4.conf.default.log_martians = 1
# net.ipv4.conf.all.log_martians = 1
# net.ipv4.conf.lo.log_martians = 1
# net.ipv4.conf.eth0.log_martians = 1

# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 25

# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1200

# Turn on the tcp_window_scaling
net.ipv4.tcp_window_scaling = 1

# Turn on the tcp_sack
net.ipv4.tcp_sack = 1

# tcp_fack should be on because of sack
net.ipv4.tcp_fack = 1

# Turn on the tcp_timestamps
net.ipv4.tcp_timestamps = 1

# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1

# Enable ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Make more local ports available
# net.ipv4.ip_local_port_range = 1024 65000

# Set TCP Re-Ordering value in kernel to ‘5′
net.ipv4.tcp_reordering = 5

# Lower syn retry rates
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3

# Set Max SYN Backlog to ‘2048′
net.ipv4.tcp_max_syn_backlog = 2048

# Various Settings
net.core.netdev_max_backlog = 1024

# Increase the maximum number of skb-heads to be cached
net.core.hot_list_length = 256

# Increase the tcp-time-wait buckets pool size
net.ipv4.tcp_max_tw_buckets = 360000

# This will increase the amount of memory available for socket
input/output queues
net.core.rmem_default = 65535
net.core.rmem_max = 8388608
net.ipv4.tcp_rmem = 4096 87380 8388608
net.core.wmem_default = 65535
net.core.wmem_max = 8388608
net.ipv4.tcp_wmem = 4096 65535 8388608
net.ipv4.tcp_mem = 8388608 8388608 8388608
net.core.optmem_max = 40960