1.修改ip
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 #网卡名字
BOOTPROTO=static #静态IP地址获取状态 如:DHCP表示自动获取IP地址
IPADDR=192.168.1.113 #IP地址
NETMASK=255.255.255.0 #子网掩码
ONBOOT=yes#引导时是否激活
GATEWAY=192.168.1.1
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.1.113
NETMASK=255.255.255.0
ONBOOT=yes
GATEWAY=192.168.1.1
[root@localhost ~]# vi /etc/sysconfig/network
HOSTNAME=c64 #修改主机名,重启生效
GATEWAY=192.168.1.1 #修改默认网关,如果上面eth0里面不配置网关的话,默认就使用这里的网关了。
[root@localhost ~]# cat /etc/sysconfig/network
HOSTNAME=c64
GATEWAY=192.168.1.1
2.修改DNS
[root@localhost ~]# vi /etc/resolv.conf #修改DNS信息
nameserver 114.114.114.114
nameserver 8.8.8.8
[root@localhost ~]# cat /etc/resolv.conf #查看修改后的DNS信息
nameserver 114.114.114.114
nameserver 8.8.8.8
[root@localhost ~]# service network restart #重启网卡,生效
重启网卡,也可以用下面的命令
[root@localhost ~]# /etc/init.d/network restart
3.修改主机名
[root@localhost ~]# hostnamectl set-hsotname ip-where-work
4.Centos7-重建yum源
#!/bin/bash
cat > Base.repo.sh << "EOF"
yum -y install wget
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
EOF
echo "重建yum源脚本写入成功"
echo "脚本执行中"
sh Base.repo.sh
5.关闭Selinux防火墙
默认云服务器都是关着的
sed -i "s/=enforcing/=disabled/g" /etc/selinux/config
6.修改防火墙iptables
CentOS切换为iptables防火墙
firewall-cmd --state 查看防火墙状态
切换到iptables首先应该关掉默认的firewalld,然后安装iptables服务。
1.关闭firewall:
systemctl stop firewalld.service
systemctl disable firewalld.service #禁止firewall开机启动
2.安装iptables防火墙:
vi /etc/sysconfig/iptables #编辑防火墙配置文件
systemctl start iptables.service #开启
systemctl enable iptables.service #设置防火墙开机启动
配置文件
#!/bin/bash
cat > fwiptables.sh << "EOF"
#!/bin/bash
#fwiptables
IPT=`which iptables`
$IPT -F
$IPT -X
$IPT -P INPUT DROP
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -N syn-flood
##本地回环 内网允许任何
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -m state --state NEW -s 10.0.0.0/8 -j ACCEPT
# ssh 端口开放
$IPT -A INPUT -m state --state NEW -p tcp --dport 23333 -m comment --comment "ssh 端口" -j ACCEPT
# 根据需求填写相应的端口
$IPT -A INPUT -p tcp -m multiport --dports 80,443 -m comment --comment "网页ssl端口 " -j ACCEPT
# zabbix监控地址
$IPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 10050 -m comment --comment "zabbix监控" -j ACCEPT
# 58138
#$IPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 58138 -m comment --comment "自定义业务端口" -j ACCEPT
# mysql 端口
$IPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -m comment --comment "mysql 端口" -j ACCEPT
# mongod 端口
$IPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 27017 -m comment --comment "mongod 端口" -j ACCEPT
# redis 端口
$IPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -m comment --comment "redis 端口" -j ACCEPT
# 局域网 访问
#$IPT -A INPUT -p tcp -s 192.168.1.0/24 -m comment --comment "局域网" -j ACCEPT
# 公网 访问
$IPT -A INPUT -p tcp -s 111.111.111.0/24 -m comment --comment "公网" -j ACCEPT
#$IPT -A INPUT -p tcp -s 321.321.321.0/24 -m comment --comment "公网2" -j ACCEPT
#$IPT -A INPUT -p tcp -s 123.123.123.0/24 -m comment --comment "公网3" -j ACCEPT
# 以下规则是屏蔽以 youtube.com 为主的所有一级 二级 三级等域名。
#iptables -A OUTPUT -m string --string "youtube.com" --algo bm --to 65535 -j DROP
#$IPT -A OUTPUT -m string --string "6x66.com" --algo bm --to 65535 -j DROP
#$IPT -A OUTPUT -m string --string "2s11.com" --algo bm --to 65535 -j DROP
#$IPT -A OUTPUT -m string --string "aresboot.com" --algo bm --to 65535 -j DROP
# 添加屏蔽规则
#iptables -D OUTPUT -m string --string "youtube.com" --algo bm --to 65535 -j DROP
# 删除屏蔽规则,上面添加的代码是什么样,那么删除的代码就是把 -A 改成 -D
# ICMP 规则控制
$IPT -A INPUT -p icmp -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
$IPT -A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
# DOS防护
$IPT -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood
$IPT -A INPUT -j REJECT --reject-with icmp-host-prohibited
$IPT -A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN
$IPT -A syn-flood -j REJECT --reject-with icmp-port-unreachable
$IPT -L
service iptables save
EOF
echo "fwiptables脚本写入成功"
echo "脚本执行中"
chmod +x fwiptables.sh && cp fwiptables.sh /root/ && sh /root/fwiptables.sh
7.权限密钥
1.服务器上产生公钥
2.客户端带着私钥访问服务器
3.服务器上公钥返回给客户端,并且用自己的公钥和客户端发来的私钥生成key pair
4.客户端再次带着自己的私钥和服务器发来的公钥生成key pair访问服务器
5.服务器用自己的key pair和客户端的key pair进行比对,建立链接
注意:
在第一次链接的时候,会在本地生成密钥文件/.ssh/known_hosts(可以存放多个)
1.客户端 ssh-keygen -t dsa
生成2个文件,id_dsa(私钥),id_dsa_pub(公钥)
2.客户端 发送公钥到服务器端
3.客户端 带着公钥发送链接请求
4.验证公钥
5.服务器 用公钥加密质询,发送至客户端
6.客户端 用私钥解密质询
7.客户端 将解密后的质询发送回服务器
8.服务器 验证质询
9.验证通过,链接建立
1.#Port 22
2.PermitRootLogin yes 默认是打开的,就是允许客户端用root链接
3.#PermitEmptyPasswords no 是否允许空密码
下面是可以解决链接慢
1.UseDNS no 拒绝域名解析
2.GSSAPICleanupCredentials no
1.指定端口的链接,会跳到链接的机子上
ssh -p22 user@ip -p指定端口,默认即位22
2.在链接的机子上执行命令,不会跳到链接的机子上
ssh -p22 user@ip command
1.推:scp -P22 /etc/file user@ip:/tmp -P这个指定端口是大写p
2.拉:scp -P22 user@ip:/tmp/file /etc/
3.参数介绍:
-r递归,表示拷贝目录
-p表示拷贝前后保持文件目录属性
-l limit限制速度
通常scp -P22 -rp 即可
4.scp每次都是全量的拷贝,不同于rsync的增量
非交互式创建密钥
我们手动创建是通过,ssh-keygen -t dsa,然后回车
1.自动创建
ssh-keygen -t dsa -P ‘’ -f ~/.ssh/id_dsa > /dev/null 2>&1
2.将公钥发送到远程主机
ssh-copy-id -i .ssh/id_dsa.pub “-p22 user@ip”
发送过去后,远程主机会产生.ssh/authorized_keys文件,权限是600,本地会多出.ssh/known_hosts文件
提权执行
1.直接root账号,将sshd_config里面允许root登录
2.sudo提权实现没有权限的用户拷贝
首先,配置sudoers:
终端命令;visudo,相当于配置/etc/sudoers
#Allow root to run any commands anywhere
用户或者组 机器=授权角色 可执行命令
root ALL=(ALL) ALL
joker ALL=(ALL) /usr/bin/rsync
@group ALL=(ALL) ALL
user ALL=(ALL) NOPASSWD:ALL
解释:
第一个ALL代表机器,就是所有机器,第二个ALL代表所有角色,第三个ALL代表可以执行所有命令,NOPASSWD代表提权命令时不需要提示密码
然后,加载sudoers文件
visudo -C
最后,用joker用户通过基于ssh的rsync发送文件
用户或者组在执行授权的特殊权限命令时后格式为sudo 命令,切换到root格式为 sudo su - ,需要输入当前用户的密码,而不是root密码
ssh -p22 -t user@ip sudo rsync ~/hosts /etc/hosts
注意;
如果,提示命令找不到,很可能是环境变量导致
root下,echo $path
user下,echo $path
在user下,修改vi ~/.bash_profile,将/usr/local/sbin:/sbin:/usr/sbin加入进去
3.利用suid实现没有权限用户拷贝
chmod u+s ‘which rsync’
基于ssh的scp推送脚本
#!/bin/bash
if [ $# -ne 2 ];then
echo "usage:/bin/bash $0 {avg1 avg2}"
exit 1
fi
. /etc/init.d/functions
for ip in 1 2 3
do
scp -p22 file user@ip:/tmp > /dev/null 2&1
if [ $? -eq 0 ];then
action "fenfa hosts ip" /bin/true
else
action "fenfa hosts ip" /bin/false
fi
done
非交互模式产生密钥
1.yum install expect -y
2.mkpasswd -l 10
参数介绍,生成随机字符串,-l是指生成多少个字符
3.简单介绍expect的过程
首先,还是需要手动ssh-keygen生成私钥,公钥
然后,spawn ssh-copy-id -i id_dsa.pub "-p 22 user@ip"
expect {
"yes/no" {send "yes\r":exp_continue}
"*password" {send "123\r"}
}
expect eof
基于expect免密钥分发脚本
#!/bin/bash
# The author is joker, which is used to manage the host.
expect_order=`which expect 1>/dev/null 2>&1`
if [ $? -eq 1 ];then
yum install expect -y
sleep 1
sh $0
else
Distribute(){
for IP in $(cat /service/script/distribute_ip.txt);do
Passwd=$1
USER=$2
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub -p 22 $USER@$IP
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*password*\" {send \"$Passwd\r\";exp_continue}
\"*password*\" {send \"$Passwd\r\";}
}
"
if [ $? -eq 0 ];then
echo -e "\033[32m 绿色字,ssh $IP 链接成功 \033[0m"
else
echo -e "\033[31m 红色字,ssh $IP 链接失败,请检查原因 \033[0m"
fi
done
}
Distribute "Poppy1115" root
fi
8.服务器时间和时区
修改时区
1)使用tzselect设置时区
2)复制相应的时区文件,替换系统默认时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3)将当前时间写入BIOS永久生效(避免重启后失效)
hwclock
4)centos /etc/sysconfig/clock
ubuntu /etc/timezone
1.安装软件
yum install ntp #服务器程序
yum install ntpdate #自动更新时间服务
2.启动服务
chkconfig --level 35 ntpd on
chkconfig --level 35 ntpdate on
service ntpd start
#ntpd服务不能和ntpdate服务同时启动
service ntpdate stop
ntpd服务不能和ntpdate服务同时启动
ntpd与ntpdate在更新时间时是有的区别。ntpd不仅仅是时间同步服务器,他还可以做客户端与标准时间服务器进行同步时间,而且是平滑同步,并非ntpdate立即同步,在生产环境中慎用ntpdate,也正如此两者不可同时运行。
3.确认时间同步
ntptime && date && hwclock --show && date +"%Y-%m-%d %H:%M:%S"
Help:
d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号;
date -d "1 day ago" +"%Y-%m-%d" ago是昨天
date -d "1 day" +"%Y-%m-%d" 不加参数是明天
以下使用数字表示前后多少天的加减
date +%Y%m%d #显示前天年月日
date -d "+1 day" +%F #显示前一天的日期 %F就是%Y-%m-%d
date -d "-1 day" +%F #显示后一天的日期
date -d "-1 month" +F #显示上一月的日期
date -d "+1 month" +F #显示下一月的日期
date -d "-1 year" +F #显示前一年的日期
date -d "+1 year" +F #显示下一年的日期
-s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号;
date -s 01:01:01 #设置具体时间,不会对日期做更改
date -s "01:01:01 2012-05-23" #这样可以设置全部时间
date -s "01:01:01 20120523" #这样可以设置全部时间
date -s "2012-05-23 01:01:01" #这样可以设置全部时间
date -s "20120523 01:01:01" #这样可以设置全部时间
默认云服务器有同步的时间服务器
修改时间 date
硬件时间 hwclock --show
同步公有时间服务器,可搭配任务计划,阿里云的时间服务器ntp.aliyun.com
yum -y install ntp ntpdate
chkconfig --level 35 ntpd on
chkconfig --level 35 ntpdate on
service ntpd start
service ntpdate stop
ntptime
注意:如果出现ntpdate[24325]: the NTP socket is in use, exiting,需要systemctl stop ntpd.service停止,然后同步,之后再启动,阿里云服务器默认同步阿里云时间服务器.
当前任务的执行时间脚本
#!/bin/bash
start=$(date +%s) # 1528437613
nmap man.linuxde.net &> /dev/null
end=$(date +%s)
difference=$(( end - start ))
echo $difference seconds.
任务计划使用
cat /var/spool/cron/root 可直接修改配置文件,注意重启/reload
crontab -e
crontab -l -u root #查看root用户
基本格式:
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
每月1、10、22日的4 : 45重启apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
每天18 : 00至23 : 00之间每隔30分钟重启apache
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
9.修改系统启动服务
systemctl 是管制服务的主要工具,它整合了chkconfig 与 service功能于一体。
systemctl is-enabled iptables.service
#查询防火墙是否开机启动
systemctl restart sshd
#有可能不需要加service
systemctl is-enabled XXX.service
#查询服务是否开机启动
systemctl enable XXX.service
#开机运行服务
systemctl disable XXX.service
#取消开机运行
systemctl start XXX.service
#启动服务
systemctl stop XXX.service
#停止服务
systemctl restart XXX.service
#重启服务
systemctl reload XXX.service
#重新加载服务配置文件 (改完配置文件需要重载才生效)
systemctl status XXX.service
#查询服务运行状态
systemctl --failed
#显示启动失败的服务
10.清理磁盘垃圾node节点
centos7默认安装了postfix邮件服务,因此邮件位置 /var/spool/postfix/maildrop/会存在垃圾文件,如果长时间不清理,会导致inode数量不够用,从而无法存放文件。
11.修改系统字符编码支持中文
修改字符编码,默认是LANG=en_US.UTF-8
修改该文件之前,可以先查看已经安装的语言包:
locale -a | grep zh
如果没有语言包
yum -y install kde-l10n-Chinese glibc-common
安装完成后通过vi命令编辑配置文件
vim /etc/locale.conf
LANG="zh_CN.UTF-8"
source /etc/locale.conf
12.隐藏内核信息
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
echo 'Hello Linux' > /etc/redhat-release
Hello Linux
# cat /etc/issue
\S
Kernel \r on an \m
13.锁定关键核心目录
[root@huntercybersecurity~]# chattr +i /etc/passwd /etc/resolv.conf /etc/sudoers /etc/ssh/sshd_config
[root@huntercybersecurity~]# lsattr /etc/passwd /etc/resolv.conf /etc/sudoers /etc/ssh/sshd_config
----i----------- /etc/passwd
----i----------- /etc/resolv.conf
----i----------- /etc/sudoers
----i----------- /etc/ssh/sshd_config
去锁修改文件:
[root@huntercybersecurity~]# chattr -i /etc/passwd
[root@huntercybersecurity~]# lsattr /etc/passwd
-------------e-- /etc/passwd
14.免疫死亡之ping
# 开启禁止ping
echo "net.ipv4.icmp_echo_ignore_all=1" 1>> /etc/sysctl.conf && sysctl -p
# 关闭禁止ping
首先要删除 /etc/sysctl.conf 里面net.ipv4.icmp_echo_ignore_all = 1
之后执行如下命令
echo 0 1> /proc/sys/net/ipv4/icmp_echo_ignore_all
# 后续就可以通过更改 cat /proc/sys/net/ipv4/icmp_echo_ignore_all文件
关闭 1 开启
15.历史记录操作
# 以下都是临时生效,默认1000不需要更改
# 设置的是闲置账号的超时时间
export TMOUT=10 10秒后提示超时时间
# 设置终端history显示条数
export HISTSIZE=5 只显示最近5条信息
# 上面的终端显示对应的是 cat ~/.bash_history
export HISTFILESIZE=5 该文件只保存5条信息
# 清空历史记录
history -c
# 指定条数删除
history -d 历史记录条属
16.内核网络参数调试
#!/bin/bash
#DOS defense
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/ip_forward
#echo 1024 > /proc/sys/net/ipv4/ipfrag_high_thresh
#echo 512 > /proc/sys/net/ipv4/ipfrag_low_thresh
echo 64000 > /proc/sys/net/ipv4/ipfrag_high_thresh
echo 48000 > /proc/sys/net/ipv4/ipfrag_low_thresh
echo 10 > /proc/sys/net/ipv4/ipfrag_time
echo 5 > /proc/sys/net/ipv4/icmp_ratelimit
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 0 > /proc/sys/net/ipv4/conf/eth0/accept_source_route
echo 0 > /proc/sys/net/ipv4/conf/eth0/accept_redirects
echo 1 > /proc/sys/net/ipv4/conf/eth0/log_martians
echo 10 > /proc/sys/net/ipv4/neigh/eth0/locktime
echo 0 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
echo 50 > /proc/sys/net/ipv4/neigh/eth0/gc_stale_time
echo "1800" > /proc/sys/net/ipv4/tcp_keepalive_time
echo "0" > /proc/sys/net/ipv4/tcp_window_scaling
echo "0" > /proc/sys/net/ipv4/tcp_sack
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Makes it harder for MITM attacks
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/secure_redirects
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo 5 > /proc/sys/net/ipv4/igmp_max_memberships
echo 2 > /proc/sys/net/ipv4/igmp_max_msf
echo 1024 > /proc/sys/net/ipv4/tcp_max_orphans
echo 2 > /proc/sys/net/ipv4/tcp_syn_retries
echo 2 > /proc/sys/net/ipv4/tcp_synack_retries
echo 1 > /proc/sys/net/ipv4/tcp_abort_on_overflow
echo 10 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 0 > /proc/sys/net/ipv4/route/redirect_number
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/eth1/rp_filter
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 61 > /proc/sys/net/ipv4/ip_default_ttl
# Nmap foolery to appear as Checkpoint on XP
echo 4096 87380 4194304 >/proc/sys/net/ipv4/tcp_rmem
echo 4096 87380 4194304 >/proc/sys/net/ipv4/tcp_wmem
# Monitor network overload
echo 1 > /proc/sys/net/ipv4/tcp_ecn
# Port range outgoing traffic
echo "1000 60000" > /proc/sys/net/ipv4/ip_local_port_range
# Default queue size
echo 4096 > /proc/sys/net/ipv4/ip_conntrack_max
# SYN backlog queue
echo 2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 0 > /proc/sys/net/ipv4/tcp_sack
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
## mitigate fork bombs
echo 64000 > /proc/sys/fs/file-max
ulimit -n 64000
说明:本优化适合apache,nginx,squid多种等web应用,特殊的业务也可能需要略作调整。
vim /etc/sysctl.conf
#协议优化
net.ipv4.icmp_echo_ignore_all=1
net.core.somaxconn = 3000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_orphans = 2000
#net.ipv4.ip_conntrack_max = 25000000
#防火墙优化
#net.ipv4.netfilter.ip_conntrack_max = 25000000
#net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
#net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
#net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
#net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
#结合DDOS和TIME_WAIT过多,建议增加如下参数设置:
## Use TCP syncookies when needed
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries=3
net.ipv4.tcp_syn_retries=3
net.ipv4.tcp_max_syn_backlog=2048
## 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.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000
sysctl -p
#附:查看当前的连接数状况
netstat -nat|awk '{print awk $NF}'|sort|uniq -c|sort -n
参考
https://www.jianshu.com/p/4ea79f3c39a0简书
[root@huntercybersecurity~]# vi /etc/sysctl.conf
# 表示套接字由本端要求关闭,这个参数决定了它保持在FIN-wAIT-2状态的时间,默认值是60秒,建议调整为2,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_fin_timeout 60
net.ipv4.tcp_fin_timeout = 2
# 表示开启重用,允许TIME-wAIT sockets重新用于新的TCP链接,默认值为0,表示关闭,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_reuse 0
net.ipv4.tcp_tw_reuse = 1
# 表示开启TCP链接中TIME_WAIT sockets的快速回收,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_recycle,默认为0 表示关闭,不建议开启,因为nat网络问题
net.ipv4.tcp_tw_recycle = 0
# reuse和recycle这俩个参数是为防止生产环境下web,squid等业务服务器time_wait网络状态数量过多设置的
注意:
tcp TIME_WAIT
进入主题前必须做铺垫啊,讲讲TIME_WAIT.因为TCP连接是双向的,所以在关闭连接的时候,两个方向各自都需要关闭。先发FIN包的一方执行的是主动关闭;后发FIN包的一方执行的是被动关闭。主动关闭的一方会进入TIME_WAIT状态,并且在此状态停留两倍的MSL(最大报文存活时间,一般Linux内核设置30秒)时长。
为什么主动方要傻乎乎等2MSL呢?不等,行不行?
TCP目的是可靠传输,主动关闭的一方发出FIN,被动方回复ACK,接着被动方发送FIN,主动方收到被动关闭的一方发出的FIN包后,回应ACK包,同时进入TIME_WAIT状态,但是因为网络原因,主动关闭的一方发送的这个ACK包很可能延迟,从而触发被动连接一方重传FIN包。极端情况下,这一去(ACK去被动方)一回(重传FIN回来),就是两倍的MSL时长。
如果主动关闭的一方跳过TIME_WAIT直接进入CLOSED,或者在TIME_WAIT停留的时长不足两倍的MSL,那么当被动关闭的一方早先发出的FIN延迟包到达或者重传FIN包到达后,就可能出现类似下面的问题:
主动方旧的TCP连接已经不存在了,主动方只能返回RST包
主动方新的TCP连接被建立起来了,延迟包可能干扰新的连接
所以, TIME_WAIT必须等,2MSL不能少
减少TIME_WAIT
TIME_WAIT期间,资源不会释放,现在都追求高性能高并发,快速释放资源是躲不掉的.对于客户端因为有端口65535问题,TIME_WAIT过多直接影响处理能力. 对于服务器,无端口数量限制的问题,Linux优化也很给力,每个处于TIME_WAIT 状态下连接内存消耗很少, 而且也能通过tcp_max_tw_buckets = ${你要的阈值} 配置最大上限,但是对于短连接为主的web服务器,几十万的连接,基数很大,耗得内存也不小哦.快速释放总是好的
tcp_tw_recycle:回收TIME_WAIT连接
对客户端和服务器同时起作用,开启后在 3.5*RTO 内回收,RTO 200ms~ 120s 具体时间视网络状况。RTO(Retransmission TimeOut)重传超时时间.内网状况比tcp_tw_reuse 稍快,公网尤其移动网络大多要比tcp_tw_reuse 慢,优点就是能够回收服务端的TIME_WAIT数量
但是,有个小坑:当多个客户端通过NAT方式联网并与服务端交互时,服务端看到的是同一个IP,也就是说对服务端而言这些客户端实际上等同于一个,可惜由于这些客户端的时间戳可能存在差异,于是乎从服务端的视角看,便可能出现时间戳错乱的现象,进而直接导致时间戳小的数据包被丢弃。客户端处于NAT很常见,基本公司家庭网络都走NAT.
tcp_tw_reuse:复用TIME_WAIT连接 只对客户端起作用,1秒后才能复用,当创建新连接的时候,如果可能的话会考虑复用相应的TIME_WAIT连接。通常认为tcp_tw_reuse比tcp_tw_recycle安全一些,这是因为一来TIME_WAIT创建时间必须超过一秒才可能会被复用;二来只有连接的时间戳是递增的时候才会被复用。
客户端请求服务器,服务器响应后主动关闭连接,TIME_WAIT存在于服务器,服务器是被连接者,没有复用一说,所以只对客户端起作用.如果是客户端主动关闭,TIME_WAIT存在于客户端,这个时候再次连接服务器,可以复用之前TIME_WAIT留下的半废品.
tcp_timestamps:以上两点,必须在客户端和服务端timestamps 开启时才管用(默认开启) 需要根据timestamp的递增性来区分是否新连接
总结
客户端tcp_tw_reuse复用连接管用, tcp_tw_recycle有用,但是客户端主要不是接受连接,用处不大
服务器tcp_tw_recycle回收连接管用,tcp_tw_reuse复用无效.为了减少TIME_WAIT留在服务器,可以在服务器开启KeepAlive,尽量不让服务器主动关闭,而是客户端主动关闭,减少TIME_WAIT产生.
reuse/recycle
# 表示开启SYN Cookies功能,当出现SYN等待队列溢出时,启用Cookies来处理,可防范少量SYN攻击,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syscookies,默认为1,表示开启
net.ipv4.tcp_syncookies = 1
# 表示当keepalive启用时,TCP发送keepalive消息的频度,默认是2小时,建议更改为10分钟,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_keepalive_time,默认为7200秒
net.ipv4.tcp_keepalive_time =600
# 该选项用来设定允许系统打开的端口范围,即用于向外链接的端口范围,该参数对应系统路径为:/proc/sys/net/ipv4/ip_local_port_range 默认,32768 60999
net.ipv4.ip_local_port_range = 32768 60999
# 表示SYN队列的长度,默认为1024,建议加大队列的长度,为8182或更多,这样可以容纳更多等待链接的网络连接数,该参数为服务器端用于记录那些尚未收到客户端确认信息的链接请求的最大值,
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 1024
# 该选项默认值是128,这个参数用于调节系统同时发起的TCP连接数,在高并发的请求中,默认的值可能会导致链接超时或重传,因此,需要结合并发请求数来调节此值,
该参数对应系统路径为:/proc/sys/net/ipv4/somaxconn 128 # 默认没有这个配置,需要自己生成
net.core.somaxconn = 1024
注意:
socket接收的所有连接都是存放在队列类型的数据结构中,关键问题是这种队列有两个,而且其长度都是可以设置的。
分别是下面两个内核参数:
/proc/sys/net/ipv4/tcp_max_syn_backlog
/proc/sys/net/core/somaxconn
其中:
tcp_max_syn_backlog是指定所能接受SYN同步包的最大客户端数量,即半连接上限;
somaxconn是指服务端所能accept即处理数据的最大客户端数量,即完成连接上限。
对于没有调优的新装的centOS6.5系统,这两个参数的值都是128。
这么描述虽然精确,但是没有一定基础,不熟练网络编程的人理解起来很费劲。
打个简单的比方:
某某发布公告要邀请四海之内若干客人到场参加酒席。客人参加酒席分为两个步骤:
1、到大厅;
2、找到座位(吃东西,比如糖果、饭菜、酒等)。
tcp_max_syn_backlog用于指定酒席现场面积允许容纳多少人进来;
somaxconn用于指定有多少个座位。
显然tcp_max_syn_backlog>=somaxconn。
如果要前来的客人数量超过tcp_max_syn_backlog,那么多出来的人虽然会跟主任见面握手,但是要在门外等候;
如果到大厅的客人数量大于somaxconn,那么多出来的客人就会没有位置坐(必须坐下才能吃东西),只能等待有人吃完有空位了才能吃东西。
那么问题来了:
somaxconn是内核里的参数,listen函数有个参数backlog,如果在listen方法里面指定该参数大于somaxconn的值,重新编译并启动程序,服务端所能接收的完整的连接数上限是backlog呢还是somaxconn?
答案很简单,listen方法指定的backlog是在用户态指定的,内核态的参数优先级高于用户态的参数,所以即使在listen方法里面指定backlog是一个大于somaxconn的值,socket在内核态运行时还会检查一次somaxconn,如果连接数超过somaxconn就会等待。
就相当于主人指定了能有多少座位没用,客人到了现场,准备入座时,还要看酒店的客户经理判断能有多少个座位。
结论:
在没有调优的centOS7.4版本的服务器上,由于受到系统级别的限制,在该服务器上运行的服务端程序,在同一时间,最大只能接受128个客户端发起持久连接,并且只能处理128个客户端的数据通信
tcp_max_syn_backlog/somaxconn
如改为5000-30000,不用业务的服务器也可以给大一点,比如LVS,Squid,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_tw_buckets
net.ipv4.tcp_max_tw_buckets = 5000
参考https://www.jianshu.com/p/b7e991be0909
表示内核放弃建立链接之前发送SYN包的数量,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syn_retries,默认是6
net.ipv4.tcp_syn_retries = 1
参数的值决定了内核放弃链接之前发送SYN+ACK包的数量,该参数对应系统路径为:
/proc/sys/net/ipv4/tcp_synack_retries#默认是2
net.ipv4.tcp_synack_retries = 1
表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包最大数,该参数对应系统路径为:/proc/sys/net/ipv4/netdev_max_backlog,默认值为1000
net.core.netdev_max_backlog = 1000 # 默认没有这个配置,需要自己生成
用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上,如果超过这个数值,孤立链接将立即被复位并打印出警号信息,这个限制只是为了防止简单的DoS攻击,不能过分依靠这个限制甚至
人为减小这个值,更多的情况是增加这个值,默认是4096,建议该值修改为2000,该参数对应系统路径为:
/proc/sys/net/ipv4/tcp_max_orphans
net.ipv4.tcp_max_orphans = 2000
以下参数是对iptables防火墙的优化,防火墙不开会有提示,可以忽略不理。
net.ipv4.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
注意:
很多TIME_WAIT连接导致Cannot assign requested address的解决办法
客户端connect服务器,执行一定时间后,接口返回-99的错误
查看错误信息 OS error code 99: Cannot assign requested address
猜想端口被用光的原因,网络搜索得到一个解释:客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端口号,所以新的连接没办法绑定端口,即“Cannot assign requested address”
通过netstat,的确看到很多TIME_WAIT状态的连接
因为是调用API,所以无法对连接进行opt设置,只能通过设置系统配置得以解决
解决办法:
#执行命令修改如下2个内核参数
sysctl -w net.ipv4.tcp_timestamps=1 #开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1 #表示开启TCP连接中TIME-WAIT sockets的快速回收
经常检查apache的连接数,会发现很多无用的time_wait连接。有人说这是正常的,是因为一个请求中途中断造成的;还有人说微软的IE连接时产生的Time_wait会比用Firefox连接时多。个人认为有一定的Time_wait是正常的,如果超过了连接数的比例就不是很正常,所以还是找来方法解决一下。
先检查一下time wait的值:
[root@huntercybersecurity~]
#sysctl -a | grep time | grep wait
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
这里解决问题的关键是如何能够重复利用time_wait的值,检查net.ipv4.tcp_tw当前值:
[root@huntercybersecurity~]
# sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
#增加或修改net.ipv4.tcp_tw值,将当前的值更改为1分钟(reuse是表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接; recycle是加速TIME-WAIT sockets回收):
[root@huntercybersecurity~]vi /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
使内核参数生效:
[root@huntercybersecurity~] sysctl -p
用netstat再观察时会发现已经恢复正常。
#结合DDOS和TIME_WAIT过多,建议增加如下参数设置:
# Use TCP syncookies when needed
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries=3
net.ipv4.tcp_syn_retries=3
net.ipv4.tcp_max_syn_backlog=2048
# 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.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000
查看当前的连接数状况:
netstat -nat|awk '{print awk $NF}'|sort|uniq -c|sort -n
established
State
LAST_ACK
CLOSING
FIN_WAIT2
LISTEN
FIN_WAIT1
SYN_RECV
ESTABLISHED
TIME_WAIT
上面的命令可以帮助分析哪种tcp状态数量异常。其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。
查看IP连接数状况
netstat -nat|grep ":80"|awk '{print $5}' |awk -F: '{print $1}' | sort| uniq -c|sort -n
发现异常的,可以封了这个IP
===============
TCP/IP TIME_WAIT状态原理
TIME_WAIT状态原理
通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。
客户端主动关闭连接时,会发送最后一个ack后,然后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态。
TIME_WAIT状态存在的理由
TCP/IP协议就是这样设计的,是不可避免的。主要有两个原因:
1)可靠地实现TCP全双工连接的终止
TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。
因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态 。
2)允许老的重复分节在网络中消逝
TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。
MSL时间
MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒。
TIME_WAIT状态维持时间
TIME_WAIT状态维持时间是两个MSL时间长度,也就是在1-4分钟。Windows操作系统就是4分钟。
用于统计当前各种状态的连接的数量的命令
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
返回结果如下:
LAST_ACK 14
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122
对上述结果的解释:
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
进一步论述这个问题:
--------------客户端主动关闭连接-----------------------
注意一个问题,进入TIME_WAIT状态的一般情况下是客户端。
大多数服务器端一般执行被动关闭,服务器不会进入TIME_WAIT状态。
当在服务器端关闭某个服务再重新启动时,服务器是会进入TIME_WAIT状态的。
举例:
1.客户端连接服务器的80服务,这时客户端会启用一个本地的端口访问服务器的80,访问完成后关闭此连接,立刻再次访问服务器的
80,这时客户端会启用另一个本地的端口,而不是刚才使用的那个本地端口。原因就是刚才的那个连接还处于TIME_WAIT状态。
2.客户端连接服务器的80服务,这时服务器关闭80端口,立即再次重启80端口的服务,这时可能不会成功启动,原因也是服务器的连
接还处于TIME_WAIT状态。
服务端提供服务时,一般监听一个端口就够了。例如Apach监听80端口。
客户端则是使用一个本地的空闲端口(大于1024),与服务端的Apache的80端口建立连接。
当通信时使用短连接,并由客户端主动关闭连接时,主动关闭连接的客户端会产生TIME_WAIT状态的连接,一个TIME_WAIT状态的连接就占用了一个本地端口。这样在TIME_WAIT状态结束之前,本地最多就能承受6万个TIME_WAIT状态的连接,就无端口可用了。
客户端与服务端进行短连接的TCP通信,如果在同一台机器上进行压力测试模拟上万的客户请求,并且循环与服务端进行短连接通信,那么这台机器将产生4000个左右的TIME_WAIT socket,后续的短连接就会产生address already in use : connect的异常。
关闭的时候使用RST的方式,不进入 TIME_WAIT状态,是否可行?
--------------服务端主动关闭连接------------------------------
服务端提供在服务时,一般监听一个端口就够了。例如Apach监听80端口。
客户端则是使用一个本地的空闲端口(大于1024),与服务端的Apache的80端口建立连接。
当通信时使用短连接,并由服务端主动关闭连接时,主动关闭连接的服务端会产生TIME_WAIT状态的连接。
由于都连接到服务端80端口,服务端的TIME_WAIT状态的连接会有很多个。
假如server一秒钟处理1000个请求,那么就会积压240秒*1000=24万个TIME_WAIT的记录,服务有能力维护这24万个记录。
大多数服务器端一般执行被动关闭,服务器不会进入TIME_WAIT状态。
服务端为了解决这个TIME_WAIT问题,可选择的方式有三种:
保证由客户端主动发起关闭(即做为B端)
关闭的时候使用RST的方式
对处于TIME_WAIT状态的TCP允许重用
一般Apache的配置是:
Timeout 30
KeepAlive On #表示服务器端不会主动关闭链接
MaxKeepAliveRequests 100
KeepAliveTimeout 180
表示:Apache不会主动关闭链接,
两种情况下Apache会主动关闭连接:
1、Apache收到了http协议头中有客户端要求Apache关闭连接信息,如setRequestHeader(“Connection”, “close”);
2、连接保持时间达到了180秒的超时时间,将关闭。
如果配置如下:
KeepAlive Off #表示服务器端会响应完数据后主动关闭链接
TIME_WAIT
使配置文件生效
[root@huntercybersecurity~] sysctl –p
提示:
由于CentOS7.X系统中的模块名不是ip_conntrack,而是nf_conntrack,所以在/etc/sysctl.conf优化时,需要把net.ipv4.netfilter.ip_conntrack_max 这种老的参数,改成net.netfilter.nf_conntrack_max这样才可以。
即对防火墙的优化,在5.8上是
net.ipv4.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
对于 ip_conntrack_max 计算方法
-允许的最大跟踪连接条目,在这篇文档中我们叫作CONNTRACK_MAX
CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (x / 32)
这里x是指针的bit数,(例如,32或者64bit)
内存为8G
CONNTRACK_MAX = 810241024*1024 / 16384 / (64 / 32)
在7.4上是
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
另外,在此优化过程中可能会有报错:
1、5.8版本上
error: "net.ipv4.ip_conntrack_max"is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_max"is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_established"is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait"is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait"is an unknown key
error: "net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait"is an unknown key
这个错误可能是你的防火墙没有开启或者自动处理可载入的模块ip_conntrack没有自动载入,解决办法有二,一是开启防火墙,二是自动处理开载入的模块ip_conntrack
modprobe ip_conntrack
echo "modprobe ip_conntrack">> /etc/rc.local
2、6.4版本上
error: "net.nf_conntrack_max"isan unknown key
error: "net.netfilter.nf_conntrack_max"isan unknown key
error: "net.netfilter.nf_conntrack_tcp_timeout_established"isan unknown key
error: "net.netfilter.nf_conntrack_tcp_timeout_time_wait"isan unknown key
error: "net.netfilter.nf_conntrack_tcp_timeout_close_wait"isan unknown key
error: "net.netfilter.nf_conntrack_tcp_timeout_fin_wait"isan unknown key
这个错误可能是你的防火墙没有开启或者自动处理可载入的模块ip_conntrack没有自动载入,解决办法有二,一是开启防火墙,二是自动处理开载入的模块ip_conntrack
modprobe nf_conntrack
echo "modprobe nf_conntrack">> /etc/rc.local
3、6.4版本上
error: "net.bridge.bridge-nf-call-ip6tables"isan unknown key
error: "net.bridge.bridge-nf-call-iptables"isan unknown key
error: "net.bridge.bridge-nf-call-arptables"isan unknown key
这个错误是由于自动处理可载入的模块bridge没有自动载入,解决办法是自动处理开载入的模块ip_conntrack
modprobe bridge
echo "modprobe bridge">> /etc/rc.local
关闭的时候使用RST的方式
对处于TIME_WAIT状态的TCP允许重用
17.Tomcat优化
1.提高JVM栈内存
tomcat有时候会“内存溢出”,这种问题出现在实际的生产环境中,产生这种问题的原因是tomcat使用较少的内存给进程。通过配置tomcat的配置文件(window下的tomcat/bin/catalina.bat或Linux下的tomcat/bin/catalina.sh)可以解决此问题。这种解决方法是通过增加JVM的栈内存实现的。这个方案可以让tomcat可以更多关注处理web请求,并要求尽快完成。
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8
-server -Xms1024m -Xmx1024m
-XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m
-XX:MaxPermSize=512m -XX:+DisableExplicitGC"
2.解决JRE内存泄露
性能表现不佳的另一个主要原因是内存泄漏。可以使用最新的tomcat服务器以获得更好的性能和可伸缩性。新的tomcat包含了一个监听器来处理JRE和PermGen的内存泄漏。使用的监听器是
Listener className=“org.apache.catalina.core.JreMemoryLeakPreventionListener”
3.线程池设置
线程池指定Web请求负载的数量,可以通过调整连接器属性“maxThreads”完成设置。maxThreads是由服务器处理的并发请求的最大数量。如果maxThreads设置的值过低,将有没有足够的线程来处理所有的请求,请求将进入等待状态,只有当一个的处理线程释放后才被处理;如果设置的太大,Tomcat的启动将花费更多时间。因此它取决于我们给maxThreads设置一个正确的值。
Connector port="8080" address="localhost"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8181" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
4.压缩
HTTP压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求服务器对应资源后,从服务器端将资源文件压缩,再输出到客户端,由客户端的浏览器负责解压缩并浏览。
tomcat5.0以后的版本是支持对输出内容进行压缩的,使用的是gzip压缩格式 。
Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" executor="tomcatThreadPool" URIEncoding="utf-8"
compression="on" compressionMinSize="50" noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/java,text/css,text/plain"
从上面节点的属性可以看出,要使用gzip压缩功能,你需要在Connector节点中加上如下属性
compression=“on” 打开压缩功能
compressionMinSize=“50” 启用压缩的输出内容大小,单位byte默认为2048
noCompressionUserAgents=“gozilla, traviata” 对于以下的浏览器,不启用压缩
compressableMimeType=“text/html,text/xml,text/java,text/css,text/plain” 哪些资源类型需要压缩
5.数据库性能调优
Tomcat性能在等待数据库查询被执行期间会降。提高性能:
使用可能包含“命名查询”的关系型数据库,Tomcat会在启动时默认加载命名查询,这个可能会提升性能。
确保所有数据库连接正确地关闭。正确配置数据库连接池设置。Resource要素的最大空闲数(maxIdle),最大连接数(maxActive),最大建立连接等待时间(maxWait)属性的值。
艺无止境,诚惶诚恐!