wget http://www.squid-cache.org/Versions/v3/3.2/squid-3.2.0.18.tar.gz
./configure --prefix=/usr/local/squid --enable-gnuregex --enable-async-io=80 --enable-cache-digests --enable-err-language="zh-cn" --enable-default-err-language="zh-cn" --enable-epoll --disable-internal-dns --with-filedescriptors=655360 --enable-kill-parent-hack --enable-esi --enable-ssl --with-large-files --enable-build-info='VeryCDN' --enable-follow-x-forwarded-for
make
make install
squid.conf
机器为6核.所以 workers 为6
也可以为每个squid 进程.绑定到某个CPU核上
设置方法见cpu_affinity_map参数
http://www.squid-cache.org/Doc/config/cpu_affinity_map/
acl ControlCentre src 114.80.226.0/24 112.65.227.0/24 127.0.0.0/24
http_port 80 accel vhost vport
max_filedescriptors 65535
cpu_affinity_map代替workers,能正常开启多进程,squid工作正常。我们的服务器是双CPU,12核24进程,下面是我们的参数:
1 |
cpu_affinity_map process_numbers=1,2,3,4,5,6,7,8,9,10,11,12 |
2 |
cores=1,3,5,7,9,11,13,15,17,19,21,23 |
这个参数的意思就是把squid进程和CPU核绑定。
1. 当前squid的状态和架构
Squid-3.3使用wokers 支持基本的多核,管理员可以通过配置启动一个squid来派生多个worker进程利用所有可利用的CPU。
一个worker 接收一个新的http request 并且处理每一个请求直到它完成。Worker之间可以共享http_ports 但是它们不会将一个请求事务传到其他worker间。一个worker支持的功能与单squid(不支持SMP的squid)完全相同可但是worker之间或许配置不同,如配置为监听不同的http_ports。参数cpu_affinity_map项允许CPU core绑定到每个worker。
2. Worker之间是如何协调的?
一个指定的协调进程会启动workers 和在它们需要时,协调他们的行为。以下是协调程序的主要职责:
重启工作异常的worker进程。
允许worker进程直接共享监听socket
广播reload和shutdow命令到其他worker
为Cahce Manager统计一些信息。
协调程序并不参与常规的事务处理,也决定不了哪worker来处理新进来的请求。
通常,这个协调程序都是空闲的。
3. Worker进程之间可以共享啥?
可以使用协调器和通用的配置文件,squid的worker进程们可以收到完全相同的配置信息和同步它们之间的特性。默认情况下,squid worker 可以共享的如下:
Squid可执行程序。
通用配置文件
监听的端口
Logs
内存缓存对象(支持大多数的环境)
磁盘缓存对象(仅限于Rock Store)
缓存管理统计等。
限定的配置和worker依赖的宏可以用来限制共享。例如,每个worker可以指定监听某一个http_port。
目前,squid 的worker和同步狭义的资源或服务,包括如下:
1)、内存缓存对象(在一些特定的环境下)
2)、磁盘缓存对象(除了Rock Store)
3)、DNS caches (ipcache 和 fqdncache)
4)、SNMP 统计—目前正有一个活跃的项目在推竞这项工作。
5)、Helper 进程和 守护进程。
6)、SSL session 缓存
缓存索引可以共享而无需另行拷贝。其他的信息共享通常是在RAM中进行,本质上是用拷贝和复制来进行,以避免加锁及其他的性能开销。
4. 为什么用进程?难道线程不是更好么?
以下几个原因决定了使用进程而不是线程:
1)、在当前squid的框架下使用线程会消耗更多的时间,缘于线程不安全。用户现在急需支持多核也无法等待彻底从新开始重现一个squd。
2)、线程提供了更快的上下文切换,但在一个典型的多核的squid部署环境中,squid的每个worker进程都绑定到了一个特定的cpu,上下文切换的开销并不是非常重要。
3)、进程和线程同步和共享机制对足以支持多处理器功能的扩展。
概括起来,我们使用进程代替线程的原因是:它让我们在有限的时间内实现了对多处理器的支持。此时使用线程不太现实。
5. 由谁决定worker 接受request?
所有的worker都共享http_port 监听同一个IP地址和同一个tcp port。操作系统会加锁保护这个监听的socket。并且决定哪个worker接受这个HTTP请求。一旦连接被这个worker接受,则这个连接就交给对应的这个worker
原文地址:http://wiki.squid-cache.org/Features/SmpScale
优化MySQL最重要的一部分工作是先确定”有问题”的查询语句。只有先找出这些查询较慢的sql查询(执行时间较长),我们才能进一步分析原因并且优化它。MySQL为我们提供了Slow Query Log记录功能,它能记录执行时间超过了特定时长的查询。分析Slow Query Log有助于帮我们找到”问题”查询。记录slow queries
首先,我们需要查看mysql server版本号,以及是否配置启用了slow query log。
#打开服务
log_slow_queries = ON
当log_slow_queries是ON时,才表示已经启用了记录slow query功能。默认是不记录slow query的。
启用slow query日志
#//将下列配置放到my.cnf中
[mysqld]
log-slow-queries = /var/lib/mysql/slow-queries.log
//新增加的参数
long_query_time = 3
log-queries-not-using-indexes
log-slow-admin-statements
上面的配置打开了slow query日志,将会捕获了执行时间超过了3秒的查询,包括执行速度较慢的管理命令(比如OPTIMEZE TABLE),并且记录了没有使用索引的查询。这些SQL,都会被记录到log-slow-queries指定的文件/var/lib/mysql/slow-queries.log文件中。
log-slow-queries <slow_query_log_file>
存放slow query日志的文件。你必须保证mysql server进程mysqld_safe进程用户对该文件有w权限。
long_query_time
如果query time超过了该值,则认为是较慢查询,并被记录下来。单位是秒,最小值是1,默认值是10秒。10秒对于大多数应用来讲,太长了。我们推荐从3秒开始, 依次减少,每次都找出最”昂贵”的10条SQL语句并且优化他们。日复一日,一步一步优化。一次性找出很多条SQL语句,对于优化来讲,意义并不大。
log-queries-not-using-indexes
MySQL会将没有使用索引的查询记录到slow query日志中。无论它执行有多快,查询语句没有使用索引,都会被记录。有的时候,有些没有使用引索的查询非常快(例如扫描很小的表),但也有可能导致服务器变慢,甚至还会使用大量的磁盘空间。
log-slow-admin-statements
一些管理指令,也会被记录。比如OPTIMEZE TABLE, ALTER TABLE等等。
日志文件
我们可以通过tail -f查看日志文件。
$tail -f /var/lib/mysql/slow-queries.log
# Time: 110107 16:22:11
# User@Host: root[root] @ localhost []
# Query_time: 9.869362 Lock_time: 0.000035 Rows_sent: 1 Rows_examined: 6261774
SET timestamp=1294388531;
select count(*) from ep_friends;
第一行,SQL查询执行的时间
第二行,执行SQL查询的连接信息
第三行记录了一些我们比较有用的信息
Query_time SQL执行的时间,越长则越慢
Lock_time 在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间
Rows_sent 查询返回的行数
Rows_examined 查询检查的行数
Slow Query日志,虽然帮助你记录了那些执行过了的SQL语句。但它不是万能的,意义可能没有你想象的那么大。它只告诉了你哪些语句慢,但是为什么慢?具体 原因,还是需要你自己去分析,不断的调试。也许,你只需要换一条更有效的sql语句,也许你只需简单地增加一个索引,但也有可能你需要调整你应用程序的设 计方案。比如,上面那条语句是很明显,它检查了600多万行数据。不幸的是,并不是每条语句都这么明显。也许还有别的原因,比如:
*锁表了,导致查询处于等态状态。lock_time显示了查询等待锁被翻译的时间
*数据或索引没有被缓存。常见于第一次启动服务器或者服务器没有调优
*备份数据库,I/O变慢
*也许同时运行了其它的查询,减少了当前查询
所以,不要过于紧张日志文件某条记录,而应该理性地审记,找出真正的原因。如果经常出现的slow query需要特别注意。如果个别出现,则做一些常规检查即可。我们建议,统计并且形成基准报告,进行比较排除,比胡乱瞎撞有用。希望大家不要在这部分过于浪费时间与精力。
线上记录slow query
上文的配置需要重启mysql server进程mysqld才会生效。但是很多时候,尤其是产品运营环境,不希望每次修改都需要重新启动mysql服务器,也希望能在某些特定时间记 录。MySQL5.1给我们提供了更为灵活的运行时控制,使得你不必重新启动mysql服务器,也能选择性地记录或者不记录某些slow queries。
MySQL5.1中,提供了全局变量slow_query_log、slow_query_log_file可以灵活地控制enable/disable慢查询。同时可以通过long_query_time设置时间
#//停用slow query记录
#注意:设置了slow_query_log全局变量, log_slow_queries也会隐性地跟着改变
mysql>set global slow_query_log=OFF
不幸运的是,在MySQL5.0并没有提供类似的全局变量来灵活控制,但是我们可以通过将long_query_time设置得足够大来避免记录某些查询语句。比如
mysql>set global long_query_time = 3600;
MySQL5.0, 不关服务的情况下,希望不记录日志的办法是将日志文件成为/dev/null的符号链接(symbolic link)。注意:你只需要在改变后运行FLUSH LOGS以确定MYSQL释放当前的日志文件描述符,重新把日志记录到/dev/null
和MySQL5.0不同,MySQL5.1可以在运行时改变日记行为,将日志记录到数据库表中。只要将mysql全局变量log_output设置为 TABLE即可。MySQL会将日志分别记录到表mysql.gengera_log和mysql.slow_log二张表中。但是,我们推荐将日志记录 在日记文件中。
mysql> show variables like ‘log_output’\G
Variable_name: log_output
Value: FILE
mysql>set global log_output=’table’;
缺陷与审记
虽然记录了slow query能够帮助你优化产品。但是MySQL目前版本,还有几大蹩足的地方。
1.MySQL5.0版本, long_query_time时间粒度不够细,最小值为1秒。对于高并发性能的网页脚本而言,1秒出现的意义不大。即出现1秒的查询比较少。直到mysql5.1.21才提供更细粒度的long_query_time设定.
2.不能将服务器执行的所有查询记录到慢速日志中。虽然MySQL普通日志记录了所有查询,但是它们是解析查询之前就记录下来了。这意味着普通日志没办法包含诸如执行时间,锁表时间,检查行数等信息。
3.如果开启了log_queries_not_using_indexes选项,slow query日志会充满过多的垃圾日志记录,这些快且高效的全表扫描查询(表小)会冲掉真正有用的slow queries记录。比如select * from category这样的查询也会被记录下来。
通过microslow-patch补丁可使用更细的时间粒度,和记录所有执行过的sql语句。不过,使用这个补订不得不自己编译MySQL,出于稳定性考滤,我们推荐在开发测试环境,可以打上这个补丁,享受这个补丁带来的便利。在运营环境尽量不要这么做…
MySQL自带了mysqldumpslow工具用来分析slow query日志,除此之外,还有一些好用的开源工具。比如MyProfi、mysql-log-filter,当然还有mysqlsla
在执行rndc reload abc.com的时候,系统返回错误:
rndc: ‘reload’ failed: not found
发生这个错误的原因在使用单独域名reload时,rndc命令不能对新添加的域名生效,只能对已经存在的域名有效果。
也就是说当在bind里面配置对新的域名解析时,需要通过rndc reload方式去读取全部conf文件。
在这之后就可以使用rndc reload abc.com进行单独域名的更新了。
同时提示,如果使用了view方式话,需要在rndc的时候指定下
rndc reload abc.com in view_name
1 、 BIOS
你应该总是在系统启动的时候设置一个BIOS 密码和禁用从CD-ROM 和软盘引导,这将可以防止一些人未经允许访问你的系统和更改BIOS 设置
2 、sshd 服务
SSH 是一个协议,利用它可以登录到一个远程系统或远程执行系统命令,默认允许root 登录,并且sshv1 存在缺陷,我们应该在sshd_config 禁止root 访问和使用sshv2 来让ssh 更加安全
#vi /etc/ssh/sshd_config
Protocol 2
PermitRootLogin = no
#sshd /etc/rc.d/init.d/sshd restart
3 、 禁用 telnet
早期的Linux 默认开启telnet 服务,telnet,ftp,rlogin 都是明文传输的协议是容易被嗅探到的,这就是为什么推荐使用安全的版本(sftp,scp,ssh )的原因,如果你必须要使用telnet ,那么至少应该隐藏banner 信息
#vi /etc/xinetd.d/telnet
disable=yes
4 、 禁用代码编译
你可以禁用代码编译并且只把编译的权限分配给一个用户组
# 该组的成员可以编译代码
/usr/sbin/groupadd compiler
# 把常见的编译器所属组赋给编译用户组
chgrp compiler /usr/bin/*cc*
chgrp compiler /usr/bin/*++*
chgrp compiler /usr/bin/ld
chgrp compiler /usr/bin/as
# 设置mysqlaccess 的 访问
chgrp root mysqlaccess
# 设置权限
chmod 750 /usr/bin/*cc*
chmod 750 /usr/bin/*++*
chmod 750 /usr/bin/ld
chmod 750 /usr/bin/as
chmod 755 /usr/bin/mysqlaccess
# 把用户添加到组里
vi /etc/group
compiler:x:520:user1,user2
5 、ProFTP
# 修改proftpd.conf 来禁止root 登陆
vi /etc/proftpd.conf
Add RootLogin off
/sbin/service proftpd restart
6 、TCP wrappers
编辑hosts.allow 和hosts.deny 可以限制或允许访问inet 服务
vi /etc/hosts.allow
#Approved IP addresses
ALL:192.168.0.1
ALL:192.168.5.2
#CSV uploader machine
proftpd:10.0.0 .5
#pop3 from antwhere
ipop3:ALL
vi /etc/hosts.deny
ALL:ALL EXCEPT localhostENY
7 、创建su 用户组
因为我们在SSH 禁止了root 用户访问并且禁用了telnet ,所有我们应该分配给一些用户su 权限来获取root 特权
vi /etc/group ,添加一行如下
wheel:x:10:root,user1,user2
chgrp wheel /bin/su
chmod o-rwx /bin/su
说明:或者直接使用pam 模块来做,再则也可以编译/etc/sudoers 来做
8 、root 通知
当一个具有root 权限的用户登录的时候发mail ,具体实施方法如下:
vi /root/.bashrc ,当有root 权限的用户登录时发生email 通知
echo ‘ALERT – Root Shell Access (Server Name) on:’ `date` `who` | mail -s “Alert: Root Access from `who | cut -d”(” -f2 | cut -d”)” -f1`” your@email.com
9 、history 安全
这是一个避免删除.bash_history 或重定向到/dev/null 的好主意,因此他不能清除或删除他最后执行的命令
chattr +a .bash_history
chattr +i .bash_history
获取用户的人会知道他的历史命令锁定并且要同意才可以使用服务
10 、使用欢迎信息
你必须提供一些信息让攻击者知道该系统不对公众开放,在国外有类似案件,攻击者入侵一个系统并且系统没有这些信息,这种情况下法院不能做任何裁决,因为系统说welcome
1 )删除/etc/redhat-release
2 )编辑/etc/issue 与/etc/motd 并显示警告信息
11 、禁用所有特殊账户
# 你应该从系统中删除所有默认用户和组
例如news,lp,sync,shutdown,uucp,games,halt 等
userdel name
groupdel name
# 锁定特定账户
/usr/sbin/usermod -L -s /bin/false user
12 、chmod 危险文件
这可能是限制不具有root 权限的用户执行下面这些命令的好主意
chmod 700 /bin/ping
chmod 700 /usr/bin/finger
chmod 700 /usr/bin/who
chmod 700 /usr/bin/w
chmod 700 /usr/bin/locate
chmod 700 /usr/bin/whereis
chmod 700 /sbin/ifconfig
chmod 700 /usr/bin/pico
chmod 700 /usr/bin/vi
chmod 700 /usr/bin/which
chmod 700 /usr/bin/gcc
chmod 700 /usr/bin/make
chmod 700 /bin/rpm
13 、指定允许root 登陆的TTY 设备
因为/etc/securetty 文件允许你指定root 可以从哪个TTY 设备登录
vi /etc/securetty ,然后只留2 个连接
tty1
tty2
14 、选择一个安全的密码
在/etc/login.defs 文件中定义了shadow 密码的具体配置,默认密码长度最短为5 字符,你应该至少设置为8
vi /etc/login.defs
PASS_MIN_LEN 8
15 、检测Rootkit
用chkrootkit 或rkhunter ,以chkrootkit 为例
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.md5
md5sum chkrootkit.tar.gz # 首先检查md5 校验值
tar -zxvf chkrootkit.tar.gz
cd chkrootkit
./configure && make sense
然后运行./chkrootkit
我们可以将其添加到contrab 使其每天自动扫描:
vi /etc/cron.daily/chkrootkit.sh
#!/bin/bash
# 输入chkrootkit 的安装目录
cd /root/chkrootkit/
# 输入你想收到检测报告的email
./chkrootkit | mail -s “Daily chkrootkit from Server Name” your@email.com
16 、安装补丁
你要经常检查更新以修复某些缺陷或系统稳定性的改进,否则你存在漏洞的系统将会不时的遭受新的攻击
# 列出可用更新
up2date -l
# 安装未排除的更新
up2date -u
# 安装包括排除的更
up2date -uf
17 、隐藏Apache 信息
你应该隐藏Apache 的banner 信息使攻击者不知道Apache 的版本,从而使他们难以利用漏洞
vi /etc/httpd/conf/httpd.conf
# 改变服务器签名
ServerSignature Off
service httpd restart
18 、隐藏php 信息
你应该隐藏php 的banner 信息,原因同上
vi php.ini
expose_php=Off
service apache restart
19 、关闭不用的服务
你应该把任何未使用的服务关闭,可以在/etc/xinetd.d 文件夹里找到
cd /etc/xinetd.d
grep disable * | column -t
这将显示所有服务开启或关闭的状态,然后根据需要来开启或关闭服务
20 、检测监听的端口
检测是否有必要开放端口是非常重要的
netstat -tulp 或 lsof -i -n | egrep ‘COMMAND|LISTEN|UDP’ 或 nmap !
21 、关闭端口和服务
重点是关闭在系统启动时打开的不需要的端口,方法如下:
# 对于正在运行的服务,可以执行
chkconfig -list | grep on
# 禁用服务可以执行
chkconfig servicename off
# 然后停止正在运行的服务
/etc/init.d/service stop
22 、删除不用的rpm 包
首先应该清楚你的系统的作用,它是web,mail,file 服务器或其他,然后觉得哪些包是必要的,之后删除不需要的软件包,方法如下:
# 首先列出安装列表
rpm -qa
# 更详细的信息
rpm -qi rpmname
# 还可以检测删除包可能出现的冲突
rpm -e --test rpmname
23 、禁用危险的php 函数
你应该禁用php 的危险函数防止在网站上执行系统命令whereis php.ini
vi /usr/local/lib/php.ini
disable_functions = “symlink,shell_exec,exec,proc_close,proc_open,popen,
system,dl,passthru,escapeshellarg, escapeshellcmd”
24 、安装配置防火墙
高级策略防火墙(APF )是一种IP 表(网络过滤),它是基于当今互联网部署服务器防火墙系统的基本需要和客户部署LINUX 安装的唯一需要而设计的。 它是最好的开源防火墙之一
1 )配置APF 防火墙方法:
wget http://www.r-fx.ca/downloads/apf-current.tar.gz
tar -zxvf apf-current.tar.gz
cd apf-0.9.7 -1
./install.sh
2 )vi /etc/apf/conf.apf ,一般配置如下
启用防火墙使用DShield.org 块列表
USE_DS=”1″
然后我将列出常规的配置和CPanel 配置方式,因为CPanel 是应该最广泛的虚拟主机管理软件
(1 )常规配置(DNS,Mail,Web,FTP)
Common ingress (inbound)
# Common ingress (inbound) TCP ports -3000_3500 = passive port range for Pure FTPD IG_TCP_CPORTS=”21,22,25,53,80,110,143,443,995″
# Common ingress (inbound) UDP ports IG_UDP_CPORTS=”53″
# Egress filtering [0 = Disabled / 1 = Enabled]
EGF=”1″
# Common egress (outbound) TCP ports
EG_TCP_CPORTS=”21,25,80,443,43″
# Common egress (outbound) UDP ports
EG_UDP_CPORTS=”20,21,53″
(2 )CPanel 配置
Common ingress (inbound) ports
# Common ingress (inbound) TCP ports -3000_3500 = passive port range for Pure FTPD IG_TCP_CPORTS=”21,22,25,53,80,110,143,443,2082,2083, 2086,2087,2095, 2096,3000_3500″
# Common ingress (inbound) UDP ports
IG_UDP_CPORTS=”53″
Common egress (outbound) ports
# Egress filtering [0 = Disabled / 1 = Enabled]
EGF=”1″
# Common egress (outbound) TCP ports
EG_TCP_CPORTS=”21,25,80,443,43,2089″
# Common egress (outbound) UDP ports
EG_UDP_CPORTS=”20,21,53″
之后启动防火墙:/etc/apf/apf -s ,如果运行良好我在回去修改配置文件,使DEVM=”0″
(3 )配置APF 的AntiDos
vi /etc/apf/ad/conf.antidos ,找到下面的内容并替换成你的资料
# Organization name to display on outgoing alert emails
CONAME=”Your Company”
# Send out user defined attack alerts [0=off,1=on]
USR_ALERT=”0″
# User for alerts to be mailed to
USR=you@yourco.com
你应把USR_ALERT 改为1
保存后重启APF :/etc/apf/apf –r
To make the firewall start with the Operating System: chkconfig –level 2345 apf on
APF 开机自启动:chkconfig –level 2345 apf on
禁止一个IP 用/etc/apf/apf -d ip 或vi /etc/apf/deny_hosts.rules
允许一个IP 用/etc/apf/apf -a ip 或vi /etc/apf/deny_hosts.rules
25 、安装配置BFD (暴力破解检测)
BFD 是一个用于分析应用日志和检测验证失败的模块化shell 脚本,而且安装配置和用法都是非常容易的。使用BFD 的原因很简单,其实在LINUX 领域几乎没有结合防火墙或实时设备来监控不验证和暴力攻击审计的程序。在用BFD 之前你必须安装APF 防火墙
wget http://www.r-fx.ca/downloads/bfd-current.tar.gz
tar -zxvf bfd-current.tar.gz
cd bfd-0.9
vi /usr/local/bfd/conf.bfd
# 把以下内容改为你的资料
# Enable/disable user alerts [0 = off; 1 = on]
ALERT_USR=”1″
# User alert email address
EMAIL_USR=”your@mail.com”
# User alert email; subject
SUBJ_USR=”Brute Force Warning for $HOSTNAME”
vi /usr/local/bfd/ignore.hosts ,然后把你的IP 设置成允许主机,避免意外的锁定自己
# 重启BFD
/usr/local/sbin/bfd -s
26 、内核加固(sysctl.conf )
sysctl.conf 用来加固内核,目的是避免DOS 和欺骗攻击,具体的方法如下:
# 了解下当前配置的大概情况
sysctl -a
vi /etc/sysctl.conf
添加如下内容:
# Kernel sysctl configuration file for Red Hat Linux
# For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.
# Controls IP packet forwarding
net.ipv4.ip_forward = 0
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
# 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
#Prevent SYN attack
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
# Disables packet forwarding
net.ipv4.ip_forward=0
# Disables IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Enable IP spoofing protection, turn on source route verification
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# Enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.lo.log_martians = 1
net.ipv4.conf.eth0.log_martians = 1
# Disables IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Enable IP spoofing protection, turn on source route verification
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# Disables the magic-sysrq key
kernel.sysrq = 0
# Modify system limits for Ensim WEBppliance
fs.file-max = 65000
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 15
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# Turn off the tcp_window_scaling
net.ipv4.tcp_window_scaling = 0
# Turn off the tcp_sack
net.ipv4.tcp_sack = 0
# Turn off the tcp_timestamps
net.ipv4.tcp_timestamps = 0
# 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
# Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1
# Set maximum amount of memory allocated to shm to 256MB
kernel.shmmax = 268435456
# Improve file system performance
vm.bdflush = 100 1200 128 512 15 5000 500 1884 2
# Improve virtual memory performance
vm.buffermem = 90 10 60
# Increases the size of the socket queue (effectively, q0).
net.ipv4.tcp_max_syn_backlog = 1024
# Increase the maximum total TCP buffer-space allocatable
net.ipv4.tcp_mem = 57344 57344 65536
# Increase the maximum TCP write-buffer-space allocatable
net.ipv4.tcp_wmem = 32768 65536 524288
# Increase the maximum TCP read-buffer space allocatable
net.ipv4.tcp_rmem = 98304 196608 1572864
# Increase the maximum and default receive socket buffer size
net.core.rmem_max = 524280
net.core.rmem_default = 524280
# Increase the maximum and default send socket buffer size
net.core.wmem_max = 524280
net.core.wmem_default = 524280
# Increase the tcp-time-wait buckets pool size
net.ipv4.tcp_max_tw_buckets = 1440000
# Allowed local port range
net.ipv4.ip_local_port_range = 16384 65536
# Increase the maximum memory used to reassemble IP fragments
net.ipv4.ipfrag_high_thresh = 512000
net.ipv4.ipfrag_low_thresh = 446464
# Increase the maximum amount of option memory buffers
net.core.optmem_max = 57344
# Increase the maximum number of skb-heads to be cached
net.core.hot_list_length = 1024
## DO NOT REMOVE THE FOLLOWING LINE!
## nsobuild:20051206
# 重启后生效
/sbin/sysctl -p
sysctl -w net.ipv4.route.flush=1
27 、更改SSH 端口
更改SSH 默认端口号在一定程度上可以提高安全性
vi /etc/ssh/sshd_config
Port 22 改为其他端口
当然不要忘记把更改的端口加进防火墙,然后重启生效:/etc/init.d/ssh restart ,如果安装了APF 并把端口添加之后,还要重启APF:/etc/init.d/apf restart
28 、/tmp,/var/tmp,/dev/shm 分区的安全
/tmp,/var/tmp,/dev/shm 目录是不安全的,任何用户都可以执行脚本,最好的解决办法是挂载nocexec 和nosuid 选项的参数( 注意:不建议在CPanel 使用)
1 )/tmp 目录
cd /dev
# 创建 100M (“count”) 的存储文件:
dd if=/dev/zero of=tmpMnt bs=1024 count=100000
# 设为一个扩展的文件系统
/sbin/mke2fs /dev/tmpMnt (“…is not a block special device. continue?” 回答yes)
# 备份现有临时文件
cp -R /tmp/ /tmp_backup
# 用noexec 挂载新文件系统:
mount -o loop,rw,nosuid,noexec /dev/tmpMnt /tmp
chmod 0777 /tmp
# 把备份的文件拷贝回去
cp -R /tmp_backup/* /tmp/
# 删除备份
rm -rf /tmp_backup
# 修改/etc/fstab 添加下面的条目使其在引导时仍然有效
/dev/tmpMnt /tmp ext2 loop,rw,nosuid,noexec 0 0
2 )/var/tmp 目录
mv /var/tmp /var/tmpbak
ln -s /tmp /var/tmp
cp /var/tmpbak/* /tmp/
3 )/dev/shm 目录
vi /etc/fstab
"none /dev/shm tmpfs defaults,rw 0 0" 改为 "none /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0"
SSH/SCP无密码操作
A,B机
A上执行
ssh-keygen -t rsa
会生成文件
/root/.ssh/id_rsa.pub
把这文件上复制到B机上的.ssh目录下
文件名为
authorized_keys
权限为700
然后A机上执行SSH/SCP到B机上,就不需要密码了
rsync -e "ssh -p port" -avzp sdir user@ip:ddir
rsync -e "ssh" -az --delete sidr user@ip:ddir