新ubunut系统的一些操作
Author : zbzhen, Modified : Tue Dec 3 20:51:02 2024
只是个人经验, 不能保证经验一定正确
1. 登陆
-
更新资源
sudo apt-get update -
建立密钥对连接
-
禁用密码登陆
-
安全防护
-
前面几步具体参考 这里
-
创建子用户
useradd -m subroot su subroot cd /home/subroot mkdir .ssh cd .ssh
-
在
authorized_keys写入本地的文件~/.ssh/id_rsa.pub中的公钥信息可确保子用户能登陆. 具体做法为vim ~/.ssh/authorized_keys按i插入, 光标移动到最后, 空格, 粘贴
~/.ssh/id_rsa.pub中的公钥信息ssh-rsa AAAAB3N...., 然后Esc退出写入模式, Shift z z可保存退出 -
ubuntu20.04版本新申请的用户, 有个缺陷, 他会导致无法使用TAb键提示命令, 解决的方法是
sudo vim /etc/passwd修改最后一行的/home/subroot:/bin/sh为:/home/subroot:/bin/bash, 然后保存退出. 最后需要重启reboot生效
1.1. vim的用法
vim xxx.txt则会进入到xxx.txt文件
按i会启动编辑模式
按键盘左上角Esc退出编辑模式
按组合快捷键Shift+Z+Z保存修改并退出
1.2. 密钥对
原理为把本地公钥的写入到服务器的~/.ssh/authorized_keys中
-
本地公钥可以通过
本地终端输入ssh-keygen, 一路回车创建, 创建好了不要重复创建, 然后本地终端输入cat ~/.ssh/id_rsa.pub查看公钥 -
然后在服务器终端输入
mkdir ~/.ssh创建文件夹, 如果提示文件存在不要管它 -
最后
vim ~/.ssh/authorized_keys把本地公钥写入到服务器的~/.ssh/authorized_keys中即可
1.3. 禁用密码登陆
vim /etc/ssh/sshd_config
然后把
PasswordAuthentication yes
ChallengeResponseAuthentication yes
修改成
PasswordAuthentication no
ChallengeResponseAuthentication no
PasswordAuthentication no
ClientAliveInterval 120
ClientAliveCountMax 720
上面的120. 720 表示的作用可以确保一天之内ssh远程不会掉
修改后, 重启服务
sudo systemctl reload sshd
sudo systemctl restart sshd
自动断线重连配置
# vim /etc/ssh/sshd_config
ClientAliveInterval 120
ClientAliveCountMax 720
每2分钟发送依次心跳包, 720次后断开连接, 也就是会持续24小时
最后重启sshd服务,再打开新终端进行ssh连接就可以了,在24小时内不会出现连接超时。
# /etc/init.d/ssh restart
1.4. 一键创建子用户与代
下面的代码可以一键创建xxxx子用户, 并且把root下的公钥复制到xxxx子用户里
下面代码需要用root登陆远程服务器, 然后执行
useradd -m xxxx && mkdir /home/xxxx/.ssh && cp /root/.ssh/authorized_keys /home/xxxx/.ssh/authorized_keys && chown xxxx:xxxx /home/xxxx/.ssh/authorized_keys && chmod 600 /home/xxxx/.ssh/authorized_keys
也就是如果你的本地电脑可以ssh root@your_ip免密登陆到root, 那么执行上面代码之后就可以通过ssh xxxx@your_ip免密登陆到xxxx
删除用户:
sudo rm -r /home/xxxx sudo userdel -r xxxx
删除用户时需要谨慎,
xxxx为用户名
下面代码可以保存为.bat文件
@echo off taskkill /F /IM ssh.exe start ssh -CqTnNf -L 127.0.0.1:44444:your_ip:22 xxxx@your_ip start ssh -CqTnNf -D 127.0.0.1:1234 -p 44444 root@127.0.0.1
上面的第一行代码taskkill /F /IM ssh.exe是关闭win系统上已有的已有ssh进程
linux上可以用下面的代码关闭和查看已有的ssh进程
ps aux | grep ssh kill -9 $(ps aux | grep '[s]sh' | awk '{print $2}')
linux上所有代码为
kill -9 $(ps aux | grep '[s]sh' | awk '{print $2}') nohup ssh -CqTnNf -L 127.0.0.1:44444:your_ip:22 xxxx@your_ip & nohup ssh -CqTnNf -D 127.0.0.1:1234 -p 44444 root@127.0.0.1 &
如果要共享, 则上面最后一行代码需要修改为
start ssh -CqTnNf -D 0.0.0.0:1234 -p 44444 root@127.0.0.1
下面代码需要保存为.pac文件, 可用于实现苹果代
function FindProxyForURL(url, host) { return "SOCKS 192.168.0.1:1234"; }
其中192.168.0.1具体需要通过ipconfig(win系统)或者ifconfig(linux系统)查看
v2rayN 可让socks5变全局, 需要用管理员身份打开, 并且开启tun模式
1.4.1. linux 系统限制访问
# 允许来自192.168.0.1的IP访问1234端口
iptables -A INPUT -p tcp --dport 1234 -s 192.168.0.1 -j ACCEPT
# 然后拒绝所有其他来源对1234端口的访问(如果之前没有设置过全局的DROP或REJECT策略)
iptables -A INPUT -p tcp --dport 1234 -j DROP
1.4.2. win 系统限制访问
netsh 只允许局域网10.31.12.218 能访问 1234端口
netsh advfirewall firewall add rule name="Allow 1234 Port" dir=in action=allow protocol=TCP localport=1234 remoteip=10.31.12.218 netsh advfirewall firewall add rule name="Block 1234 Port" dir=in action=block protocol=TCP localport=1234
这样就会先添加一个允许特定IP地址访问1234端口的规则,然后再添加一个阻止所有其他IP地址访问1234端口的规则。这样就可以确保只有特定IP地址可以访问1234端口。
注意需要管理员权限
取消
netsh advfirewall firewall delete rule name="Allow 1234 Port" netsh advfirewall firewall delete rule name="Block 1234 Port"
2. 网络相关
root登录
wget --no-check-certificate -O /opt/bbr.sh https://github.com/teddysun/across/raw/master/bbr.sh
chmod 755 /opt/bbr.sh
/opt/bbr.sh
检查是否成功
sysctl net.ipv4.tcp_congestion_control
一般会出现bbr
3. 字体
感觉没什么大用
fc-list :lang=zh # 查看所有的中文字体 # 默认字体文件放在/usr/share/fonts/opentype/noto/目录中,可以从其他电脑拷贝字体库文件到该目录中; dpkg-reconfigure fontconfig fc-cache -vf
4. 常用命令
查看系统
df -h //查看硬盘信息
cat /proc/cpuinfo //查看cpu信息、型号
lspci |grep VGA //查看显卡型号
uname -a //查看系统内核
cat /etc/lsb-release //查看系统版本
free -m //查看内存
//// 清除内存buff/cache
sync;echo 1 > /proc/sys/vm/drop_caches;echo 2 > /proc/sys/vm/drop_caches;echo 3 > /proc/sys/vm/drop_caches
sync //将所有未写的系统缓冲区写到磁盘中
echo 1 > /proc/sys/vm/drop_caches //清除page cache
echo 2 > /proc/sys/vm/drop_caches //清除回收slab分配器中的对象
echo 3 > /proc/sys/vm/drop_caches //清除pagecache和slab分配器中的缓存对象。
5. docker的安装和使用(code-server为例)
安装
sudo apt install docker.io
下面的命令可使得非root能使用docker
sudo groupadd docker
sudo gpasswd -a ${USER} docker # 例如 sudo gpasswd -a zbzhen docker
sudo service docker restart
newgrp - docker
查看版本
docker version
例如使用code-server
# 拉取镜像 docker pull codercom/code-server:latest # 运行 docker run -it codercom/code-server:latest # 停止和删除所有的容器和镜像(用完之后, 可以执行该命令, 删除镜像, 以免影响速度和空间) docker stop $(docker ps -aq); docker rm $(docker ps -aq); docker rmi $(docker images -aq);
停止docker服务
systemctl stop docker.socket
systemctl stop docker.service
6. nginx搭建静态https服务
6.1. 搭建与配置
安装: sudo apt install nginx
重启 service nginx restart
在/etc/nginx/nginx.conf 添加
需要注意二级域名需要在域名里添加A记录
user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { ## # Basic Settings ## deny 27.0.232.181; ### deny 58.250.174.73; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL Settings ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Logging Settings ## #配置按天生成access.log日志文件 log_format main '$remote_addr $remote_user [$time_local] "$request" ' '"$http_host" $status $upstream_status ' '$body_bytes_sent "$http_referer" ' '"$http_cookie" "$http_x_forwarded_for" ' '"$upstream_addr" $request_time $upstream_response_time'; map $time_iso8601 $logdate { '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd; default 'date-not-found'; } #access_log /var/log/nginx/access.log main; access_log /var/log/nginx/access_$logdate.log main; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; limit_req_zone $binary_remote_addr zone=allips:10m rate=10r/s; server { listen 80; server_name na.kz16.top opt.kz16.top code.kz16.top www.kz16.top kz16.top geogebra.kz16.top; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name na.kz16.top; ssl_certificate /etc/letsencrypt/live/kz16.top/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/kz16.top/privkey.pem; # managed by Certbot error_page 404 500 502 503 504 = https://kz16.top; return 301 https://kz16.top/na/$request_uri; } server { listen 443 ssl; server_name geogebra.kz16.top; ssl_certificate /etc/letsencrypt/live/kz16.top/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/kz16.top/privkey.pem; # managed by Certbot error_page 404 500 502 503 504 = https://kz16.top; return 301 https://kz16.top/geogebra/$request_uri; } server { listen 443 ssl; server_name www.kz16.top; ssl_certificate /etc/letsencrypt/live/kz16.top/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/kz16.top/privkey.pem; # managed by Certbot error_page 404 500 502 503 504 = https://kz16.top; error_page 404 500 502 503 504 = https://kz16.top; return 301 https://kz16.top/$request_uri; } server { listen 443 ssl; server_name kz16.top; ssl_certificate /etc/letsencrypt/live/kz16.top/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/kz16.top/privkey.pem; # managed by Certbot # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot # ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot include /etc/nginx/firewall.conf; location / { root /var/www/html/; index index.html index.htm; } location ~ ^/geogebra/index.html$ { return 301 https://kz16.top/ggb; } location ~ ^/geogebra/ggbppt.html$ { return 301 https://kz16.top/ggb; } location ~ ^/geogebra/ggbpptReadMe.html$ { return 301 https://kz16.top/ggb/ggbpptReadMe.html; } } server { listen 443 ssl; server_name opt.kz16.top; ssl_certificate /etc/letsencrypt/live/kz16.top/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/kz16.top/privkey.pem; # managed by Certbot include /etc/nginx/firewall.conf; if ($http_user_agent ~* "360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|curl|wget|webZIP|qihoobot|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot") { return 403; } location / { proxy_pass http://127.0.0.1:8886; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; } } server { listen 443 ssl; server_name code.kz16.top; return 444; ssl_certificate /etc/letsencrypt/live/kz16.top/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/kz16.top/privkey.pem; # managed by Certbot auth_basic 'Restricted'; auth_basic_user_file /etc/nginx/password; if ($http_user_agent ~* "360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|curl|wget|webZIP|qihoobot|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot") { return 403; } location / { proxy_pass http://127.0.0.1:9999; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; limit_req zone=allips burst=5 nodelay; } # error_page 401 404 500 502 503 504 = https://kz16.top; } }
上的代码是需要放在http {}里面, 我这里是放在最后面
6.2. certbot安装ssl证书
下面的两步只需执行一次(似乎不需要, 如果没成功的话, 可以试试)
sudo a2enmod ssl #开启ssl模块 sudo a2ensite default-ssl #开启default-ssl站点 # 如果上面第一行代码报错, 则需要安装 apache2 sudo apt install apache2 # 安装 service apache2 stop # 停止服务
-
安装certbot
sudo apt update
sudo apt install certbot python3-certbot-nginx -y -
生成证书
certbot --nginx输入“certbot --nginx” →输入自己申请的邮箱→选择A→选择Y→选择要生成的域名,如果是多个域名的话,用分号或者空格分割; 后面是是否重定向https, 选2的话就是重定向https; 这样就生成了SSL证书了. SSL证书具体位置:
/ect/letsencrypt/live下需要注意的是执行了
certbot --nginx之后, 会修改默认的nginx配置文件, 因此建议提前备份好配置文件 -
自动更新[下面代码似乎没什么用, 好像会自动更新]
crontab -e # 第一次需要选择编辑器, 建议选2, 用vim作为编辑器, 然后按i开启写入模式, 粘贴下面代码, Esc退出写入模式, shift + z + z保存退出 # 如果编辑器选择错误, 可以 sudo select-editor 重选 # 下面代码可确保每月1号3时申请新证书 0 3 1 * * certbot renew --force-renew # 下面命令查看是自启动命令否修改成功 crontab -l # 重启crontab服务 sudo service cron restart -
如果要添加新域名, 可以使用下面命令
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
6.3. ip 限制
反正只是中文, 因此只限定国内用户, 需要借助
https://www.ip2location.com/free/visitor-blocker
6.4. 访问日志
默认情况下日志位于: /var/log/nginx
概念
- UV(Unique Visitor):独立访客,将每个独立上网电脑(以cookie为依据)视为一位访客,一天之内(00:00-24:00),访问您网站的访客数量。一天之内相同cookie的访问只被计算1次
- PV(Page View):访问量,即页面浏览量或者点击量,用户每次对网站的访问均被记录1次。用户对同一页面的多次访问,访问量值累计
统计独立IP:00:00-24:00内相同IP地址只被计算一次,做网站优化的朋友最关心这个
PV统计
awk '{print $6}' access.log | wc -l
UV统计
awk '{print $13}' access.log | sort -r |uniq -c |wc -l
独立IP统计
awk '{print $1}' access.log | sort -r |uniq -c | wc -l
ip访问次数排序
awk '{print $1}' access_2023-11-22.log.1 | sort | uniq -c | sort -nr |head -20 | more
配置日志按天生成
#配置按天生成access.log日志文件
log_format main '$remote_addr $remote_user [$time_local] "$request" '
'"$http_host" $status $upstream_status '
'$body_bytes_sent "$http_referer" '
'"$http_cookie" "$http_x_forwarded_for" '
'"$upstream_addr" $request_time $upstream_response_time';
map $time_iso8601 $logdate {
'~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
default 'date-not-found';
}
#access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/access-$logdate.log main;
error_log /var/log/nginx/error.log;
上面的配置代码需要修改文件夹的权限
chmod -R 777 /var/log/nginx/
参考: https://blog.csdn.net/weixin_45698637/article/details/128486012
6.5. 日志安全考虑
要在Ubuntu系统中每天凌晨1点准时执行任务,可以使用cron来实现。首先,打开终端,输入以下命令来编辑crontab文件:
crontab -e
然后,在文件中添加以下行:
# 0 3 1 * * certbot renew --force-renew # 用于自动更换证书
51 1 * * * grep "47.106\|\x0\|login.php\|icanhazip.com\|CONNECT\|.net\|OPTIONS" /var/log/nginx/access_$(date -d "yesterday" "+%Y-%m-%d").log | awk '{print $1}' | sort | uniq | awk '{print "deny", $1, ";"}' >> /etc/nginx/ban.conf
50 1 * * * grep "47.106\|\x0\|login.php\|icanhazip.com\|CONNECT\|.net\|OPTIONS" /var/log/nginx/access_$(date -d "yesterday" "+%Y-%m-%d").log.1 | awk '{print $1}' | sort | uniq | awk '{print "deny", $1, ";"}' >> /etc/nginx/ban.conf
55 1 * * * service nginx reload
# 重启crontab服务
# sudo service cron restart
这样就可以实现把那些想尝试暴力破解php的ip封禁掉
原理是昨天的日志信息中包含了特殊信息, 则会把ip登记到 /etc/nginx/ban.conf 文件里, 最后通过service nginx reload, 它就会把这些ip自动封禁
其中50 1 * * * 表示每天的凌晨1点50分会启动某个任务
其中55 1 * * * 55
7. iptables屏蔽ip1与ip2的所有端口访问
实测成功
要使用iptables屏蔽IP地址ip1和ip2的所有端口访问,你可以使用以下命令:
sudo iptables -A INPUT -s ip1 -j DROP sudo iptables -A INPUT -s ip2 -j DROP
要让iptables规则生效,你可以使用以下命令来保存当前的iptables规则:
sudo iptables-save > /etc/iptables/rules.v4
如果想要取消对IP地址ip1和ip2的禁用,可以使用以下命令删除对应的规则:
sudo iptables -D INPUT -s ip1 -j DROP sudo iptables -D INPUT -s ip2 -j DROP
写一个python脚本, 要求实现读取文件ban.conf中的所有ip,
然后通过iptables命令禁止这些ip访问任何端口
ban.conf的内容如下
deny 1.0.1.1;
deny 2.2.3.4;
python脚本为
import os with open("/etc/nginx/ban.conf", "r") as f: ips = [line.strip().split()[1] for line in f.readlines()] for ip in ips: os.system(f"iptables -A INPUT -s {ip} -j DROP")
8. apache2搭建https(可选)
8.1. 安装apache2
sudo apt-get update- 安装
sudo apt install apache2 - 重启
service apache2 restart - 停止
service apache2 stop - 部署网页内容: 只需修改
/var/www/html里的文件
8.2. 配置域名
- 开启80端口
- 在aliyun域名相关的页面中把ip地址与域名对接下
- 配置文件为
/etc/apache2/apache2.conf, 配置信息为<VirtualHost *:80> ServerName kz16.top DocumentRoot "/var/www/html/" <Directory "/var/www/html/"> AllowOverride all Order allow,deny Allow from all </Directory> Redirect /code kz16.top:8385 </VirtualHost> <VirtualHost *:80> ServerName na.kz16.top DocumentRoot "/var/www/html/na" <Directory "/var/www/html/na"> AllowOverride all Order allow,deny Allow from all </Directory> </VirtualHost>
8.3. 配置https
下面的两步只需执行一次
sudo a2enmod ssl #开启ssl模块
sudo a2ensite default-ssl #开启default-ssl站点
- 开启443端口
- 先购买免费的ssl证书, 并下载解压, 上传到
/etc/apache2中 - 修改
/etc/apache2/sites-available中的配置文件, 主要是配置文件的路径, 例如<VirtualHost _default_:443> ServerName na.kz16.top DocumentRoot /var/www/html/na ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/apache2/ssl_na/6444675_na.kz16.top_public.crt SSLCertificateKeyFile /etc/apache2/ssl_na/6444675_na.kz16.top.key SSLCertificateChainFile /etc/apache2/ssl_na/6444675_na.kz16.top_chain.crt <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> </VirtualHost>
- 最后重启
service apache2 restart
整个配置不会有任何难度
8.4. 自动跳转为https或http
http 跳转为 https, 页面代码为
<script type="text/javascript"> var loc = location.href.split(':'); if(loc[0]=='http'){ location.href='https:'+loc[1]; } </script>
https 跳转为 http, 页面代码为
<script type="text/javascript"> var loc = location.href.split(':'); if(loc[0]=='https'){ location.href='http:'+loc[1]; } </script>
9. 搭建code-server
具体参考这里
10. 常用安装命令(go,docker)
先执行
sudo apt update
然后执行
sudo apt install docker.io sudo apt install gccgo-go
11. node.js
11.1. node.js相关安装
sudo apt install node
查看版本node -v以及npm -v
npm install --registry=https://registry.npm.taobao.org
11.2. 安装nvm(Node Version Manager)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
安装完成后,重新加载shell配置文件
source ~/.nvm/nvm.sh
切换版本, 例如
nvm install 18
nvm use 18
验证安装
node -v
安装yarn
npm install -g yarn
yard --version
或者这样安装
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update && sudo apt install yarn
启动
yarn install && yarn build && yarn start
12. 小技巧
12.1. 文件树
sudo apt install tree
tree .