Chinaunix首页 | 论坛 | 博客
  • 博客访问: 667704
  • 博文数量: 87
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2022
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-23 11:16
个人简介

西邮大三狗!!!

文章分类

全部博文(87)

文章存档

2015年(47)

2014年(40)

分类: 架构设计与优化

2014-11-05 20:51:27

对内核参数,我们作如下调整:
vi /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.ip_local_port_range = 1024 65535
sysctl -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, highlow:当 TCP 使用了低于该值的内存页面数时,
TCP 没有内存压力,TCP 不会考虑释放内存。(理
想情况下,这个值应与指定给 tcp_wmem 的第 2 个值相匹配。这第 2 个值表明,
最大页面大小乘以最大
并发请求数除以页大小 (131072*300/4096)  pressure:当 TCP 使用了超过该值的内存页面数量时,
TCP 试图稳定其内存使用,进入 pressure
模式,当内存消耗低于 low 值时则退出 pressure 状态。(理想情况下这个值应该是 TCP
可以使用的总缓
冲区大小的最大值(204800*300/4096)high:允许所有 TCP Sockets 用于排队缓冲数据报的页面量。如果超过这个值,
TCP 连接将被拒绝,
这就是为什么不要令其过于保守(512000*300/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 = on
2) 用户组安全
当 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/local/nginx/html
4) 安全模式下包含文件
如果要在安全模式下包含某些公共文件,那么就修改一下选项:
safe_mode_include_dir = /usr/local/nginx/html/include
其实一般 php 脚本中包含文件都是在程序自己已经写好了,这个可以根据具体需要设置。
5) 控制 php 脚本能访问的目录使用 open_basedir 选项能够控制 PHP 脚本只能访问指定的目录,这样能够避免 PHP 脚本访问
不应该访问的文件,一定程度上限制了 phpshell 的危害,我们一般可以设置为只能访问网站目录:
open_basedir = /usr/local/nginx/html
6) 关闭危险函数
如果打开了安全模式,那么函数禁止是可以不需要的,但是我们为了安全还是考虑进去。比如,我们觉得不希望执行包括 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 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 = On
10) 错误信息控制
一般 php 在没有连接到数据库或者其他情况下会有提示错误,一般错误信息中会包含 php 脚本当前的路径信息或者查
询的 SQL 语句等信息,这类信息提供给黑客后,是不安全的,所以一般服务器建

议禁止错误提示:
display_errors = Off
如果你却是是要显示错误信息,一定要设置显示错误的级别,比如只显示警告以上的信息:
error_reporting = E_WARNING & E_ERROR
当然,我还是建议关闭错误提示。
11) 错误日志
建议在关闭 display_errors 后能够把错误信息记录下来,便于查找服务器运行的原因:
log_errors = On
同时也要设置错误日志存放的目录,建议根 apache 的日志存在一起:
error_log = /var/log/php_error.log
注意:给文件必须允许 apache 用户的和组具有写的权限。

折腾这么久了,我们最后做个压力测试吧=。=
使用的是webbench这个工具
wget ~cz210552/distfiles/webbench-1.5.tar.gz
tar zxvf webbench-1.5.tar.gz
cd webbench-1.5
make && make install
下面是我的测试结果:

webbench -c 并发数 -t 运行测试时间 URL


阅读(4156) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~