新ubunut系统的一些操作

Author : zbzhen,        Modified : Tue Dec 3 20:51:02 2024

只是个人经验, 不能保证经验一定正确

1. 登陆

1.1. vim的用法

vim xxx.txt则会进入到xxx.txt文件

i会启动编辑模式

按键盘左上角Esc退出编辑模式

按组合快捷键Shift+Z+Z保存修改并退出

1.2. 密钥对

原理为把本地公钥的写入到服务器的~/.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模式

IP 查询 https://browserleaks.com/ip

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       # 停止服务

  1. 安装certbot
    sudo apt update
    sudo apt install certbot python3-certbot-nginx -y

  2. 生成证书
    certbot --nginx

    输入“certbot --nginx” →输入自己申请的邮箱→选择A→选择Y→选择要生成的域名,如果是多个域名的话,用分号或者空格分割; 后面是是否重定向https, 选2的话就是重定向https; 这样就生成了SSL证书了. SSL证书具体位置: /ect/letsencrypt/live

    需要注意的是执行了certbot --nginx之后, 会修改默认的nginx配置文件, 因此建议提前备份好配置文件

  3. 自动更新[下面代码似乎没什么用, 好像会自动更新]

    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
    
  4. 如果要添加新域名, 可以使用下面命令

    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

概念

 
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

8.2. 配置域名

8.3. 配置https

下面的两步只需执行一次

sudo a2enmod ssl #开启ssl模块
sudo a2ensite default-ssl #开启default-ssl站点
  1. 开启443端口
  2. 先购买免费的ssl证书, 并下载解压, 上传到/etc/apache2
  3. 修改/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>
    
  4. 最后重启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 .