如何开启一台独立服务器 第二季 时间: 2022-03-11 23:16 分类: 运维笔记 # 前景提要 由于我的主力文件服务器提供商OneProvider突然通知要对原产品下架,只能进行更换。虽然价格在32刀左右比之前贵了一些,上行带宽似乎也不太高(SpeedTest测速300Mbps左右),但是提供了4T x 2的硬盘,还算满足需求。于是趁着这个机会,彻底把原系统的各种历史遗留问题解决。比如几乎房门大开级别的安全问题,比如缺少监控软件,比如下载客户端版本过低等等。 # 0. 开服务器 OP家的后台还是挺方便的。服务器系统选择自带镜像就行,现在也直接带好IPv6不用手动申请。唯一需要注意的就是**软RAID**的设置。这里参考MJJ的一篇:https://hostloc.com/thread-860199-1-1.html 。需要注意:(1)swap的大小设成物理内存等大(2)boot分区分10240M(3)主挂载点/以及boot的分区类型都要是**Primary** (4)顺序上boot分区可以放到最上面 # 1.SSH安全设置 > 这一部分主要参考 https://learnku.com/server/t/36120 以及 https://www.freebuf.com/articles/system/246994.html 默认命令带sudo ## 1.0 用户组和用户清理 先备份 ```bash cp /etc/passwd /etc/passwd.old ``` 然后开始 ```bash userdel sync userdel games userdel lp userdel news userdel uucp ``` 再清理下group ```bash cp /etc/group /etc/group.old groupdel adm groupdel lp groupdel news groupdel dip ``` 然后添加你的用户 ```bash useradd -m xxx passwd xxx ``` 给好sudo权限 ```bash chmod u+w /etc/sudoers vi /etc/sudoers ``` 找到`root`然后添加 ```bash xxx ALL=(ALL) ALL ``` 关闭写入权限 ```bash chmod u-w /etc/sudoers ``` 然后可以把默认账户删了 ```bash userdel ubuntu ``` 顺便可以`rm -rf /home/ubuntu` 重进新账户即可 重进默认是sh,先手动到`bash`或者就手到后面把`oh-my-zsh`配好 ## 1.1 SSH配置文件 (1)备份sshd配置文件 ```bash cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old ``` (2)修改端口 ```bash Port 10000 ``` (3)禁用Root登录 ```bash PermitRootLogin no ``` (4)禁用空密码 ```bash PermitEmptyPasswords no ``` (5)禁用X11转发(如需再开,远程桌面) ```bash X11Forwarding no ``` (6)关闭压缩算法(e.g. gzip) 反而拖慢速度且不安全 ```bash Compression no ``` (7)最大重试次数 ```bash MaxAuthTries 3 ``` (8)显示最后登录时间 ```bash PrintLastLog yes ``` (9)SSH白名单 ```bash AllowUsers xxx ``` (10)各种快捷登录的禁用 ```bash IgnoreRhosts yes IgnoreUserKnownHosts yes GSSAPIAuthentication no KerberosAuthentication no ``` (11)开启证书登录 ```bash PubkeyAuthentication no ``` (12)配置完成证书后,关闭密码登录 ```bash PasswordAuthentication no ``` (13)重启服务重新载入配置 ```bash service sshd restart ``` ## 1.2 fail2ban 软件 apt安装。 复制配置文件。 ```bash cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local ``` 编辑`/etc/fail2ban/jail.local`并找到`[sshd]`段启用:加入`enabled = true` 然后重启服务 ```bash service fail2ban restart ``` ## 1.3 生成私钥 ```bash ssh-keygen -t rsa ``` 可设置私钥密码(英文是`passphrase`不是`password`需要注意)。不设就直接回车。 好像这里需要`-m`备注下`user@hostname`不太确定。 然后默认就在`~/.ssh`生成`id_rsa`和`id_rsa.pub`两个文件 显然`.pub`就是公钥。 我们跑一下`chmod 600`把两个文件权限改了,不然会显示权限给多了不行。接下来把公钥改下名, ```bash mv id_rsa.pub authorized_keys ``` 然后可以再check下是不是权限`600` 完事之后把你私钥`id_rsa`下下来存好备份好,然后把两个原文件删了。 回去配置文件把证书登录打开,密码登录关了然后重启`sshd`。 # 2. Oh-my-zsh 先装zsh本体。 ```bash apt install zsh ``` 安装`oh-my-zsh` ```bash sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" ``` **重要**跑上面脚本装`oh-my-zsh`不要`sudo`,不然等于给`root`配的了。 再装`powerlevel10k`主题(最火主题) 官方有推荐字体可以给Shell客户端装一下: https://github.com/romkatv/powerlevel10k#meslo-nerd-font-patched-for-powerlevel10k 然后跑到`~/.oh-my-zsh/themes`去跑安装脚本(**注意:这里也不要**`sudo`) ```bash git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k ``` 在`.zshrc`里把主题改成`ZSH_THEME="powerlevel10k/powerlevel10k"` 重新登录会自动启动配置向导按提示配置即可。 推荐插件 ```bash plugins=(git extract z zsh-autosuggestions zsh-syntax-highlighting sudo thefuck python) ``` 其中`zsh-autosuggestions`需要: ```bash git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions ``` 而`zsh-syntax-highlighting`需要 ```bash git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting ``` `the fuck`需要 ```bash sudo apt update sudo apt install python3-dev python3-pip python3-setuptools pip3 install thefuck --user ``` # 3. Python 3.10 > 这里主要参考这篇 https://cloudbytes.dev/snippets/upgrade-python-to-latest-version-on-ubuntu-linux > > 需要注意:最好常用软件安装完之后再升级。否则下方(6)的问题很炸心态 Ubuntu2004自带`py3.8.10`,而撰稿时`apt`默认源最新版本截止于此。但希望能装个最新的`3.10`。 (1)添加自定义源 ```bash sudo add-apt-repository ppa:deadsnakes/ppa sudo apt update ``` (2) 直接装 ```bash sudo apt install python3.10 ``` (3) 设为默认使用版本 ```bash sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 2 ``` 注意,最后一个参数的数字越**大**优先级越高。 并测试是否设置成功 ```bash sudo update-alternatives --config python3 ``` (4) 卸载并重装pip否则报错 ```bash sudo apt remove --purge python3-apt sudo apt autoclean sudo apt install python3-apt sudo apt install python3.10-distutils curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py sudo python3.10 get-pip.py ``` (5) 解决venv报错 ```bash sudo apt install python3.10-venv ``` (6)解决依赖Python3的apt出错 按旧版新版改个名复制下 ```bash cd /usr/lib/python3/dist-packages/ sudo cp apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.cpython-36m-x86_64-linux-gnu.so ``` # 4.换时区 ```bash sudo timedatectl set-timezone Asia/Shanghai ``` # 5.各种优化 ## 5.1 安装BBR魔改 采用万能的星大脚本 ```bash sudo bash -c "$(wget --no-check-certificate -qO- https://github.com/Aniverse/TrCtrlProToc0l/raw/master/A)" ``` ## 5.2 配置文件修改 > 简单的 Copy & Paste. > > Source: https://post.smzdm.com/p/654616/ ### 5.2.1. 关闭记录读取时间优化IO 文件:`/etc/fstab` 修改`/`挂载点的`options`位置参数(默认可能是`default`)为`noatime,errors=remount-ro` ### 5.2.2. 参数优化(主要是网络) 文件:`/etc/sysctl.conf` 前面基本都是注释掉的,所以直接在结尾添加即可。 其中第一行`vm.swappiness`是虚拟内存使用优先级。调尽可能低即可。 ```bash vm.swappiness = 1 fs.file-max = 2000000 fs.nr_open = 2000000 kernel.pid_max = 4194303 kernel.sched_migration_cost_ns = 5000000 kernel.sched_autogroup_enabled = 0 net.ipv4.tcp_slow_start_after_idle = 0 net.ipv4.tcp_no_metrics_save = 0 net.ipv4.tcp_abort_on_overflow = 0 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_tw_reuse = 1 vm.dirty_background_ratio = 20 vm.dirty_ratio = 30 net.ipv4.tcp_rfc1337 = 1 net.ipv4.tcp_sack = 1 net.ipv4.tcp_fack = 1 net.ipv4.tcp_workaround_signed_windws = 1 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_orphan_retries = 2 net.ipv4.tcp_retries2 = 8 net.ipv4.ip_local_port_range = 1024 65535 net.core.netdev_max_backlog = 3240000 net.core.somaxconn = 50000 net.ipv4.tcp_max_tw_buckets = 1440000 net.ipv4.tcp_max_syn_backlog = 3240000 net.ipv4.tcp_mtu_probing = 1 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 10 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.ip_no_pmtu_disc = 0 net.core.rmem_default = 16777216 net.core.wmem_default = 16777216 net.core.optmem_max = 16777216 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_fastopen = 3 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.ipv4.tcp_adv_win_scale = 2 ``` 注意保留结尾空行 ### 5.2.3. 增加最大同时打开文件数 文件:`/etc/security/limits.conf` 参数: ```bash * soft nofile 2000000 * hard nofile 2000000 root soft nofile 2000000 root hard nofile 2000000 ``` # 6. Nginx 默认apt安装即可。 > 安全配置参考 https://segmentfault.com/a/1190000038460984 比如:`server_tokens off` 以及`client_body_buffer_size 1k` `client_header_buffer_size 1k` `large_client_header_buffers 2 1k` 接下来是SSL配置 首先禁用旧协议。 ```bash ssl_protocols TLSv1.2 TLSv1.3; ``` 然后配置自签名证书。之所以自签名是因为CF帮我们挂好证书了所以只负责本地加个密就完事了。 ```bash openssl req -newkey rsa:2048 -nodes -sha512 -x509 -days 365 -keyout key.pem -out cert.pem ``` 选择`2048`长度是综合考虑性能的结果。更高长度性能降低很多。 这个命令生成一对key和cert。放到合适目录然后直接在虚拟主机设置里开启即可(最好先`chown`到root)。 首先做一下http的全局跳转(cf后台调也行,我双保险一下) ```bash server { listen 80; listen [::]:80 default_server; root /var/www; return 301 https://$host$request_uri; } ``` 然后是ssl配置 ```bash listen 443 ssl; listen [::]:443 ssl; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; ``` 需要注意,直接在`listen`后面加`ssl`就可以了,不用和之前一样多个`ssl on`之类的了,否则启动有`warn`。 # 7.ufw Ubuntu防火墙,已自带无需额外安装。 ## 7.1 通过自定义应用添加规则 (1) 规则文件位于` /etc/ufw/applications.d/` (2) 文件名格式任意不影响调用 (3) 同一文件内可以放多条规则。注意换行即可。 (4) 基本格式如下 ```ini [my_app] title = “Title for app” description = “Description for app” ports=15000/tcp|8080/tcp|9090/udp ``` `/`分割端口协议 `|`分割不同端口 可通过`:`提示多个连续端口,如`1001:1010`。注意**不是**`-`,且后面要加上协议如`/tcp` 可通过`,`提示多个非连续端口,如`1001,1111`。后面要加上协议如`/tcp` (5) 检查应用列表和规则详情 ```bash sudo ufw app list sudo ufw app info my_app ``` (6) 启用规则(规则名是文件里`方括号`中的文字) ```bash sudo ufw allow "my_app" ``` ## 7.2 默认规则 ```bash sudo ufw default deny incoming sudo ufw default allow outgoing ``` ## 7.3 常用命令 (1)查看状态 ```bash sudo ufw status ``` (2)启用停用**一定把SSH规则弄好了再搞不然寄** ```bash sudo ufw enable sudo ufw disable ``` (3)开启日志 ```bash sudo ufw logging on ``` (4)特定`允许`、`禁用`及`删除`规则 ```bash sudo ufw allow / sudo ufw deny / sudo ufw delete deny / ``` (5)按网段或IP允许(`from`和`to`决定方向) ```bash sudo ufw allow from 111.111.111.111 sudo ufw allow from 192.168.1.0/24 ``` (6)允许特定IP到特定端口并指定协议 ```bash sudo ufw allow from to port proto ``` 如 ```bash sudo ufw allow from 192.168.0.2 to any port 443 proto tcp ``` (7)利用规则号管理 查看: ```bash sudo ufw status numbered ``` 删除 ```bash sudo ufw delete 1 ``` 插入 ```bash sudo ufw insert 1 allow from ``` (8)规则顺序先特殊再一般 ```bash sudo ufw deny from 192.168.0.1 to any port 443 sudo ufw deny from 192.168.0.2 to any port 443 sudo ufw allow from 192.168.0.0/24 to any port 443 proto tcp ``` ## 7.4 禁止ping 修改`/etc/ufw/before.rules`中 ```bash # ok icmp codes -A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT -A ufw-before-input -p icmp --icmp-type source-quench -j ACCEPT -A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT -A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT -A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT ``` 的所有`ACCEPT`为`DROP` # 8. 远程桌面 > 参考 (1)https://tecadmin.net/install-vnc-server-on-ubuntu-20-04/ ([WebAchieve](https://web.archive.org/web/20220205202910/https://tecadmin.net/install-vnc-server-on-ubuntu-20-04/)) (2)https://lala.im/7188.html ([WebAchieve](https://web.archive.org/web/20211208022419/https://lala.im/7188.html "WebAchieve")) 其中关键点是更新target为桌面target ```bash sudo systemctl set-default graphical.target ``` ##TODO (1) 解决`VNCSERVER`的服务无法运行 (2) 解决端口转发问题 Ref. 1: https://github.com/novnc/noVNC/wiki/Proxying-with-nginx Ref. 2: https://www.nenew.net/nginx-configure-novnc-web-tutorial.html 标签: 无