一、调整TCP的滑动窗口

大多数 Linux 发布版都定义了适当的缓冲区和其他 Transmission Control Protocol(TCP)参数。可以修改这些参数来分配更多的内存,从而改进网络性能。设置内核参数的方法是通过 proc 接口,也就是通过读写 /proc 中的值。幸运的是,sysctl 可以读取 /etc/sysctl.conf 中的值并根据需要填充/proc,这样就能够更轻松地管理这些参数。下面展示在互联网服务器上应用于 Internet 服务器的一些网络设置。 

# Use TCP syncookies when needed
net.ipv4.tcp_syncookies = 1
# Enable TCP window scaling
net.ipv4.tcp_window_scaling: = 1
# Increase TCP max buffer size
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# Increase Linux autotuning TCP buffer limits
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# Increase number of ports available
net.ipv4.ip_local_port_range = 1024 65000

将这些设置添加到 /etc/sysctl.conf 的现有内容中。

第一个设置启用 TCP SYN cookie。当从客户机发来新的 TCP 连接时,数据包设置了SYN 位,服务器就为这个半开的连接创建一个条目,并用一个 SYN-ACK 数据包进行响应。在正常操作中,远程客户机用一个 ACK 数据包进行响应,这会使半开的连接转换为全开的。

有一种称为 SYN 泛滥(SYN flood) 的网络***,它使 ACK 数据包无法返回,导致服务器用光内存空间,无法处理到来的连接。SYN cookie 特性可以识别出这种情况,并使用一种优雅的方法保留队列中的空间。大多数系统都默认启用这个特性,但是确保配置这个特性更可靠。
启用 TCP 窗口伸缩使客户机能够以更高的速度下载数据。TCP 允许在未从远程端收到确认的情况下发送多个数据包,默认设置是最多 64 KB,在与延迟比较大的远程客户机进行通信时这个设置可能不够。窗口伸缩会在头中启用更多的位,从而增加窗口大小。
后面四个配置项增加 TCP 发送和接收缓冲区。这使应用程序可以更快地丢掉它的数据,从而为另一个请求服务。还可以强化远程客户机在服务器繁忙时发送数据的能力。
最后一个配置项增加可用的本地端口数量,这样就增加了可以同时服务的最大连接数量。
在下一次引导系统时,或者下一次运行 sysctl -p时,设置就会生效。

----------------------------------------------------------------------------------------

二、文件子系统的调优
ulimit -a 用来显示当前的各种用户进程限制。
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,
设置各linux 用户的最大进程数,下面我把某linux用户的最大进程数设为10000个:
ulimit -u 10000
对于需要做许多 socket 连接并使它们处于打开状态的 Java 应用程序而言,
最好通过使用 ulimit -n xx 修改每个进程可打开的文件数,缺省值是 1024。
ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024
其他建议设置成无限制(unlimited)的一些重要设置是:
数据段长度:ulimit -d unlimited
最大内存大小:ulimit -m unlimited
堆栈大小:ulimit -s unlimited
CPU 时间:ulimit -t unlimited
虚拟内存:ulimit -v unlimited

暂时地,适用于通过 ulimit 命令登录 shell 会话期间。
永久地,通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件中, 即特定于 shell 的用户资源文件,如:
1)、解除 Linux 系统的最大进程数和最大文件打开数限制:
vi /etc/security/limits.conf
# 添加如下的行
* soft noproc 11000
* hard noproc 11000
* soft nofile 4100
* hard nofile 4100
说明:* 代表针对所有用户
noproc 是代表最大进程数
nofile 是代表最大文件打开数
2)、让 SSH 接受 Login 程式的登入,方便在 ssh 客户端查看 ulimit -a 资源限制:
a、vi /etc/ssh/sshd_config
把 UserLogin 的值改为 yes,并把 # 注释去掉
b、重启 sshd 服务:
/etc/init.d/sshd restart
3)、修改所有 linux 用户的环境变量文件:
vi /etc/profile
ulimit -u 10000
ulimit -n 4096
ulimit -d unlimited
ulimit -m unlimited
ulimit -s unlimited
ulimit -t unlimited
ulimit -v unlimited
**************************************
有时候在程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了。
修改2个文件。
1./etc/security/limits.conf
vi /etc/security/limits.conf
加上:
* soft nofile 8192
* hard nofile 20480
2./etc/pam.d/login
session required /lib/security/pam_limits.so
**********
另外确保/etc/pam.d/system-auth文件有下面内容 session required /lib/security/$ISA/pam_limits.so 这一行确保系统会执行这个限制。
***********
3.一般用户的.bash_profile
#ulimit -n 1024功能检测到这些连接,缺省情况下,在2小时之后丢掉. 2个小时的可能导致内存过度使用,降低性能。因此改成1800秒(30分钟)是个更好的选择:sysctl -w net.ipv4.tcp_keepalive_time=1800

--------------------------------------------------------------------------------------

三、网络安全设置:
TCP SYN Flood ***
TCP SYN Flood是一种常见,而且有效的远端(远程)拒绝服务(Denial of Service)***方式,它透过一定的操作破坏TCP三次握手建立正常连接,占用并耗费系统资源,使得提供TCP服务的主机系统无法正常工作。由於TCP SYN Flood是透过网路底层对服务器Server进行***的,它可以在任意改变自己的网路IP地址的同时,不被网路上的其他设备所识别,这样就给防范网路犯罪部门追查犯罪来源造成很大的困难。
系统检查
一般情况下,可以一些简单步骤进行检查,来判断系统是否正在遭受TCP SYN Flood***。
1.服务端无法提供正常的TCP服务。连接请求被拒绝或超时。
2.透过 netstat -an 命令检查系统,发现有大量的SYN_RECV连接状态。
3.iptables的设置,引用自CU
防止同步包洪水(Sync Flood)
# iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
也有人写作
#iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT --limit 1/s #限制syn并发数每秒1次,可以根据自己的需要修改
防止各种端口扫描
# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
Ping洪水***(Ping of Death)
# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
----------------------------------------------------------------------------------------------------------------------------
暂定步骤:
修改/etc/profile文件,加入:

       ulimit -u 10240
    ulimit -n 4096
    ulimit -d unlimited
    ulimit -m unlimited
    ulimit -s unlimited
    ulimit -t unlimited
    ulimit -v unlimited

修改/etc/rc.d/rc.local,加入:

       echo ‘131072′ > /proc/sys/fs/file-max
    echo ‘131072′ > /proc/sys/fs/inode-max

(1G内存值修改成:65535 2G内存值修改成:131072 4G内存值修改成:262144)
修改/etc/sysctl.conf文件,加入:

       net.core.rmem_default = 8388608
    net.core.rmem_max = 8388608
    net.core.wmem_default = 8388608
    net.core.wmem_max = 8388608
    net.ipv4.tcp_timestamps = 0
    net.ipv4.tcp_sack =1
    net.ipv4.tcp_window_scaling = 1
    net.core.netdev_max_backlog=3000
    #Modify i-node
    sys.fs.file-max= 65535
    sys.fs.inode-max= 65535
    #Set System Memory
    vm.bdflush="30 500 0 0 500 3000 60 20 0"
    vm.kswapd="1024 32 64"
    #Disable HackAttack!
    net.ipv4.conf.eth0.accept_source_route=0
    net.ipv4.conf.lo.accept_source_route=0
    net.ipv4.conf.default.accept_source_route=0
    net.ipv4.conf.all.accept_source_route=0
    net.ipv4.conf.lo.accept_redirects=0
    net.ipv4.conf.all.accept_redirects=0
    net.ipv4.conf.eth0.accept_redirects=0
    net.ipv4.conf.default.accept_redirects=0
    net.ipv4.conf.lo.secure_redirects=0
    net.ipv4.conf.all.secure_redirects=0
    net.ipv4.conf.eth0.secure_redirects=0
    net.ipv4.conf.default.secure_redirects=0
    net.ipv4.conf.eth0.send_redirects=0
    net.ipv4.conf.lo.send_redirects=0
    net.ipv4.conf.default.send_redirects=0
    net.ipv4.conf.all.send_redirects=0
    net.ipv4.tcp_syncookies=1
    net.ipv4.icmp_echo_ignore_broadcasts=1
    net.ipv4.icmp_ignore_bogus_error_responses=1
    #Web Servers
    net.ipv4.tcp_tw_reuse=1
    net.ipv4.tcp_tw_recycle=1
    net.ipv4.tcp_fin_timeout=30
    net.ipv4.tcp_keepalive_time=1800
    net.ipv4.core.wmem_max=16777216
    net.ipv4.core.rmem_max=16777216
    net.ipv4.tcp_rmem="4096 87380 8388608"
    net.ipv4.tcp.wmem="4096 87380 8388608"
    net.ipv4.tcp_max_syn_backlog=8192

防火墙安全:

iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

也有人写作
   

iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT --limit 1/s

限制syn并发数每秒1次,可以根据自己的需要修改
防止各种端口扫描

iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

Ping洪水***(Ping of Death)  

iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

备注说明:(相对比较激进的网络参数调整)

       # Use TCP syncookies when needed
    net.ipv4.tcp_syncookies = 1
    # Enable TCP window scaling
    net.ipv4.tcp_window_scaling: = 1
    # Increase TCP max buffer size
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    # Increase Linux autotuning TCP buffer limits
    net.ipv4.tcp_rmem = 4096 87380 8388608
    net.ipv4.tcp_wmem = 4096 65536 8388608
    # Increase number of ports available
    net.ipv4.ip_local_port_range = 1024 65000

----------------------------------------------------------------------------------------------------------------------------
四、LINUX安全设置步骤:
1.删除所有那些不能在你系统上使用的默认用户和组账户: lp,sync,shutdown,halt, news, uucp, operator, games, gopher ROOT自动从shell注销
编辑你的配置文件”vi /etc/profile”,在某个地方加入如下行,

“HISTFILESIZE=”TMOUT=3600
我们为变量”TMOUT=”输入的这个值使用秒表示的、代表一个小时(60*60=3600秒)。如果你将此行加入你的“/etc/profile” 文件,那么在一小时的非活动状态之后将要系统里的所有用户自动注销。你可以在用户私人的”。bashrc”文件里面设置这个变量,可以在一个确定的时间以后自动注销他们。
2.禁止并且卸载所有没有用的服务
你必须禁止别切卸载所有你不用的的服务,那样的话,你就能少担心一些。看看你的”/etc/inetd.conf”文件, 用注释的方法禁用(在一行的开始加个#),然后给inetd进程发送一个SIGHUP命令去更新到当前的”inetd.conf”文件。这样做:
第一步把”/etc/inetd.conf”更改许可权限成600,那样的话,就只有root可以读和写。[Root@kapil /]# chmod 600 /etc/inetd.conf
第二步确保”/etc/inetd.conf”的所有者是root。
第三步编辑inetd.conf文件(vi /etc/inetd.conf),并且禁止一些服务,就像:ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth等等,除非你打算用它。关闭这些服务就降低一些风险。
第四步给你的inetd进程发送一个HUP信号[root@kapil /]# killall -HUP inetd
第五步设置”/etc/inetd.conf”文件为不可更改,使用 chattr 命令,这样的话,没人能修改那个文件。*简单的设置文件为不可更改,执行如下命令:
[root@kapil /]# chattr +i /etc/inetd.conf
这将防止对”inetd.conf”文件的任何更改(意外的更改或者其他更改)。只有超级用户root能设置或者清除这个文件属性。修改inetd.conf *简单的取消不可更改的设置,执行如下命令:
[root@kapil /]# chattr -i /etc/inetd.conf
3.免疫”/etc/services”文件
你必须免疫 “/etc/services” 文件,防止未经授权的删除、增加服务。
免疫 “/etc/services” 文件,使用命令:
[root@kapil /]# chattr +i /etc/services
禁止Control-Alt-Deletc键盘关机命令
在你的”/etc/inittab”文件里面注释掉如下的行(用一个”#”)。这样做,编辑inittab文件(vi /etc/inittab),更换:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
读入:#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
现在,按照如下提示输入,让更改生效:
[root@kapil /]# /sbin/init q 为脚本文件整理”/etc/rc.d/init.d”下的权限整理脚本文件的许可权限,可靠的开始和结束所有你需要在引导时运行的常态进程,这样做:
[root@kapil/]# chmod -R 700 /etc/rc.d/init.d/*
这意味着只有root可以被允许读,写,和执行目录里面的脚本文件。

4.隐藏你的系统信息
默认状态下,当你登录到linux机器时,他告诉你Linux分布商的名字,版本,核心版本和服务器名字。这对一个骇客来说从你的服务器得到这些信息足够了以必须立刻用一个”Login:”提示符提示用户。
第一步
这样做,编辑”/etc/rc.d/rc.local”文件,放置”#”在如下行的前面。

# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo “” >; /etc/issue
#echo “$R” >;>; /etc/issue
#echo “Kernel $(uname -r) on $a $(uname -m)” >;>; /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >;>; /etc/issue

第二步
然后,删除如下文件:在”/etc/”目录下的”issue.net” 和 “issue”:
[root@kapil /]# rm -f /etc/issue
[root@kapil /]# rm -f /etc/issue.net
5.禁止未用的 SUID/SGID 程序
一个常规用户如果设置为SUID root,将能够作为root运行程序。一个系统管理员必须最小化使用这些 SUID/GUID程序, 而且禁止那些不需要的程序。
从root拥有的程序里发现所有有`s’ 位的程序,用此命令:
[root@kapil]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls -lg {} \;
* 在被选中的程序上禁止suid 位,键入如下命令:
[root@kapil /]# chmod a-s [program]
6.关闭ipv6
vi /etc/modprobe.conf,在文件中添加以下两行
alias net-pf-10 off
alias ipv6 off