虚拟主机服务商在运营过程中可能会受到黑客攻击,常见的攻击方式有SYN,DDOS等。通过更换IP,查找被攻击的站点可能避开攻击,但是中断服务的时间比较长。比较彻底的解决方法是添置硬件防火墙。不过,硬件防火墙价格比较昂贵。可以考虑利用Linux 系统本身提供的防火墙功能来防御。
抵御SYN SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络包,但不实际建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问。
Linux内核提供了若干SYN相关的配置,用命令: sysctl -a | grep syn 看到:
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_syn_retries = 5
tcp_max_syn_backlog是SYN队列的长度,tcp_syncookies是一个开关,是否打开SYN Cookie 功能,该功能可以防止部分SYN攻击。tcp_synack_retries和tcp_syn_retries定义SYN 的重试次数。加大SYN队列长度可以容纳更多等待连接的网络连接数,打开SYN Cookie功能可以阻止部分 SYN攻击,降低重试次数也有一定效果。
调整上述设置的方法是:
增加SYN队列长度到2048:
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
打开SYN COOKIE功能:
sysctl -w net.ipv4.tcp_syncookies=1
降低重试次数:
sysctl -w net.ipv4.tcp_synack_retries=3
sysctl -w net.ipv4.tcp_syn_retries=3
为了系统重启动时保持上述配置,可将上述命令加入到/etc/rc.d/rc.local文件中。
防止同步包洪水(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
一:内核简介
内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。
内核的分类可分为单内核和双内核以及微内核。严格地说,内核并不是计算机系统中必要的组成部分。
什么是内核?
内核,是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、内核体系结构、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
什么是线程?
线程:是操作系统能够进行运算调度的最小单位。 它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进 程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务在一个程序里的一个执行路径就叫做线程。线程是一个进程内部的控制序列。一切进程至少有一个执行线程。线程在进程内部运行,本质是进程地址空间内运行。在Linux系统中,在cpu眼里,看到的PCB都有比传统的进程更加轻量化。通过进程虚拟地址空间,可以看到进程大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。
什么是进程?
centos linux的第一个进程通常是init或者systemd,它是所有进程的父进程,PID为1,是唯一一个由系统内核直接运行 的进程
Linux 给每个进程都打上了运行者的标志,用户可以控制自己的进程:给自己的进程分配不同的优先级,也可以随时终止自己的进程
Linux 不可能在一个 CPU 上同时处理多个任务(作业)请求,而是采用 “分时” 技术来处理这些任务请求
除了init或者systemd,其他进程都是由父进程创建,即每个进程都有父进程(PPID)
二:查看系统资源
1.查看当前系统的所有限制值
命令:ulimit -a
核心文件大小(块,-c)0
数据段大小(kbytes,-d)不受限制
计划优先级0
文件大小(块,-f)不受限制
挂起信号(-i)7190
最大锁定内存(KB,-l)64
最大内存大小(kbytes,-m)不受限制
打开文件(-n)1024
管道大小(512字节,-p)8
POSIX消息队列(字节,-q)819200
实时优先级0
堆栈大小(kbytes,-s)8192
cpu时间(秒,-t)无限制
最大用户进程(-u)7190
虚拟内存(KB,-v)不受限制
文件锁定(-x)不受限制
2.查看用户同时打开的文件数(linux系统默认的只要1024) 也是临时修改(不需要重启),命令后面加参数即可:ulimit -n 65535
命令:ulimit -n
3.查看Linux系统级的最大打开文件数限制
命令:cat /proc/sys/fs/file-max
4.ulimit的选项用法
-a 显示目前资源限制的设定
-c <core文件上限> 设定core文件的最大值,单位为区块
-d <数据节区大小> 程序数据节区的最大值,单位为KB
-f <文件大小> shell所能建立的最大文件,单位为区块
-H 设定资源的硬性限制,也就是管理员所设下的限制
-m <内存大小> 指定可使用内存的上限,单位为KB
-n <文件数目> 指定同一时间最多可开启的文件数
-p <缓冲区大小> 指定管道缓冲区的大小,单位512字节
-s <堆叠大小> 指定堆叠的上限,单位为KB
-S 设定资源的弹性限制
-t <CPU时间> 指定CPU使用时间的上限,单位为秒
-u <程序数目> 用户最多可开启的程序数目
-v <虚拟内存大小> 指定可使用的虚拟内存上限,单位为KB
三:系统资源限制设置(使用root权限)
命令:vim /etc/security/limits.conf
在最后添加下面这几句:
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
知识扩展:
noproc 是代表最大进程数
nofile 是代最大文件打开数
* 是表示修改所有用户的限制
命令:vim /etc/security/limits.d/20-nproc.conf
修改一下参数:
#* soft nproc 65535
#root soft nproc unlimited
* soft nproc 65535
* hard nproc 65535
注释原本的,添加新增的
然后执行reboot命令重启,root和普通用户的线程和最大打开文件数了都是65535
重启之后执行ulimit -a命令查看
命令:ulimit -a
如果是生产环境的话,就添加以下内容
命令:vim /etc/security/limits.conf
* soft core unlimit
* hard core unlimit
* soft fsize unlimited
* hard fsize unlimited
* soft data unlimited
* hard data unlimited
* soft nproc 65535
* hard nproc 63535
* soft stack unlimited
* hard stack unlimited
* soft nofile 409600
* hard nofile 409600
四:内核优化
命令:cat /etc/sysctl.conf
打开内核配置文件
命令:vim /etc/sysctl.d/99-sysctl.conf
将以下配置输入进去:
#关闭ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# 避免放大攻击
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 开启恶意icmp错误消息保护
net.ipv4.icmp_ignore_bogus_error_responses = 1
# 关闭路由转发
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
#开启反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
关闭sysrq功能
kernel.sysrq = 0
#core文件名中添加pid作为扩展名
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
#修改消息队列长度
kernel.msgmnb = 65536
kernel.msgmax = 65536
#设置最大内存共享段大小bytes
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
#timewait的数量,默认180000
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
#限制仅仅是为了防止简单的DoS 攻击
net.ipv4.tcp_max_orphans = 3276800
#未收到客户端确认信息的连接请求的最大值
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
#内核放弃建立连接之前发送SYNACK 包的数量
net.ipv4.tcp_synack_retries = 1
#内核放弃建立连接之前发送SYN 包的数量
net.ipv4.tcp_syn_retries = 1
#启用timewait 快速回收
net.ipv4.tcp_tw_recycle = 1
#开启重用。允许将TIME-WAIT sockets 重新用于新的TCP连接
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
#当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时
net.ipv4.tcp_keepalive_time = 30
#允许系统打开的端口范围
net.ipv4.ip_local_port_range = 1024 65000
#修改防火墙表大小,默认65536
net.netfilter.nf_conntrack_max=655350
net.netfilter.nf_conntrack_tcp_timeout_established=1200
# 确保无人能修改路由表
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
然后保存退出之后执行sysctl -p是参数生效,永久生效
命令:sysctl -p