VPS安全以及网络优化

每次更换服务器都要对服务器进行优化设置,mark一下

系统安全

SSH密钥登陆

debian需要打开/etc/ssh/sshd_config 文件,修改其中的port后面的数字

nano /etc/ssh/sshd_config

修改其中的port后面的数字,为你要ssh登陆的端口,cltrl + x保存,回车退出

ssh-key登陆

生成密钥对,使用ssh-keygen,为了安全性更高shi'y

ssh-keygen -t ed25519

要求输入密钥的保存路径+名称.默认是/.ssh/id_rsa,之后在 ./ssh/文件夹下就生成了一对密钥.需要将 .pub上传到服务器: 手动上传,写入 authorized_keys 文件.上传公钥到服务器,scp上传 id_rsa.pub 到root用户的.ssh文件夹(没有需要创建) 将公钥内容写入 authorized_keys .生成的公钥写入了authorized_keys. 修改权限,允许ssh密钥登陆

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

允许ssh密钥登陆

nano /etc/ssh/sshd_config

确保,以下字段内容

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys

注: RSAAuthentication 为 ssh 1代,在新的 linux 系统版本中可能不存在,保证另外两个开启即可. 重启ssh服务,或者直接 reboot 现在应该可以使用ssh-key登陆了

禁止ssh密码登陆

警告 ,除非确认ssh-key可以正常登陆,否则关闭密码登陆后,只能重装系统或者网页 vnc 再开启. 编辑 /etc/ssh/sshd_config 文件.PasswordAuthentication yes 改为PasswordAuthentication no. 重启 ssh 服务,或者 reboot.

安装fail2ban

//Debian / ubuntu

apt-get install fail2ban

相关命令 重启

service fail2ban restart

验证状态

fail2ban-client ping

返回,验证完成后,debian会加入开机启动

Server replied: pong

详细设置Fail2Ban 的配置文件在 /etc/fail2ban/ 下,主配置文件是 jail.conf ,但每次配置文件更新都会重新覆盖jail.conf,初次配置需要拷贝 jail.confjail.local ,再更改.这样每次Fail2Ban都会先从 jail.local 读取配置再更新到jail.conf. 命令,备份

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

配置:启用 SSH 配置,内置规则,只要添加enabled = true字段即可.字段也非常容易明白

#
# SSH servers
#
[sshd]
enabled = true
port    = ssh
logpath = %(sshd_log)s

重启服务 service fail2ban restart

使用 UFW 来设置防火墙

安装 UFW 输入下面的命令,安装ufw软件包: sudo apt install ufw 安装过程不会自动激活防火墙,以避免服务器被锁住。你可以检查 UFW 的状态,输入: sudo ufw status verbose UFW 默认策略 默认情况下,UFW 阻塞了所有进来的连接,并且允许所有出去的连接。这意味着任何人无法访问你的服务器,除非你打开端口。运行在服务器上的应用和服务可以访问外面的世界。 默认的策略定义在/etc/default/ufw文件中,并且可以通过使用sudo ufw default 命令来修改。 大部分应用都附带一份应用配置,它描述了服务,并且包含了 UFW 设置。这个规则在软件包安装的时候,被自动创建在/etc/ufw/applications.d目录下。 想要列举出你系统上所有的应用配置,输入:

sudo ufw app list

允许服务,例如sudo ufw allow OpenSSH 如果 SSh 服务器没有监听默认端口 22,你还需要打开那个端口。 例如,你的 SSH 服务器 监听端口 233,你将会执行:

sudo ufw allow 233/tcp

删除 UFW 规则 有两种不同的方式可以删除 UFW 规则。通过规则序号和通过指定的规则。 通过规则序号来删除 UFW 规则很简单,特别是你刚接触 UFW。 想要通过规则序号来删除,你需要找到你想删除的规则序号。想要这么做,运行下面的命令:

sudo ufw status numbered

输出:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 8080/tcp                   ALLOW IN    Anywhere

想要删除规则,序号为3,这个规则允许对端口8080的连接,你可以使用下面的命令:

sudo ufw delete 3

删除规则的第二种方法就是指定实际的规则。例如,如果你添加过一个打开端口8069的规则,你可以通过下面的命令删除它:

sudo ufw delete allow 8069

禁用 UFW 如果因为任何原因,你需要停止 UFW,并且使得所有规则失效,你可以运行:

sudo ufw disable

稍后,如果你想重新启用 UFW,并且激活所有规则,输入:

sudo ufw enable
sudo ufw default deny

运行以上两条命令后,开启了防火墙,并在系统启动时自动开启。关闭所有外部对本机的访问,但本机访问外部正常。

网络优化

开启 TCP BBR

修改系统变量:

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
           
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

保存并执行 sysctl -p 生效。执行,

sysctl net.ipv4.tcp_available_congestion_control

如果结果是这样

root@debian:~# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = bbr cubic reno

就开启了。

lsmod | grep bbr

TCP优化

增加TCP连接数量

nano /etc/security/limits.conf

添加两行:

* soft nofile 51200
* hard nofile 51200

设置ulimit:

ulimit -n 51200

修改 sysctl.conf

nano /etc/sysctl.conf

复制代码:

# 系统所有进程一共可以打开的文件数量, 每个套接字也占用一个文件描述字
fs.file-max = 1491124
# 提高整个系统的文件限制
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864

# 增大内核 backlog 参数,使得系统能够保持更多的尚未完成 TCP 三次握手的套接字。
net.ipv4.tcp_max_syn_backlog = 1048576
net.core.netdev_max_backlog = 1048576
net.core.somaxconn = 1048576

# 表示用于向外连接的端口范围
net.ipv4.ip_local_port_range = 4096 65000
# 预留端口
net.ipv4.ip_local_reserved_ports = 3000,3306,6379,27017,27018

# 系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)
net.ipv4.tcp_max_orphans = 131072

# 启用 TIME_WAIT 复用,使得结束 TIEM_WAIT 状态的套接字的端口可以立刻被其他套接字使用
net.ipv4.tcp_tw_reuse = 1
# 表示系统同时保持TIME_WAIT的最大数量
net.ipv4.tcp_max_tw_buckets = 55000

# 优化 nf_conntrack 参数,防止服务器出现大量短链接的时候出现丢包
net.netfilter.nf_conntrack_max=1048576
net.nf_conntrack_max=1048576
net.netfilter.nf_conntrack_tcp_timeout_fin_wait=30
net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
net.netfilter.nf_conntrack_tcp_timeout_close_wait=15
net.netfilter.nf_conntrack_tcp_timeout_established=300

# 缩短套接字处于 TIME_WAIT 的时间, 60s -> 15s
net.ipv4.tcp_fin_timeout = 15

# 减小 tcp keepalive 探测次数,可以即时释放长链接
net.ipv4.tcp_keepalive_probes = 3
# 缩短 tcp keepalive 探测间隔时间,同上
net.ipv4.tcp_keepalive_intvl = 15
# 修改 tcp keepalive 默认超时时间
net.ipv4.tcp_keepalive_time=1200

# 关闭慢启动重启(Slow-Start Restart), SSR 对于会出现突发空闲的长周期 TLS 连接有很大的负面影响
net.ipv4.tcp_slow_start_after_idle = 0

# 启用 MTU 探测,在链路上存在 ICMP 黑洞时候有用(大多数情况是这样)
net.ipv4.tcp_mtu_probing = 1

# 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_syncookies = 1

# 当某个节点可用内存不足时, 系统会倾向于从其他节点分配内存。对 Mongo/Redis 类 cache 服务器友好
vm.zone_reclaim_mode = 0

# 当内存使用率不足10%(默认值60%)时使用 swap,尽量避免使用 swap,减少唤醒软中断进程
vm.swappiness = 10

# 内核执行无内存过量使用处理。使用这个设置会增大内存超载的可能性,但也可以增强大量使用内存任务 Mongo/Redis 的性能。
vm.overcommit_memory = 1

# 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭 为了对NAT设备更友好,建议设置为      0。
net.ipv4.tcp_tw_recycle = 0

# 启用 tcp fast open
net.ipv4.tcp_fastopen = 3

# 剩余内存 > 300m
net.core.rmem_default = 174760
net.core.rmem_max = 2097152
net.ipv4.tcp_rmem = 4096 174760 67108864

net.core.wmem_default = 131072
net.core.wmem_max = 2097152
net.ipv4.tcp_wmem = 4096 131072 67108864

net.ipv4.tcp_mem = 131072 262144 524288

# END OF LINE

保存应用

sysctl -p

设置DNS

apt install dnsutils -y

添加文件make_resolv_conf

cat > /etc/dhcp/dhclient-enter-hooks.d/make_resolv_conf<< EOF
#!/bin/sh
make_resolv_conf(){
:
}
EOF

添加文件resolved.conf

cat > /etc/systemd/resolved.conf<< EOF
[Resolve]
DNS=1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001
FallbackDNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844
Domains=~.
DNSSEC=yes
DNSOverTLS=yes
MulticastDNS=yes
LLMNR=yes
Cache=yes
DNSStubListener=yes
ReadEtcHosts=yes
ResolveUnicastSingleLabel=yes
EOF

重启服务

systemctl enable systemd-resolved.service
systemctl restart systemd-resolved.service

添加服务resolv.conf

cat > /etc/resolv.conf<< EOF
nameserver 127.0.0.53
EOF

删除多余内核

查看当前系统所有内核

dpkg -l|grep linux-image | awk '{print $2}'

删除多余内核

apt-get purge 其余内核名称

删除内核后llinux内核显示deinstal

sudo dpkg -P linux-imagxxxx

更新grub 系统引导文件并重启VPS

update-grub && reboot
dark
sans