0%

教研室服务器维护

教研室要倒闭啦,师兄毕业跑路啦!

写在前面的话

不想用vim又不得不在linux下改东西,不要再用nano了,这有个micro, 拿好

安装:

1
cd /usr/bin; curl https://getmic.ro | sudo bash

或者用snap装,装好后开箱即用

安全问题

教研室的服务器之前就被黑过
老师兄装的Ubuntu,默认端口默认用户名超简单密码直接远程登录,行吧
教研室出现了断层,现在的师兄们(以及并夕夕40万却没用过Linux的师姐)Linux都还没我熟,行吧
服务器以后就扔给我了,行吧

之前折腾Docker的时候看日志发现一堆乱七八糟的

1
2
grep "Accepted password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more
grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more

发现一堆可疑ip几千次登录尝试,哇,又被当小鸡扫了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
3073 Failed
2593 112.85.42.185
2471 218.92.0.168
714 112.85.42.187
363 218.92.0.188
261 112.85.42.188
103 222.186.175.220
103 222.186.175.148
86 222.186.180.41
81 222.186.173.180
78 222.186.180.8
78 222.186.180.223
74 222.186.173.154
69 222.186.175.161
65 49.88.112.55
59 222.186.180.9
59 222.186.175.182
57 222.186.180.17
57 222.186.175.167
55 222.186.175.202
55 185.164.72.251
53 222.186.175.215
51 222.186.169.194

改一下密码和SSH端口

1
sed -i "s/Port .*/Port 你的端口/g" /etc/ssh/sshd_config

安装sshfilter或者flai2ban,这里我用的fail2ban。[1]

1
2
3
sudo apt install fail2ban
sudo cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

配置文件修改.local, 会像next.yml一样把.conf文件自动覆盖掉(直接修改那两个conf下次更新可能会覆盖掉)。

主要参数就是那个bantime和maxretry,这里我设成2小时和10次

然后启动

1
2
systemctl start fail2ban
systemctl enable fail2ban

其他操作

1
2
fail2ban-client set sshd addignoreip <IP> # IP白名单
fail2ban-client set sshd unbanip <IP> # 解封IP

还要配置一下防火墙
iptables很繁琐,不涉及太多配置的情况下可以用UFW

防火墙端口

端口用的时候要打开,不然会出各种烦人的问题,比如wget下载没开443就会443... failed: Connection refused.,如果你加了~–no-check-certificate`还是failed,那八成是防火墙的问题
查看端口开放状态

1
netstat -ntlp

或者

1
telnet ip port

Ubuntu里用ufw查看状态

1
sudo ufw status

查看指定端口的状态(没输出可能是没开)

1
netstat -ntlp|grep 443

打开443端口

1
2
3
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
service iptables save
service iptables restart

使用UFW, 直接

1
sudo ufw allow 443

用iptables打开指定端口, 一般开80,443,53,22,其他按需打开

可以安装这个来永久保存配置

1
sudo apt-get install iptables-persistent

Docker默认修改iptables规则

Docker不设置会默认修改iptables规则,将端口暴露在外面,导致端口映射在安全上并没有什么卵用,要设置一下一下,可以看这里
https://www.binss.me/blog/docker-pass-through-system-firewall/

HTTPs

申请SSL证书

1
sudo apt-get install ssl-cert

然后搞一个自己的域名,因为境内服务器要备案,此计划中道崩殂

运行sudo apt-get update报错

写在前面,我看到有的镜像源示例配置都是走的HTTPS,似乎没有必要
详见Why does APT not use HTTPS?
至于某Debian镜像源上说的什么安装apt-transport-https更是没有必要,画蛇添足

1
2
3
4
5
6
7
8
9
10
11
12
Get:1 http://mirrors.aliyun.com/ubuntu xenial InRelease [454 B]
Get:2 http://mirrors.aliyun.com/ubuntu xenial-updates InRelease [454 B]
Get:3 http://mirrors.aliyun.com/ubuntu xenial-backports InRelease [454 B]
Get:4 http://mirrors.aliyun.com/ubuntu xenial-security InRelease [454 B]
Err:1 http://mirrors.aliyun.com/ubuntu xenial InRelease
Clearsigned file isn't valid, got 'NOSPLIT' (does the network require authentication?)
Err:2 http://mirrors.aliyun.com/ubuntu xenial-updates InRelease
Clearsigned file isn't valid, got 'NOSPLIT' (does the network require authentication?)
Err:3 http://mirrors.aliyun.com/ubuntu xenial-backports InRelease
Clearsigned file isn't valid, got 'NOSPLIT' (does the network require authentication?)
Err:4 http://mirrors.aliyun.com/ubuntu xenial-security InRelease
Clearsigned file isn't valid, got 'NOSPLIT' (does the network require authentication?)

查了一下说是代理的问题,看了一下教研室的工作站竟然还有酸酸乳和bbr,一问师兄说是老板外出的时候想上学校网用这个,行吧

设置一下apt的代理

1
2
3
4
5
6
/etc/apt$ cat apt.conf

Acquire::http::proxy "http://<proxy>";
Acquire::https::proxy "https://<proxy>";
Acquire::ftp::proxy "ftp://<proxy>";
Acquire::socks::proxy "socks:<proxy>";

这里我切进目录没找到,发现有个apt.conf.d文件夹,是表示缺省的配置文件,删掉换成apt.conf
比如代理是1.2.3.4,端口1234
就改成Acquire::http::proxy "http://1.2.3.4:1234

改了一下发现不对,这边是服务端应该没开代理啊

把代理都删了

感觉可能DNS有问题,切到etc/resolv.conf看了一下

1
2
nameserver 202.112.14.21
nameserver 202.112.14.11

这个学校的DNS服务不行啊,别的都直通互联网,这个上不了谷歌不说,还经常不对外网提供解析服务
(能ping通,但是nslookup发现不对外网提供服务)
又看了一下工作站的DNS, 果然换过了
校园网暂时也没什么好的DNS,就先换了清华的
(那个DNS不是/etc/resolv.conf下的,要改/etc/resolvconf/resolv.conf.d下的base文件,第一个只是临时的DNS)

还要刷新一下DNS:sudo service networking restart

运行sudo apt-get upgrade又报了这个错Hash Sum mismatch

查了一下发现就是阿里云镜像源在教育网下的问题

算了,改镜像源吧,换了清华的

1
2
Err:1 https://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial InRelease
Failed to connect to mirrors.tuna.tsinghua.edu.cn port 443: Connection timed out

依然不行, 决定明天重装

1
E: Some index files failed to download. They have been ignored, or old ones used instead.

看了一下,工作站那台DNS是cat /etc/resolv.conf是127.0.0.1,是DNSmasq托管的,而服务器上的还是你电的DNS,决定改了。
工作站上应该是这样的

1
2
# /etc/network/interfaces
dns-nameservers 8.8.8.8

改了之后服务器的resolv.conf也是127.0.0.1
又上大清的网站看了一下,发现居然在维护

Picture

换成你电的,好了,收工

Picture

又报了Target Translations (main/i18n/Translation-en) is configured multiple times in, 查了一下是指定apt源冲突了,删掉一个就好了

查看配置

本来想用neofetch查看一下服务器的配置,结果apt装不了。
看了一下官方文档发现16.10要这样

Add PPA
sudo add-apt-repository ppa:dawidd0811/neofetch
Update repositories
sudo apt update
Install the package
sudo apt install neofetch
(安装neofetch还能下载编译,可能还快一点)

算了,好慢啊,直接用sudo dmidecode看吧,screenfetch也行
英特尔的e5 2630 v4,20核CPU,没显卡。这CPU平时居然没人用,空跑,居然还有公网ip,我仿佛发现了宝藏。不出意外就留给我挥(bei)霍(guo)了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                         ./+o+-       [email protected]
yyyyy- -yyyyyy+ OS: Ubuntu 16.04 xenial
://+//////-yyyyyyo Kernel: x86_64 Linux 4.12.14-041214-generic
.++ .:/++++++/-.+sss/` Uptime: 21h 36m
.:++o: /++++++++/:--:/- Packages: 718
o:+o+:++.`..```.-/oo+++++/ Shell: bash 4.3.48
.:+o:+o/. `+sssoo+/ WM: Not Found
.++/+:+oo+o:` /sssooo. CPU: Intel Xeon CPU E5-2630 v4 @ 3.1GHz
/+++//+:`oo+o /::--:. RAM: 1348MiB / 32074MiB
\+/+o+++`o++o ++////.
.++.o+++oo+:` /dddhhh.
.+.o+oo:. `oddhhhh+
\+.++o+o``-````.:ohdhhhhh+
`:o+++ `ohhhhhhhhyo++os:
.o:`.syhhhhhhh/.oo++o`
/osyyyyyyo++ooo+++/
````` +oo+++o\:
`oo++.

更新

发现不是镜像源的问题,是你电的镜像源没安排上https,这个服务器好像是证书的问题,https全都用不了,wget也不行。

滚动升级

不存在的,这又不是arch系,不要乱升,乱升级滚挂了是要背锅的
要升可以用

1
sudo do-release-upgrade

升完记得把apt源给换了
看到有安全更新,说

System restart required

reboot一下就行了

网络问题

很迷,有的地方很快,有的地方就几乎慢到断线。我的联通就经常ping不同。
据说老蔡师兄他那里也经常ping不通

Picture

测试了一下服务器的下载速度,50M/s

备份和恢复

师兄也没装什么东西,用的cp直接备份了点文件,一言不合重装系统。
先暂时用cp备份一次
挂载一下盘(比如挂到/mnt/mydata),用cp复制
(挂载看这里[3])

1
2
3
mount /dev/sdb7 /mnt
nohup cp -pdr /srv /mnt/mydata >> logs.out 2>&1 &
umount /dev/sdb7

这样将/srv目录下的文件全部拷贝到mydata下面.
文件很大,cp没有进度条,以后试试gcp之类的命令,先这样吧

看了一下,有接近300G的数据,用cp命令太慢了
用dd,把\srv目录底下的迁过去,整盘拷贝(dd命令不要乱用,一不小心就删库了)

拷贝完umount /mydata再拔

下次试试rsync同步,据说能断点续传和md5验证

使用教研室服务器下载

教研室的服务器有一个单独的猫和ip,网速绝大多数时候不低于50M/s,今天才发现比我的小破工位上的网速快不少。
以后下数据集和数据库文件之类的大东西就用它了!

使用Tmux

(其实MobaXterm有一个叫Multiexec的功能)
正在备份文件结果网断了(没办法,校园网就是这么…)
这时就要用tmux之类的工具了

1
sudo apt-get install tmux

图形界面

MobaXterm内嵌有Xserver,可以调出图形化窗口。
比如nedit,Emacs之类的
Picture
已经足够应付简单的图形化界面需求了
完整的桌面需求请直接VNC或teamviewer到工作站操作。

卸载遗留的Docker并重装

目前还报这样的错

1
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

似乎重装iptables的时候会直接把那个Docker的一部分依赖卸掉
(Docker好像还会直接修改默认的防火墙规则,emmmm)

更新,解决了,是网络问题,离线装就好了

教研室的阿里云

真的,有毒哇
Picture
是的,师兄跟我说没有apt。。。行吧

装一个

等等,不对劲,这是Centos啊

Picture

行吧…那没事了。师兄真的…我感觉我上了贼船

报备

按学校信息中心的要求,固定IP都需要申请报备,还有一堆乱七八糟的事

系统日志和杀毒

学校信息中心要求备份系统日志和杀软。
然而这Linux有什么装杀软的必要吗?防火墙就完事了。
行吧,交差还是要装模做样的应付一下

安装ClamAV:

1
sudo apt-get install clamav

直接扫描报错了,要升级病毒库sudo freshclam

1
2
LibClamAV Error: cli_loaddbdir(): No supported database files found in /var/lib/clamav
ERROR: Can't open file or directory

然后扫一下

1
clamscan -r --bell -i /

系统安装日志,不知道要交什么,索性把apt和dpkg的日志交了,在/var/log//var/log/apt/目录下面

端口报备

一般22,80,443,再加上几个常用的端口就够了
实在不行还有端口转发

看一下开了的端口

1
nc -znv 211.XXX.XXX.XXX 1-10000  2>&1 | grep succeeded

域名

暂时还没有,备案麻烦没弄

清理Trash

工作站桌面变得非常卡,clamscan扫描home目录也扫了整整两天,看了一下发现有前前任师兄几百个G的数据。使用rm之后跑到了.local文件夹下。使用跑路命令把它们删掉。(最好不要把 .local全删了,只删Trash就行了.local/share/Trash)

使用SmartDNS

今天SmartDNS 开源了,决定试试,安装看这里https://pymumu.github.io/smartdns/,Docker版本用这个[2]

看到有教程说Ubuntu还要设置一下

1
2
3
4
sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved
sudo vi /etc/resolv.conf
nameserver 127.0.0.1

选DNS参考这里https://blog.skk.moe/post/which-public-dns-to-use

其他

Gitlab占用过高的问题等见瞎折腾记录(其实没有特殊需求可以用Gogs,小声逼逼)
在服务器上部署jupyter参考搭建 ipython/jupyter notebook 服务器

远程开发

为什么要远程呢,因为我的电脑是小破i5,8G内存,装双系统不太行,虚拟机更不行。用wsl真的不如直接上服务器20核CPU、工作站两块1080pi(还有单独的网线和公网IP)。配合SSH端口转发和VSCode、JB全家桶,还是很舒服的。

python多版本管理

python的包管理是个很麻烦的事,坑不少,尤其是在大家都用的服务器上。(这上面有2.7,3.5,3.6和师兄炼丹装的conda3.7、3.6,不要问我为什么linux装conda,师兄干的)

我用自己的linux用户可以避开root用户底下一些混乱环境(比如conda)
主要的问题是切换python版本和python包管理,切换python版本一般用pyenv;包管理选择很多,一直没发现特别完美的工具。

pyenv

pyenv用来切换python版本,配合其他工具管理包

venv

python3官方的包管理工具

pipenv

一个类似Ruby的Bundler的东西
纯指定依赖,使用体验比上面那个好,有一点慢
(不推荐在win上用)

就跟npm差不多,和node_modules差不多的Pipfile(存放本地包),和npm的package-lock.json差不多的Pipfile.lock(版本锁)

Poetry

这个和上面那个很像,这几个工具在逼乎、v2ex以及外网等地有很多撕逼和纷争,此处不评价。

poetry还能用来打包

Docker&虚拟机

可以,一般没有必要,真机就挺好。
Docker的镜像有官方的python,但是非常大,上G。如果自己写Dockerfile构建一个,缩减镜像,调度每个容器的内存,都是远比前面那几个东西麻烦的事情。
Docker并不适合个人开发环境,直接跑真机它香吗。
Docker在调试的时候真的难受,不理解为什么会有人把它
虽然Docker本身并不吃你太多内存,但是Docker容器跑起来,如果不调度和限制,吃内存还是很猛的。

但是这么一配置,怎么比原来麻烦多了,Docker教徒吹嘘的部署方便这里在需要调试的时候并没有什么优势。

部署项目

python项目

这里以开源标注工具doccano为例(该项目提供了Docker镜像和直接部署的方法以及docker-compose示例文件,还给了aws等一键部署脚本)

我们clone下来,修改settings.py文件

最简单的方法就是直接用官方的镜像

这里用新建虚拟环境运行项目的方式

1
$ virtualenv venv --python=python3.6

一次被黑记录

1
2
3
4
5
CPU  [||||||||||||||||                 51.8%]   CPU -    51.8%  nice:     0.0%  ctx_sw:    8K   MEM -   21.7%  active:    5.31G   SWAP -    0.0%   LOAD    20-core
MEM [||||||| 21.7%] user: 51.3% irq: 0.0% inter: 5508 total: 31.3G inactive: 4.27G total: 976M
····
lo 0b 0b 999.5 0.0 2.34G 2.44M 2654 root 67h8:58 16 0 S ? ? ./cron
2020-01-15 16:17:54 CST

症状:昨天root上不去了,rsa密钥也挂了,以为是网的问题,今天一试还不行。用自己的另一个账号登了一下,发现su root居然permission denied了。怀疑是被黑了,一看系统占用,有挖矿程序在跑。看了一下系统日志,是13号被黑的,照着网上清了一遍。从此禁用密码登录(之前就想禁,师兄嫌麻烦)。MySQL也禁用密码改ssl

clamav再扫一遍

1
nohup clamscan -r /root 2 >> err.out &


  1. 1.使用 Fail2Ban 加固你的 Linux 服务器
  2. 2.smartdns的Docker镜像
  3. 3.细说linux挂载——mount,及其他……