内核参数优化vi /etc/sysctl.confnet.ipv4.tcp_max_syn_backlog = 65536net.core.netdev_max_backlog = 32768net.core.somaxconn = 32768net.core.wmem_default = 8388608net.core.rmem_default = 8388608net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.ipv4.tcp_timestamps = 0net.ipv4.tcp_synack_retries = 2net.ipv4.tcp_syn_retries = 2net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_mem = 94500000 915000000 927000000net.ipv4.tcp_max_orphans = 3276800net.ipv4.ip_local_port_range = 1024 65535sysctl -p各内核参数含义 net.ipv4.tcp_max_syn_backlog 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于超过 128M 内存的系统而言,缺省值是 1024,低于 128M 小内存的系统则是 128。 SYN Flood 攻击利用 TCP 协议散布握手的缺陷,伪造虚假源 IP 地址发送大量 TCP-SYN 半打开连接到目标系统,最终导致目标系统 Socket 队列资源耗尽而无法接受新的连接。为了应付这种攻击,现代 Unix 系统中普遍采用多连接队列处理的方式来缓冲(而不是解决)这种攻击,是用一个基本队列处理正常的完全连接应用(Connect()和 Accept() ),是用另一个队列单独存放半打开连接。 这种双队列处理方式和其他一些系统内核措施(例如 Syn-Cookies/Caches)联合应用时,能够比较有效的缓解小规模的 SYN Flood 攻击(事实证明<1000p/s)加大 SYN 队列长度可以容纳更多等待连接的网络连接数,一般遭受 SYN Flood 攻击的网站,都存在大量 SYN_RECV 状态,所以调大tcp_max_syn_backlog 值能增加抵抗 syn 攻击的能力。 net.core.netdev_max_backlog 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。 net.core.somaxconn 调整系统同时发起并发 TCP 连接数,可能需要提高连接储备值,以应对大量突发入局连接请求的情况。 如果同时接收到大量连接请求,使用较大的值会提高受支持的暂挂连接的数量,从而可减少连接失败的数量。大的侦听队列对防止 DDoS 攻击也会有所帮助。挂起请求的最大数量默认是 128。 net.core.wmem_default 该参数指定了发送套接字缓冲区大小的缺省值(以字节为单位) net.core.rmem_default 该参数指定了接收套接字缓冲区大小的缺省值(以字节为单位) net.core.rmem_max 该参数指定了接收套接字缓冲区大小的最大值(以字节为单位) net.core.wmem_max 该参数指定了发送套接字缓冲区大小的最大值(以字节为单位)** net.ipv4.tcp_timestamps** Timestamps 可以防范那些伪造的 sequence 号码。一条 1G 的宽带线路或许会重遇到带 out-of-line数值的旧 sequence 号码(假如它是由于上次产生的)。时间戳能够让内核接受这种“ ” 异常 的数据包。这里需要将其关掉,以提高性能。 net.ipv4.tcp_synack_retries 对于远端的连接请求 SYN,内核会发送 SYN+ACK 数据报,以确认收到上一个 SYN 连接请求包。这是所谓的三次握手(threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的SYN+ACK 数目。不应该大于 255,默认值是 5,对应于 180 秒左右时间。(可以根据 tcp_syn_retries 来决定这个值) net.ipv4.tcp_syn_retries 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于 255,默认值是 5,对应于 180 秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为 2.这个值仅仅是针对对外的连接,对进来的连接,是由 tcp_retries1 决定的) net.ipv4.tcp_tw_recycle 表示开启 TCP 连接中 TIME-WAIT Sockets 的快速回收,默认为 0,表示关闭。 net.ipv4.tcp_tw_reuse 表示开启重用,允许将 TIME-WAIT Sockets 重新用于新的 TCP 连接,默认为 0,表示关闭。这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助。 net.ipv4.tcp_mem tcp_mem 有 3 个 INTEGER 变量:low, pressure, high low:当 TCP 使用了低于该值的内存页面数时,TCP 没有内存压力,TCP 不会考虑释放内存。(理想情况下,这个值应与指定给 tcp_wmem 的第 2 个值相匹配。这第 2 个值表明,最大页面大小乘以最大并发请求数除以页大小 (131072300/4096) pressure:当 TCP 使用了超过该值的内存页面数量时,TCP 试图稳定其内存使用,进入 pressure模式,当内存消耗低于 low 值时则退出 pressure 状态。(理想情况下这个值应该是 TCP 可以使用的总缓冲区大小的最大值(204800300/4096) high:允许所有 TCP Sockets 用于排队缓冲数据报的页面量。如果超过这个值,TCP 连接将被拒绝,这就是为什么不要令其过于保守(512000300/4096)的原因了。在这种情况下,提供的价值很大,它能处理很多连接,是所预期的 2.5 倍;或者使现有连接能够传输 2.5 倍的数据。 一般情况下这些值是在系统启动时根据系统内存数量计算得到的。 net.ipv4.tcp_max_orphans 系统所能处理不属于任何进程的 TCP sockets 最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即 reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS攻击﹐千万不要依赖这个或是人为的降低这个限制 net.ipv4.ip_local_port_range 将系统对本地端口范围限制设置为 1024~65000 之间Php 安全设置1) 打开 php 的安全模式php 的安全模式是个非常重要的内嵌的安全机制,能够控制一些 php 中的函数,比如 system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/etc/passwd,但是默认的 php.ini 是没有打开安全模式的,我们把它打开:safe_mode = on2) 用户组安全当 safe_mode 打开时,safe_mode_gid 被关闭,那么 php 脚本能够对文件进行访问,而且相同组的用户也能够对文件进行访问。建议设置为:safe_mode_gid = off如果不进行设置,可能我们无法对我们服务器网站目录下的文件进行操作了,比如我们需要对文件进行操作的时候。3) 安全模式下执行程序主目录如果安全模式打开了,但是却是要执行某些程序的时候,可以指定要执行程序的主目录:safe_mode_exec_dir = /usr/bin一般情况下是不需要执行什么程序的,所以推荐不要执行系统程序目录,可以指向一个目录,然后把需要执行的程序拷贝过去,比如:safe_mode_exec_dir = /tmp/cmd但是,我更推荐不要执行任何程序,那么就可以指向我们网页目录:safe_mode_exec_dir = /usr/www4) 安全模式下包含文件如果要在安全模式下包含某些公共文件,那么就修改一下选项:safe_mode_include_dir = /usr/www/include/其实一般 php 脚本中包含文件都是在程序自己已经写好了,这个可以根据具体需要设置。5) 控制 php 脚本能访问的目录使用 open_basedir 选项能够控制 PHP 脚本只能访问指定的目录,这样能够避免 PHP 脚本访问不应该访问的文件,一定程度上限制了 phpshell 的危害,我们一般可以设置为只能访问网站目录:open_basedir = /usr/www6) 关闭危险函数如果打开了安全模式,那么函数禁止是可以不需要的,但是我们为了安全还是考虑进去。比如,我们觉得不希望执行包括 system()等在那的能够执行命令的 php 函数,或者能够查看 php 信息的phpinfo()等函数,那么我们就可以禁止它们:disable_functions = system,passthru,exec,shell_exec,popen,phpinfo如果你要禁止任何文件和目录的操作,那么可以关闭很多文件操作disable_functions=chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown以上只是列了部分不叫常用的文件处理函数,你也可以把上面执行命令函数和这个函数结合,就能够抵制大部分的 phpshell 了。7) 关闭 PHP 版本信息在 http 头中的泄漏我们为了防止黑客获取服务器中 php 版本的信息,可以关闭该信息斜路在 http 头中:expose_php = Off比如黑客在 telnet www.chinaz.com 80 的时候,那么将无法看到 PHP 的信息。8) 关闭注册全局变量在 PHP 中提交的变量,包括使用 POST 或者 GET 提交的变量,都将自动注册为全局变量,能够直接访问,这是对服务器非常不安全的,所以我们不能让它注册为全局变量,就把注册全局变量选项关闭:register_globals = Off当然,如果这样设置了,那么获取对应变量的时候就要采用合理方式,比如获取 GET 提交的变量 var,那么就要用$_GET['var']来进行获取,这个 php 程序员要注意。9) 打开 magic_quotes_gpc 来防止 SQL 注入SQL 注入是非常危险的问题,小则网站后台被入侵,重则整个服务器沦陷,所以一定要小心。php.ini 中有一个设置:magic_quotes_gpc = Off这个默认是关闭的,如果它打开后将自动把用户提交对 sql 的查询进行转换,比如把 ' 转为 '等,这对防止 sql 注射有重大作用。所以我们推荐设置为:magic_quotes_gpc = On10) 错误信息控制一般 php 在没有连接到数据库或者其他情况下会有提示错误,一般错误信息中会包含 php 脚本当前的路径信息或者查询的 SQL 语句等信息,这类信息提供给黑客后,是不安全的,所以一般服务器建议禁止错误提示:display_errors = Off如果你却是是要显示错误信息,一定要设置显示错误的级别,比如只显示警告以上的信息:error_reporting = E_WARNING & E_ERROR当然,我还是建议关闭错误提示。11) 错误日志建议在关闭 display_errors 后能够把错误信息记录下来,便于查找服务器运行的原因:log_errors = On同时也要设置错误日志存放的目录,建议根 apache 的日志存在一起:error_log = /usr/local/apache2/logs/php_error.log*注意:给文件必须允许 apache 用户的和组具有写的权限。
互联网+时代,时刻要保持学习,携手千锋PHP,Dream It Possible。
更多PHP相关技术请搜索千锋PHP,做真实的自己,用良心做教育。