Linux系列(1)-yum,ssh,nginx,firewalld,systemd,fail2ban的基础配置

marvin

yum
新装的系统的 yum 源比较老, 这里需要进行更新, 下面是更新命令:
yum update -y
安装node.js, golang, neovim, nginx, git, zsh
为了能构建前端代码我们需要安装 node.js 环境, 另外我们还需要安装 golang 以支持 server 端的运行, 最后我们需要安装一个 neovim, 其用来替代当前的 vi, 是现代化的 vim, ngixn 是我们用于部署应用服务器软件, git 是代码版本管理工具, zsh 是用来替代 bash 的终端环境, 下面是分别安装它们的命令:
curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
yum install -y nodejs
npm install yarn -g
rpm --import https://mirror.go-repo.io/centos/RPM-GPG-KEY-GO-REPO
curl -s https://mirror.go-repo.io/centos/go-repo.repo | sudo tee /etc/yum.repos.d/go-repo.repo
yum install -y golang
yum install -y neovim
yum install -y nginx
yum install -y git
yum install -y zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
ssh
ssh 是一种登录协议, 方便我们通过密钥或者账号密码登录服务器, 第一次登陆服务器用的是账号密码登陆22端口,而几乎所有服务器的22端口都会被互联网上的扫描工具扫描并用密码暴力破解, 如果你查看sshd日志,会发现这点. 因此我们必须禁用密码登录使用 key 登录, 同时修改 sshd 的进程端口.
使用key登录服务器
输入以下命令:
ssh-copy-id root@serverIp
这里的 serverIp 指向你服务器的 ip 地址, 这样你本地的ssh key就会被添加到服务器上, 下次登录就不用输入密码了
修改端口禁用密码登录
接下来需要修改 sshd 的配置文件, 其路径是 /etc/ssh/sshd_config, 主要修改内容如下:
Port 27154
PasswordAuthentication no
ClientAliveInterval 60
这里通过指定 Port 27154 设置下一次 sshd 启动的时候的运行端口, 端口可以设置的范围是 1024-65535, PasswordAuthentication no 为关闭密码登录, 最后我们通过 ClientAliveInterval 指定服务器每隔60秒向客户发送一个包, 以保证连接长时间有效
有了以上配置之后我们还不能重启 ssh, 而是需要在配置防火墙之后再重启, 这样可以防止防火墙没配置好意外退出后不能登录的情况.
firewalld 防火墙
上面我们配置了 shhd 的端口为 27154, 但是我们仍然不能从外部环境连接到本服务器, 因为防火墙会阻止访问, 因此我们需要将这个端口的权限在防火墙中打开.
先看看我们当前在firewalld的哪个区域, 下面是查看区域的命令:
firewall-cmd --get-active-zones
结果应该显示在public这个区域, firewalld默认拥有一个public区域, 不同的区域有不同的配置, 也就有了不同的安全级别.
再看看当前区域有哪些服务和端口, 下面是查看 public 区域的服务列表的命令:
firewall-cmd --permanent --zone public --list-services
可以看到只有ssh和dhcpv6-client两个service
然后我们可以看哪些端口被上面的服务打开, 下面是查看 public 区域的端口列表的命令:
firewall-cmd --permanent --zone public --list-ports
可以看到当前区域中没有任何端口打开, 接下来通过添加端口命令将 27154 加到打开的端口:
firewall-cmd --permanent --add-port 27154/tcp
这里没有通过 —zone public 明确选择 public 这个区域, 因为它是当前默认, 所以就不用特意添加上. permanent 是持久化参数, 表示永久生效
最后我们需要重新加载防火墙, 使新的配置生效:
firewall-cmd --reload
防火墙配置完成, 现在我们可以重启 ssh 服务了, 下面是重启 sshd 的命令:
systemctl restart sshd
然后在登录的时候, 我们只需要在 ssh 命令后面添加 -p 参数指定 sshd 的端口即可, 语法格式如下:
ssh root@serverIp -p 27154
nginx 配置
默认情况下 nginx 并不会开机启动, 也不会自动启动, 我们需要通过 systemd 将它启动起来同时设置为开机启动, 命令如下:
systemctl enable nginx
systemctl start nginx
接下来运行以下命令查看 nginx 是否启动成功:
netstat -lnpt
如果看到 Address 为 80的 pid, 则表示 nginx 已经启动起来了, 接下来我们需要配置防火墙, 允许 80 端口访问
启动 http 服务
firewalld 默认提供了多种服务, 每一个服务对应到具体的配置, 要让外部环境访问我们的 nginx server 我们只需要打开其 http 服务即可, 下面是打开 http 服务的命令:
firewall-cmd --permanent --add-service http
为了确保 http 服务已经打开, 我们可以查看一下以下应用的状态, 下面是查看 http 服务状态的命令:
firewall-cmd --info-service http
如果有输出 http 字段则说明 http 服务已经启动成功了, 最后重启防火墙使设置生效:
firewall-cmd --reload
配置静态服务器
一般我们会通过 nginx 托管我们的一些静态资源, 例如 html 等文件, 以供外部通过浏览器访问, 这里需要设置的很简单, 我们只需要设置 nginx 的用户以及 root 目录和server name即可, 配置文件的路径为 /etc/nginx/nginx.conf 下面是主要配置修改的内容:
user root;
http {
# ...
server {
# ...
server_name www.baidu.com;
location / {
root /root/to/your/static/content/;
try_files $uri @fallback;
}
location @fallback {
root /root/to/your/static/content/;
rewrite .* /index.html break;
}
}
}
这里我们设置用户为当前用户root, 然后设置 server_name 为你的域名, 当访问服务器的时候, 这里会从 root 指定的目录中找文件, 如果找到则返回该文件, 如果没有找到, 则尝试 fallback 将 index.html 返回, 最后为了让配置生效我们需要通过 systemd 重启 nginx 服务器, 命令如下:
systemctl restart nginx
配置 fail2ban 防攻击
以上我们的服务器基本的环境已经配置完成了, 但是还有一个问题, 如果有人使用工具给我们的服务器发送大量的请求, 这些请求可能会导致服务器资源迅速被消耗, 所以我们需要一个策略用来限制访问者在某个时间段内能访问服务器多少次, 如果超过这个数量就封他的 ip 地址, 而 fail2ban 就是这样一个方便的工具.
首先我们需要安装 fail2ban, 下面是安装并配置开机启动的命令:
yum install -y fail2ban-firewalld
systemctl enable fail2ban
接下来我们需要在 nginx 配置文件中做出修改, 配置我们的请求策略:
http {
# ...
limit_req_zone $binary_remote_addr zone=lr_zone:10m rate=100r/m;
limit_req zone=lr_zone burst=100 nodelay;
}
这里第一行配置是说创建一个空间, 使用二进制的 ip 作为键, 名字叫 lr_zone, 大小是10MB, 限制每个ip访问的频率是每分钟100次. 此时客户端1分钟内发送100没事.但发送101个请求会导致100个返回成功, 1个返回失败.
第二行的意思是在 http 模块里使用第一行配置的空间, 然后给 burst 设置为100, 并且标记为 nodelay, 意思是说此时可以同时接收 rate + burst 个请求, 也就是200个.当来了200个请求的时候, 会直接处理200个, burst中的100个会每隔100/60秒处理一个, 每处理一个burst的位置就让出来一个
配置好了nginx,就可以配置fail2ban了, 其路径为 /etc/fail2ban/jail.conf, 主要修改内容如下:
[DEFAULT]
findtime = 60
maxretry = 1
bantime = 300
[nginx-limit-req]
enabled = true
findtime 指定为找60秒以内的日志, maxretry 为 1 表示找到 1 个就判定为成功, bantime 指定禁止时间为 300 秒. 然后通过 enabled 为 true 打开 nginx-limit-req, 这样就能检测 nginx 日志并执行任务, 最后需要启动 fail2ban, 命令如下:
systemctl start fail2ban
fail2ban-client status
fail2ban-client status nginx-limit-req
现在如果你1分钟访问服务器201次, 就会导致 nginx 输出 error 日志, 从而导致fail2ban 禁止你的 ip, 但是现在有个问题, fail2ban 调用的 firewallcmd-ipset 不会禁止已连接的连接, 为了解决这个问题, 可以使用 iptables-mutilport, 下面是安装:
yum install -y conntrack-tools
安装之后, 还需要配置一下, 路径为 /etc/fail2ban/action.d/firewallcmd-ipset.conf, 以下使主要修改内容:
actionban = ipset add fail2ban-<name> <ip> timeout <bantime> -exist
conntrack -D -s <ip> -p tcp --dport 80
conntrack -D -d <ip> -p tcp --sport 80
这里的含义是, 当禁止某个 ip 时, 先把它添加到 ipset 里使这个 ip 无法创建新连接, 然后执行 conntrack 命令删除这个 ip 已建立的连接, 这样就把这个 ip 完全禁止了. 最后我们需要重启 fail2ban 使配置生效:
systemctl restart fail2ban