1. Nginx 简介

Nginx 是一个高性能、轻量级的 HTTP 服务器和反向代理服务器,常用于静态文件服务、负载均衡、反向代理、SSL/TLS 加密等场景。它支持高并发,具有模块化设计和灵活的配置。


2. 通过 Docker-Compose 启动 Nginx

version: '3.8'

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/logs:/var/log/nginx:rw
      - ./nginx/cert:/etc/nginx/cert:ro
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/conf.d:/etc/nginx/conf.d:rw
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s

3. Nginx 配置详解

主配置文件(nginx.conf)

# 全局配置
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # 日志配置
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;


    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    # 压缩与缓存
    gzip on;
    gzip_types text/plain application/json;

    # 包含子配置文件
    include /etc/nginx/conf.d/*.conf;
}

子配置文件(conf.d/*.conf)

http {
    server {
        listen 443 ssl;
            server_name _;
    }

    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
    }

    location / {
        proxy_pass http://backend;
    }
}
# Stream 转发(TCP/UDP)
stream {
    upstream db_backend {
        server db1.example.com:3306;
        server db2.example.com:3306;
    }

    server {
        listen 3306;
        proxy_pass db_backend;
    }
}

常见的HTTP模块配置

# 传递请求头和用户信息
proxy_set_header Host $host;  # 保留原始 Host 请求头
proxy_set_header X-Real-IP $remote_addr;  # 保留客户端真实 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 保留转发链
proxy_set_header X-Forwarded-Proto $scheme;  # 保留请求协议 (http/https)

# 支持 WebSocket 等长连接
proxy_http_version 1.1;  # 使用 HTTP/1.1 支持长连接
proxy_set_header Upgrade $http_upgrade;  # 支持 WebSocket 升级
proxy_set_header Connection "upgrade";  # 保持长连接

# 配置传递下划线 Header
underscores_in_headers on;  # 允许传递下划线头部

# 增加连接和读写超时 (HTTP CODE 504)
proxy_connect_timeout 120s;  # 设置连接超时
proxy_read_timeout 120s;     # 设置读取超时
proxy_send_timeout 120s;     # 设置发送超时

client_max_body_size 1m;  # 限制客户端请求体最大为 1MB (HTTP CODE 413)

# 增加缓冲区大小
proxy_buffer_size 128k;  # 设置初始缓冲区大小
proxy_buffers 4 256k;  # 设置缓冲区数量和大小
proxy_busy_buffers_size 256k;  # 设置繁忙时的缓冲区大小

动态限流

http {
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;
    server {
        location /api/ {
            limit_req zone=api_limit burst=10 nodelay;
            proxy_pass http://backend_service;
        }
    }
}

HTTP301/HTTPS配置示例

server {
    listen       80;
    server_name  _;
    server_tokens off; # 关闭版本信息返回
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    server_name example.com;

    # 指定 SSL 证书和密钥路径
    ssl_certificate     /etc/nginx/cert/example.crt;
    ssl_certificate_key /etc/nginx/cert/example.key;

    # SSL 会话和协议配置
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_protocols       TLSv1.2 TLSv1.3;

    # 加密套件和优先级配置
    ssl_ciphers         'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!aNULL:!MD5:!RC4';
    ssl_prefer_server_ciphers on;

    # 启用 HSTS(仅在 HTTPS 完全启用后使用)
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
}

在 Nginx 配置中,location 块用于定义 URL 路径和请求的匹配规则。以下是一些常见的 location 配置示例,包括重写、正则匹配和静态资源配置。

Location 配置示例

1. 基本重定向配置

# 将所有 http 请求重定向到 https
server {
    listen 80;
    server_name example.com;
    
    location / {
        return 301 https://$host$request_uri;
    }
}

用途:将所有 HTTP 请求重定向到 HTTPS。

2. 静态文件服务配置

server {
    listen 80;
    server_name example.com;

    # 为所有以 /static/ 开头的请求提供静态文件
    location /static/ {
        root /var/www/html;  # 静态文件目录
        try_files $uri $uri/ =404;  # 尝试查找文件,不存在返回 404
    }
}

用途:为特定路径(如 /static/)提供静态资源服务。

3. 正则匹配和动态路由

server {
    listen 80;
    server_name example.com;

    # 匹配以 /user/ 开头且后面跟着数字的请求
    location ~ ^/user/(\d+)$ {
        # 捕获正则匹配的数字并通过变量传递
        set $user_id $1;
        # 转发请求到后端服务器
        proxy_pass http://backend_servers/$user_id;
    }
}

用途:使用正则表达式匹配路径并将捕获的内容传递到后端。比如 /user/123 会被转发到 http://backend_servers/123

4. 禁止访问某些文件类型

server {
    listen 80;
    server_name example.com;

    # 禁止访问 .bak 文件
    location ~* \.bak$ {
        deny all;  # 拒绝所有访问
    }
}

用途:禁止访问特定类型的文件,如 .bak 文件。

5. 静态文件 + 动态请求

server {
    listen 80;
    server_name example.com;

    # 提供静态文件
    location / {
        root /var/www/html;
        try_files $uri $uri/ /index.html;  # 尝试找到文件,找不到时返回 index.html
    }

    # 处理 PHP 请求(假设 Nginx 已配置 PHP-FPM)
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
        include fastcgi_params;
    }
}

用途:同时提供静态文件服务和处理动态请求(如 PHP)。

6. 使用正则匹配重写 URL

server {
    listen 80;
    server_name example.com;

    # 将 /product/123 重写为 /product?id=123
    location ~ ^/product/(\d+)$ {
        rewrite ^/product/(\d+)$ /product?id=$1 last;
    }
}

用途:使用正则表达式匹配 URL 并进行重写,将 /product/123 重写为 /product?id=123

7. 使用 try_files 优雅处理 404

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        try_files $uri $uri/ /index.php?$query_string;  # 尝试静态文件,如果不存在则转到 PHP 处理
    }
}

用途try_files 用来优雅地处理文件不存在的情况,如果文件不存在,则转发给 PHP 或其他处理程序。

8. 根据请求类型返回不同响应

server {
    listen 80;
    server_name example.com;

    # 只允许 GET 和 POST 请求
    location /api/ {
        if ($request_method !~ ^(GET|POST)$) {
            return 405;  # 其他方法返回 405 Method Not Allowed
        }
    }
}

用途:根据请求方法返回不同的响应,例如只允许 GETPOST 请求。

9. 缓存配置

server {
    listen 80;
    server_name example.com;

    # 缓存图片文件
    location ~* \.(jpg|jpeg|png|gif|ico)$ {
        expires 30d;  # 设置缓存过期时间为 30 天
        add_header Cache-Control "public";
    }
}

用途:为特定类型的静态文件设置缓存头部,指定缓存时间。

10. 转发到不同的后端

server {
    listen 80;
    server_name example.com;

    # 转发到后端1
    location /api/v1/ {
        proxy_pass http://backend_v1;
    }

    # 转发到后端2
    location /api/v2/ {
        proxy_pass http://backend_v2;
    }
}

用途:根据路径前缀将请求转发到不同的后端服务器。


总结:

  • 静态资源location /static/ {} 用于服务静态文件。
  • 重写规则location ~ ^/old/ { rewrite /new; } 用于 URL 重写。
  • 正则匹配location ~ 用于路径的正则匹配和处理。
  • 请求过滤location /api/ { if ... } 用于限制请求类型或 IP。
  • 反向代理location /api/ { proxy_pass ... } 用于请求转发到后端服务器。

这些配置可以灵活地结合使用,以满足不同的请求路由、重定向、反向代理、缓存等需求。

常见 Linux 命令详细解释

以下是常见 Linux 命令及其参数的详细解释,按照使用频率排序,并附带了使用示例。

1. scp(安全复制)

scp(Secure Copy Protocol)用于在本地和远程主机之间进行加密传输文件。它基于 SSH 协议,因此数据传输过程中是安全的,适合在不安全的网络中传输敏感文件。

语法

scp [选项] 源文件 目标文件

常用选项

  • -r:递归复制整个目录。使用时,源文件应为目录。
  • -P:指定远程主机的端口号(注意是大写 P)。例如,远程主机使用 2222 端口时,使用 -P 2222
  • -i:指定用于身份验证的私钥文件。例如,-i /path/to/private_key
  • -v:启用详细模式,显示 SCP 执行过程的详细信息。
  • -C:启用压缩,在传输大量数据时有助于提高传输效率。
  • -q:启用静默模式,不显示任何输出。
  • -l:限制传输的带宽,单位为 Kbit/s。例如,-l 500 限制带宽为 500 Kbit/s。
  • -B:禁止启用密码验证,强制使用密钥认证。
  • -o:传递 SSH 配置选项,如 -o StrictHostKeyChecking=no 可以跳过 SSH 主机密钥检查。

示例

scp -v -P 2222 -l 500 -i ~/.ssh/id_rsa -r ./myfolder deployer@127.0.0.1:/data

使用 -l 选项限制传输带宽为 500 Kbit/s。

注意事项

  • 权限问题:如果目标路径的权限不足,可以通过 sudo 来提升权限,但是需要确保自己有远程 sudo 权限。
  • 密钥认证:使用 -i 选项时,确保私钥文件的权限是 600,否则 SSH 会拒绝使用该密钥进行连接。

2. sshpass(自动输入密码的 SSH)

sshpass -p "password" ssh -o StrictHostKeyChecking=no root@127.0.0.1 sh /data/custom.sh

使用 sshpass 自动输入密码,登录并执行远程脚本。


3. ssh(连接服务器/开启隧道-端口转发)

常用选项:

  • -L:本地端口转发。
  • -i:指定私钥文件。
ssh -L 0:3307:remote_ip:3306 user@host

通过 SSH 创建本地端口转发。


4. vim(文本编辑器)

vim 是 Linux 系统中功能强大的文本编辑器,广泛用于文件编辑、编程和系统管理。其分为三种模式:

  1. 普通模式:启动后默认进入普通模式,执行导航、删除、复制等操作。
  2. 插入模式:用于文本输入,按 i 进入,按 Esc 退出。
  3. 命令行模式:执行保存、退出、查找替换等命令,按 : 进入。

插入模式

  • i:在当前光标前插入。
  • a:在当前光标后插入。
  • o:在当前行下方新建一行并进入插入模式。

保存和退出

  • :w:保存文件。
  • :q:退出 Vim。
  • :wqZZ:保存并退出。
  • :q!:强制退出(不保存修改)。
  • :x:保存并退出(等价于 :wq)。

文本操作

  1. 复制、粘贴

    • yy:复制当前行。
    • nyy:复制当前行及其后 n 行。
    • p:在光标后粘贴。
    • P:在光标前粘贴。
  2. 删除

    • dd:删除当前行。
    • ndd:删除当前行及其后 n 行。
    • x:删除光标所在的字符。
  3. 撤销和重做

    • u:撤销上一步操作。
    • Ctrl + r:重做上一步撤销。
  4. 查找

    • /pattern:向下查找 pattern
    • ?pattern:向上查找 pattern
    • n:重复上一次查找(同方向)。
    • N:反向重复上一次查找。
  5. 替换

    • :%s/old/new/g:将文件中所有的 old 替换为 new
    • :n,m s/old/new/g:将第 n 到第 m 行的 old 替换为 new
    • :%s/old/new/gc:替换时逐个确认。

窗口操作

  1. 分屏

    • :split:sp:水平分屏。
    • :vsplit:vsp:垂直分屏。
    • Ctrl + w + w:在分屏间切换。
    • Ctrl + w + h/j/k/l:移动到左/下/上/右的窗口。
  2. 关闭窗口

    • :q:关闭当前窗口。
    • :only:关闭其他窗口,保留当前窗口。

代码编辑功能

  1. 缩进

    • >>:将当前行向右缩进。
    • <<:将当前行向左缩进。
    • n>>n<<:缩进当前行及其后 n 行。
  2. 高亮匹配括号

    将光标放在括号上,按 % 可跳转到匹配的括号。

  3. 代码折叠

    • zf:根据选定范围折叠。
    • zo:打开折叠。
    • zc:关闭折叠。

配置文件

Vim 的行为可以通过配置文件 .vimrc 进行定制。以下是一个简单示例:

set number          " 显示行号
syntax on           " 开启语法高亮
set tabstop=4       " 设置制表符宽度为 4 个空格
set expandtab       " 使用空格替代 Tab
set autoindent      " 自动缩进

高级用法

  1. 打开多个文件
vim file1 file2

使用 :n 切换到下一个文件,:prev 切换到上一个文件。

  1. 宏操作

    • q<register>:开始录制宏,<register> 可以是任意字母。
    • 执行一系列操作后,按 q 停止录制。
    • @<register>:执行宏。
    • n@<register>:重复执行宏 n 次。
  2. 多行注释

    • 选中多行:按 Ctrl + v 进入列模式,选择需要注释的行。
    • 插入注释符:按 Shift + i,输入注释符(如 #),然后按 Esc

示例

  1. 替换文件中的字符串
:%s/foo/bar/g

将文件中所有的 foo 替换为 bar

  1. 删除空行
:g/^$/d
  1. 批量修改代码缩进
:%!indent -kr

5. xargs(构建和执行命令行)

xargs 是一个用于构建并执行命令行的工具,通常结合管道使用。它从标准输入中读取数据(如文件列表、参数等),并将其转换为适合命令行的格式,接着执行指定的命令。

xargs [选项] [命令]
  • xargs 会从标准输入中读取数据并将其转化为命令行参数,然后执行指定的命令。

常用选项

  • -n:指定每次执行命令时使用的参数个数。

    例如,xargs -n 2 表示每次使用两个参数来执行命令。

  • -I:指定替换字符串。此选项允许你在命令中指定一个占位符(如 {}),并用输入数据替换该占位符。

    例如,xargs -I {} echo Hello, {} 会将标准输入的每一项替换 {},并执行命令 echo Hello, <item>

  • -d:指定输入分隔符。

    默认情况下,xargs 使用空白字符(空格、制表符、换行符)作为分隔符,使用 -d 可以指定其他字符作为输入分隔符。

  • -p:提示用户在执行每个命令前进行确认。

    例如,xargs -p rm 在执行每个 rm 命令之前都会要求用户确认。

  • -0:与 find 命令结合使用时,使用空字符(而不是换行符)作为分隔符,以正确处理文件名中包含空格和特殊字符的情况。

    例如,find . -name "*.txt" -print0 | xargs -0 rm 用于删除所有 .txt 文件,正确处理文件名中包含空格的情况。

示例

  1. 基本用法

    echo "file1 file2 file3" | xargs rm

    这个命令会删除 file1file2file3 文件。xargs 会将输入的数据(文件名)传递给 rm 命令。

  2. 使用 -n 每次传递指定数量的参数

    echo "file1 file2 file3 file4" | xargs -n 2 rm

    该命令每次将两个文件作为参数传递给 rm 命令,执行 rm file1 file2rm file3 file4

  3. 使用 -I 指定替换字符串

    echo "file1 file2 file3" | xargs -I {} mv {} /path/to/destination/

    该命令将每个文件移动到 /path/to/destination/ 目录中。{} 是占位符,表示每次传递给 mv 命令的文件名。

  4. find 命令结合使用

    find . -name "*.txt" | xargs rm

    find 命令查找当前目录及其子目录下所有 .txt 文件,并将它们传递给 xargs rm 命令进行删除。

  5. 处理包含空格的文件名(使用 -0

    find . -name "*.txt" -print0 | xargs -0 rm

    这个命令使用 -print0-0 选项,确保即使文件名中包含空格或其他特殊字符,xargs 仍能正确处理文件。


6. awk(文本处理工具)

awk 是一种强大的文本处理工具,特别擅长按行、按字段处理文本数据。awk 可以用于筛选、格式化、统计和生成报告等任务。

awk '条件 { 动作 }' 文件
  • 条件:指定处理文本的条件。
  • 动作:当条件满足时执行的操作,通常用于输出、修改或其他文本处理。

常用选项

  • -F:指定输入字段分隔符,默认情况下是空白字符(空格或制表符)。例如,awk -F ',' 用于处理以逗号为分隔符的 CSV 文件。
  • -v:定义变量,例如,awk -v var=value '...' 用于在 awk 脚本中传递外部变量。
  • print:打印指定的内容或字段。
  • NF:表示当前行的字段数。
  • $1, $2, ... $n:表示当前行的第 1、第 2、...、第 n 个字段。

示例

  1. 打印每一行的第一个字段

    echo "apple orange banana" | awk '{print $1}'
  2. 打印文件的第 1 和第 3 个字段

    awk '{print $1, $3}' file.txt
  3. 使用分隔符

    echo "apple,orange,banana" | awk -F ',' '{print $2}'
  4. 筛选满足条件的行

    awk '$2 > 50 {print $1, $2}' file.txt
  5. 计算总和

    awk '{sum += $1} END {print sum}' file.txt

    计算文件中所有第一列的数字之和。


7. grep(文本搜索)

常用选项:

  • -E:启用扩展正则表达式。
  • -r:递归搜索目录。
  • -i:忽略大小写。
  • -v:反向匹配,显示不匹配的行。
  • -l:只显示匹配的文件名。
grep -i "pattern" file.txt

8. sort(排序)

常用选项:

  • -n:按数字排序。
  • -r:逆序排序。
  • -u:去除重复的行。 也可使用uniq
sort -n file.txt

9. comm(比较文件)

用于比较两个排序过的文件,显示它们的共同部分和差异部分。

常用选项:

  • -1:不显示文件 1 中独有的部分。
  • -2:不显示文件 2 中独有的部分。
  • -3:不显示两个文件共有的部分。
comm file1.txt file2.txt

10. tr(字符转换)

常用选项:

  • -d:删除字符。
  • -s:压缩字符。
tr 'a-z' 'A-Z' # 将小写字母转换为大写字母
tr -s '[[:space:]]' '\n' # 根据空白字符分词
#[[:space:]]:一个 POSIX 字符类,匹配所有空白字符(如空格、制表符、换行符等)。

11. tar(打包与压缩)

常用选项:

  • -c:创建一个新的 tar 包。
  • -x:解包。
  • -v:显示处理过程。
  • -f:指定目标文件。
  • -z:通过 gzip 压缩或解压。
  • -j:通过 bzip2 压缩或解压。
tar -cvf 1101_log.tar 1101_log/*
tar -zxvf file.tar.gz

12. gzip(压缩)

gzip 是一个用于压缩单个文件的工具,会删除原始文件并生成 .gz 压缩文件

常用选项:

  • -d:解压文件
  • -r:递归压缩目录中的所有文件(每个文件单独生成 .gz 文件)
  • -v:显示压缩过程
gzip -d /tmp/test.gz

13. zipunzip(压缩和解压 .zip 文件)

zip:用于压缩文件和目录。

zip [选项] 压缩包 文件/目录

常用选项

  • -r:递归压缩
  • -m:不保留原文件
  • -v:显示过程
zip -r /tmp/test.zip /tmp/testdir

unzip:用于解压 .zip 文件。

常用选项**:

  • -d:指定解压目录
  • -v:显示解压过程
unzip /tmp/test.zip -d ./tmp/test

14. split(文件拆分)

用于将大文件拆分为小文件。

语法

split [选项] 文件 前缀

常用选项:

  • -a: 指定生成的小文件后缀的长度,默认为2
  • -b: 指定每个拆分文件的大小。单位可为 b(字节)、k(千字节)、m(兆字节)。
  • -d: 使用数字作为小文件的后缀,而不是字母,默认为字母
  • -l: 指定每个小文件的行数,默认为1000行
  • -n: 指定生成的小文件的数量,默认为2
  • --verbose: 显示拆分过程的详细信息
split -b 35m -d /path/to/bigfile bigfile_

bigfile 拆分为多个 35MB 的文件。


15. nohup(后台运行)**

挂起信号简介

挂起信号(SIGHUP, Signal Hang Up)是当用户注销或关闭终端时,系统发送给与该终端相关进程的信号。默认情况下,进程会因接收到挂起信号而终止。

nohup 命令会忽略挂起信号,使进程在终端关闭后仍然继续运行。

nohup 命令 [参数] &

常用选项

  • &:将命令放入后台运行,配合 nohup 使用。
  • nohup.out:如果未指定输出文件,命令的标准输出和错误输出会默认重定向到 nohup.out 文件中。
nohup python3 script.py > output.log 2>&1 &

16. ps(进程状态)**

ps 命令用于查看当前系统的进程信息,包括正在运行的程序及其状态。

常用选项**:

  • -e:显示所有进程(相当于 ps -A)。
  • -f:显示完整格式的信息,包括 UID、PPID、C、STIME 等。
  • -ef:组合选项,显示所有进程的详细信息。

- `a`:显示与终端相关的所有进程。
- `u`:以用户为中心的格式显示。
ps -u $(whoami) # 查看当前用户的进程
ps -ejH # 查看进程的层级关系(父子关系)

17. kill(终止进程)**

kill 命令用于向指定进程发送信号,常用于终止进程。

kill [选项] 进程ID

常用选项

  • -9(SIGKILL):强制终止进程,不会保存数据或进行清理操作。
  • -15(SIGTERM):默认信号,优雅地终止进程,允许进程进行清理工作后退出。
信号编号信号名称说明
1SIGHUP重新加载进程配置(常用于守护进程)。
2SIGINT中断进程(相当于 Ctrl+C)。
9SIGKILL强制终止进程。
15SIGTERM优雅地终止进程(默认)。
kill -15 1234 # 优雅地终止进程
kill -9 1234 # 发送 `SIGKILL` 信号强制终止进程 ID 为 `1234` 的进程。
ps -ef | grep python | awk '{print $2}' | xargs kill -9 # 查找运行的 Python 进程并强制终止。

18. tcpdump(抓包)

用于网络数据包的捕获和分析。可以使用Wireshark图形化分析抓包文件。

tcpdump [选项] [表达式]

常用选项:

  • -i:指定网络接口。
  • -w:将输出保存到文件。
  • -nn:禁用域名解析。
  • -v:显示详细输出。
  • -s0:捕获完整的数据包。
tcpdump -w tcpdump.pcap -i docker0 # 在 `docker0` 网络接口上抓取数据包,并将其保存到 `tcpdump.pcap` 文件中。
tcpdump -i en0 host 127.0.0.1 -nnv -s0 -c 50 # 捕获到 `127.0.0.1` 主机的 50 个数据包,并显示详细信息。

19. top(实时进程监控)

top 命令用于实时显示系统的进程信息,包括每个进程的 CPU 和内存使用情况,帮助用户了解系统资源的分配情况。

常用选项

  • -u:显示某个用户的进程。
  • -p:监控特定的进程ID。
  • -d:设置更新频率(秒)。
  • -n:指定更新次数。

快捷键操作(在 top 命令运行时,你可以使用以下快捷键操作):

  • P:按 CPU 使用率排序进程。
  • M:按内存使用率排序进程。
  • T:按时间/累计时间排序进程。
  • q:退出 top 命令。
  • h:显示 top 的帮助信息。
  • k:终止(kill)一个进程,输入进程的 PID。
  • r:改变进程的优先级(即调整 nice 值)。
  • u:只显示某个用户的进程。
  • n:设置刷新间隔时间(默认是 3 秒)。
  • c:切换显示命令行或程序名称。

20. uptime(系统运行时间)

uptime 命令显示系统的运行时间、当前时间、登录用户数量以及负载信息,是系统管理员常用的查看系统健康状况的工具。

21. w(查看当前登录用户和系统活动)

w 命令用于显示当前系统登录用户的信息以及他们正在执行的活动。它可以提供有关每个用户的详细信息,如登录时间、正在运行的进程、终端等

22. sync(同步磁盘)

sync 命令用于将文件系统的缓存数据写入磁盘,确保数据的持久性。该命令常用于系统关闭前,或者需要手动同步的场景。
sync; echo 3 > /proc/sys/vm/drop_caches # 同步缓存并清空缓存,包括 swap 空间。

25. du(磁盘使用情况)

du 命令用于显示文件和目录的磁盘使用情况,可以帮助用户查看目录或文件占用的磁盘空间。

du [选项] [文件/目录]

常用选项

  • -h:以易读的格式显示(例如 KB、MB)。
  • -s:显示总计,即只显示目录的总大小。
  • -a:显示所有文件和目录的使用情况。
  • --max-depth=N:只显示到指定深度的目录信息。
du -sh /home/user/
du -ah # 显示当前目录及其所有子目录和文件的磁盘使用情况。
du -h --max-depth=2 /home/user/ # 显示目录的前两级使用情况

26. df(文件系统磁盘空间)

df 命令用于查看文件系统的磁盘空间使用情况,帮助了解磁盘空间的分配与使用情况。

常用选项**:

  • -h:以易读格式显示(例如 KB、MB)。
  • -T:显示文件系统类型。
  • -a:包括所有文件系统(即使它们的使用空间为 0)。
  • -i:显示 inode 的使用情况(文件系统中的索引节点)。
df -hT # 除了显示空间使用情况,还显示文件系统的类型(例如 ext4、xfs)。
df -hi # 显示所有文件系统的 inode 使用情况,帮助判断是否达到 inode 限制。

27. rpm(RPM 包管理器)

用于安装和管理 RPM 包。

常用选项:

  • -i:安装包。
  • -v:显示详细信息。
  • -h:显示安装进度。
rpm -ivh package.rpm # 安装名为 `package.rpm` 的软件包。

28. systemctl(系统控制)

用于管理系统服务。

常用选项:

  • status:查看服务状态。
  • start:启动服务。
  • stop:停止服务。
  • enable:设置服务开机自启动。
  • disable:禁用服务开机自启动。
systemctl start firewalld
systemctl stop firewalld
systemctl enable firewalld
systemctl disable firewalld

29. firewall-cmd(Firewalld 管理)

用于管理 firewalld 防火墙。

常用选项:

  • --get-active-zones:查看当前激活的防火墙区域。
  • --add-port:开放端口。
  • --remove-port:关闭端口。
  • --set-default-zone:设置默认区域。
  • --add-rich-rule:添加高级规则。
firewall-cmd --get-active-zones                           # 查看激活的域
firewall-cmd --get-default-zones                            # 查看默认的域
firewall-cmd --zone=public --list-ports              # 查看开放的端口
firewall-cmd --zone=public --list-rich-rules  # 查看添加的规则
firewall-cmd --zone=public --add-port=80/tcp --permanent # 开放 80 端口并设置为永久生效,
firewall-cmd --zone=trusted --remove-port=9201 # 关闭 9201 端口。

30. iptables(防火墙规则管理)

管理 IP 防火墙规则。

常用选项:

  • -I:插入新规则。
  • -D:删除规则。
  • -L:列出当前规则。
  • -p:指定协议。
  • --dport:指定目标端口。
iptables -I INPUT -s 10.150.3.11 -p tcp --dport 9201 -j ACCEPT
iptables -D INPUT -s 10.150.3.11 -p tcp --dport 9201 -j ACCEPT
#  -m multiport --dport 9201,8500,15672

Docker 使用手册

Docker 基础命令

镜像管理

查找镜像

docker search image_name
  • --filter / -f:按条件过滤(如 stars=100)。
  • --limit:限制返回结果数量。

拉取镜像

docker pull image_name:tag
  • --all-tags / -a:拉取镜像的所有标签。

查看本地镜像

docker images
  • --all / -a:列出所有镜像,包括中间层。
  • --digests:显示镜像摘要信息。
  • --filter / -f:按条件过滤。

删除镜像

docker rmi image_name:tag
  • --force / -f:强制删除。
  • docker image prune -a:删除未使用的镜像。

保存与加载镜像

docker save image_name:tag | gzip > image.tar.gz
gunzip -c image.tar.gz | docker load

查看镜像历史

docker history image_name:tag
  • --no-trunc:显示完整信息。
  • --quiet / -q:只显示层 ID。

根据容器提交镜像

docker commit -a "nathan" -m "create new img" <container_id> image_name:tag
  • -a:设置作者信息。
  • -m:描述信息。
  • --change / -c:对镜像进行配置更改。

重命名镜像

docker tag old-repo/myimage:tag new-repo/myimage:new-tag

容器管理

运行容器

docker run -it --entrypoint sh image_name:tag
  • -i:保持标准输入打开。
  • -t:分配伪终端。
  • --name:为容器命名。
  • -d:后台运行。
  • --rm:退出后自动删除。
  • -p:端口映射(如 8080:80)。
  • -v:挂载数据卷(如 /host/path:/container/path)。

查看容器日志

docker logs <container_id>
docker logs --since 10m container_id
  • -f:实时查看日志。
  • --tail:显示最新日志行数(如 100)。
  • --since:从指定时间开始显示日志(支持 10m1h、具体时间戳等)。
  • --until:设置日志显示结束时间。

查看容器状态

docker ps
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
  • -a / --all:列出所有容器。
  • -q:只显示容器 ID。
  • --filter / -f:按条件过滤。
  • --format:以指定格式显示容器信息,可用占位符包括:

    • {{.ID}}:容器 ID
    • {{.Names}}:容器名称
    • {{.Status}}:容器状态
    • {{.Ports}}:容器端口
  • --latest / -l:只显示最近创建的容器。
  • --size / -s:显示容器的文件大小。

删除容器

docker rm $(docker ps -aq)
  • -f / --force:强制删除。
  • -v:同时删除挂载的卷。

停止/启动/重启容器

docker stop/start/restart container_id
  • --time / -t:设置停止超时时间(默认 10 秒)。

检查容器信息

docker inspect container_id
docker inspect --format='{{.State.Running}}' container_id
  • 使用 --format 提取特定信息:

    • {{.State.Status}}:容器状态
    • {{.Config.Image}}:镜像名称

进入容器

docker exec -it container_id /bin/bash

网络管理

查看网络

docker network ls
  • --filter / -f:按条件过滤。

创建网络

docker network create my-network
  • --driver:指定网络驱动类型(如 bridgehost)。
  • --subnet:指定子网(如 192.168.1.0/24)。

指定网络运行容器

docker run --network my-network --name nginx -d nginx

删除网络

docker network rm network_name

查看详细信息

docker network inspect network_name

创建带驱动配置的网络

docker network create \
  --driver bridge \
  --subnet=192.168.1.0/24 \
  custom-network

删除未使用的网络

docker network prune

清理无用资源

清理未使用镜像和容器

docker image prune -a
docker system prune -a
  • -a:删除所有未使用资源。
  • --force / -f:跳过确认提示。

性能监控

查看资源使用情况

docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

查看容器进程

docker top container_id

查看系统事件

docker events

挂载管理

查看数据卷

docker volume ls
  • 列出使用中的数据docker volume ls --filter dangling=false

检查数据卷信息

docker volume inspect <volume_name>

删除数据卷

docker volume rm volume_name

清理未使用的卷

docker volume prune --force

系统信息

查看版本

docker version

查看系统信息

docker info

导出与导入

导出容器

docker export container_id > container.tar

导入容器

cat container.tar | docker import - new_image_name:tag

文件复制

从主机复制到容器

docker cp local_path container_id:container_path

从容器复制到主机

docker cp container_id:container_path local_path

登录与登出

登录 Docker 仓库

docker login
  • --username / -u:指定用户名。
  • --password / -p:指定密码(不推荐明文)。

登出 Docker 仓库

docker logout

Dockerfile 使用指南

1. 常用指令

基础设置

  • FROM:指定基础镜像,通常是第一行。

    FROM ubuntu:20.04
  • LABEL:添加元数据。

    LABEL maintainer="your-email@example.com" version="1.0"

文件与目录操作

  • WORKDIR:设置工作目录。

    WORKDIR /app
  • COPYADD:复制文件到镜像中。

    COPY . /app
    ADD http://example.com/file.tar.gz /app # 支持远程 URL 下载与解压
  • VOLUME:声明挂载点。

    VOLUME ["/data"]

软件安装与命令执行

  • RUN:执行命令安装依赖或配置环境。

    RUN apt-get update && apt-get install -y python3
  • USER:设置后续命令的执行用户。

    USER nonroot

容器启动行为

  • CMD:设置容器启动时的默认命令(可被 docker run 覆盖)。

    CMD ["python3", "app.py"]
  • ENTRYPOINT:设置不可覆盖的默认命令。

    ENTRYPOINT ["python3", "app.py"]
  • EXPOSE:声明容器监听的端口(仅文档作用)。

    EXPOSE 8080

2. 分阶段构建

分阶段构建用于优化镜像大小。以下是示例:

# 构建阶段
FROM node:16 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build

# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
  • 构建阶段中安装依赖和生成构建产物。
  • 运行阶段中仅包含运行所需的文件。

3. docker build 命令

docker build 用于根据 Dockerfile 构建镜像。

基本语法

docker build [OPTIONS] PATH

常用选项

  • -t:为镜像命名和标记版本。

    docker build -t myapp:1.0 .
  • -f:指定 Dockerfile 文件路径。

    docker build -f /path/to/Dockerfile .
  • --no-cache:禁用构建缓存,强制执行所有步骤。

    docker build --no-cache -t myapp .
  • --build-arg:传递构建时参数。

    docker build --build-arg VERSION=1.0 -t myapp .
    ARG VERSION
    ENV APP_VERSION=$VERSION
  • -q:仅返回镜像 ID,隐藏构建日志。

    docker build -q -t myapp .
  • --target:指定目标构建阶段,在多阶段构建中,仅构建指定阶段:

    docker build --target builder -t app-builder .
  • 导出缓存将构建缓存保存到目录:

    docker build --cache-to=type=local,dest=./cache .
  • 启用并行构建使用 --progress

    docker build --progress=plain .

示例

  • 构建镜像:

    docker build -t myapp .
  • 带参数构建:

    docker build --build-arg ENV=production -t myapp:prod .

4. 优化建议

  • 多阶段构建:减少最终镜像大小。
  • 缓存利用:将变化较小的命令置于 Dockerfile 顶部。
  • 精简基础镜像:选择 alpine 等轻量级镜像。
  • 合并 RUN 命令:减少镜像层数。

    RUN apt-get update && apt-get install -y python3 && apt-get clean

总结

通过合理使用 Dockerfile 指令及优化构建过程,可以高效生成体积小、性能优的镜像。docker build 提供了丰富的选项以支持复杂需求,结合分阶段构建,可满足不同场景的性能和管理需求。


Docker Compose 使用指南

常用命令

  1. 启动服务

    docker-compose up -d
    • -d:后台运行。
  2. 停止并移除服务

    docker-compose down
    • 默认会移除容器及相关网络,但不会删除卷。
    • 使用 --volumes 删除所有关联卷。
       docker-compose down --volumes
    • 使用 --remove-orphans 删除未定义的容器。

      docker-compose down --remove-orphans
  3. 查看状态

    docker-compose ps
  4. 指定配置文件启动

    docker-compose -f custom-compose.yml up -d
  5. 重启服务

    docker-compose restart
  6. 查看实时日志

    docker-compose logs -f
    • 可指定服务名查看:

      docker-compose logs -f service_name
  7. 清理无用卷

    docker volume prune

docker-compose.yaml 书写规范

结构

  1. 顶层字段

    • version:指定 Compose 文件版本。
    • services:定义服务。
    • volumes:定义数据卷。
    • networks:定义网络。
  2. 缩进:使用两个空格,保持层级清晰。

示例

version: "3.9"

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - web-data:/usr/share/nginx/html
    networks:
      - webnet

  app:
    build:
      context: ./app
    environment:
      - NODE_ENV=production
    depends_on:
      - db
    networks:
      - appnet

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - appnet

volumes:
  web-data:
  db-data:

networks:
  webnet:
  appnet:

网络配置

  1. 自定义网络

    networks:
      custom-network:
        name: my-custom-network
        driver: bridge
  2. 使用外部网络

    networks:
      existing-network:
        external: true
  3. 子网和网关

    networks:
      custom-network:
        driver: bridge
        ipam:
          config:
            - subnet: 192.168.1.0/24
              gateway: 192.168.1.1

卷配置

  1. 命名卷

    volumes:
      app-data:
  2. 挂载主机目录

    services:
      app:
        volumes:
          - /host/path:/container/path
  3. 驱动与选项

    volumes:
      my-volume:
        driver: local
        driver_opts:
          type: nfs
          o: addr=192.168.1.100,rw
          device: ":/path/to/dir"

Docker Compose 的 build 配置

build 配置支持更多高级功能,例如缓存、构建参数、挂载等。

完整配置示例

services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile.prod
      args:
        APP_ENV: "production"
      cache_from:
        - app-cache
      target: builder
      network: host
      extra_hosts:
        - "local.test:127.0.0.1"

字段说明

  • context:指定构建上下文目录(通常是包含 Dockerfile 的路径)。
  • dockerfile:自定义 Dockerfile 路径。
  • args:传递构建参数(在 Dockerfile 中使用 ARG 声明)。
  • cache_from:使用指定镜像作为构建缓存源,减少重复构建时间。
  • target:指定构建阶段的目标,仅构建多阶段镜像中的某一阶段。
  • network:设置构建时使用的网络模式(如 host)。
  • extra_hosts:在构建时定义额外的主机解析(类似 /etc/hosts)。

更多高级用法

  1. 挂载构建时的卷(Docker BuildKit 支持)

    • 用于在构建时临时挂载额外数据,例如私有依赖库。

      services:
      app:
        build:
          context: .
          dockerfile: Dockerfile
          secrets:
            - my_secret
      secrets:
      my_secret:
        file: ./secrets.txt
  2. 使用 BuildKit 的缓存挂载

    services:
      app:
        build:
          context: .
          dockerfile: Dockerfile
          cache_from:
            - type=local,src=./cache
          cache_to:
            - type=local,dest=./cache

实用技巧

  1. depends_on 限制

    • 定义依赖关系,但不会保证服务完全启动:

      depends_on:
        - db
  2. 扩展字段
    使用 x- 前缀定义共享配置:

    x-shared-config:
      environment:
        - LOG_LEVEL=debug
    
    services:
      service1:
        <<: *x-shared-config
        image: app1
    
      service2:
        <<: *x-shared-config
        image: app2
  3. 动态扩展配置
    配合环境变量使用:

    services:
      app:
        image: "${APP_IMAGE:-default-app}:latest"

综合示例

以下是一个完整的 Compose 配置文件示例:

version: "3.9"

services:
  frontend:
    image: nginx:alpine
    ports:
      - "8080:80"
    networks:
      - frontend-backend

  backend:
    build:
      context: ./backend
    environment:
      - APP_ENV=production
    depends_on:
      - db
    networks:
      - frontend-backend
      - backend-db

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend-db

volumes:
  db-data:

networks:
  frontend-backend:
  backend-db:

总结

通过合理配置 docker-compose.yaml 文件并利用 Compose 命令,可以轻松管理复杂的容器服务。配合网络和卷配置,能进一步优化服务间的交互与数据持久化。

4. 常用脚本示例

检查容器内文件

#!/bin/bash
if [ -z "$1" ]; then
  echo "请传入要搜索的文件名"
  exit 1
fi
RUNNING_CONTAINERS="$(docker ps --format '{{.Names}}')"
for CONTAINER in $RUNNING_CONTAINERS; do
  if docker exec -it $CONTAINER sh -c 'test -e $1'; then
    echo "Found $1 in container: $CONTAINER"
  fi
done

5. 常见问题与注意事项

  1. 镜像源加速配置
# apk镜像源加速
RUN echo "https://mirrors.aliyun.com/alpine/v3.18/main" > /etc/apk/repositories && \
    echo "https://mirrors.aliyun.com/alpine/v3.18/community" >> /etc/apk/repositories && \
    apk update --allow-untrusted && \
    apk add --allow-untrusted --clean-protected --no-cache bash && \
    rm -rf /var/cache/apk/*
# apt镜像源加速
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && apt-get update
  1. 删除未使用的镜像
comm -23 <(docker images --format "{{.Repository}}:{{.Tag}}" | sort) <(kubectl get pods --all-namespaces -o jsonpath="{..image}" | tr -s '[[:space:]]' '\n' | sort) | grep emotibot | grep -v infra | xargs docker rmi

背景介绍

目前,我正在使用两款VPN软件:Quantumult X (QX)MotionPro Plus (MPP)

  • Quantumult X(后续简称QX,类似于Clash/Stash等VPN软件)可以使用分流策略,对接VMESS、SS等其他协议,灵活地管理网络流量。
  • MotionPro Plus(后续简称MPP)是一种企业级VPN客户端,通过网关、用户名+密码+多因素认证(MFA),并使用TLS VPN协议,建立安全隧道以访问企业内网资源。

两款VPN均会在MacOS中配置虚拟网卡、DNS服务及路由表。然而,当两者同时启用时,会出现无法分别访问各自资源的问题。


问题描述

当前DNS配置

使用scutil命令检查系统DNS配置:

scutil --dns
命令解释scutil --dns 是MacOS下用于查看系统DNS解析器配置的命令。它显示当前网络环境中的DNS优先级、接口绑定和解析器列表。

输出结果如下:

DNS configuration

resolver #1
  nameserver[0] : 10.150.0.12
  nameserver[1] : 10.150.0.89
  nameserver[2] : 198.19.0.3
  if_index : 29 (utun6)
  flags    : Supplemental, Request A records
  reach    : 0x00000002 (Reachable)
  order    : 102000

可以看出,当前DNS优先级以MPP的DNS(10.150.0.12 和 10.150.0.89)为最高。这导致访问如Google等服务时,DNS解析通过MPP的网络,无法正常访问。

问题初步判断

DNS解析顺序由优先级决定。要实现两款VPN各自资源的正常访问,需要调整DNS优先级或为特定域名指定专用DNS服务器。


解决尝试及过程

1. 调整DNS优先级(不建议通过此步骤操作,建议通过MacOs系统设置搜索DNS进行相应设置)

通过networksetup命令,将QX的DNS(198.19.0.3)设置为主DNS:

sudo networksetup -setdnsservers Wi-Fi 198.19.0.3

命令解释

  • networksetup 是管理MacOS网络设置的工具。
  • -setdnsservers Wi-Fi 198.19.0.3 将Wi-Fi接口的DNS服务器设置为QX的DNS。

结果

  • QX的资源访问恢复正常。
  • MPP资源(如example.domain)因通过QX的DNS解析,返回fake-IP,无法访问。

2. 为特定域名绑定DNS服务器

在QX的[dns]模块中,为example.domain配置解析规则,指定其使用MPP的DNS服务器:

[dns]
server=/*.example.domain/10.150.0.12

使用dig命令验证域名解析结果:

dig example.domain
命令解释dig 是一个强大的DNS查询工具,用于检查域名的解析状态和结果。

结果

example.domain.    6    IN    A    198.18.5.73

返回结果为fake-IP(198.18.5.73),无法通过MPP的路由表访问资源。


3. 使用dns_exclusion_list排除Fake-IP

尝试将example.domain加入QX的dns_exclusion_list,希望通过系统默认的DNS解析:

[dns]
dns_exclusion_list=example.domain

再次查询域名:

dig example.domain

结果

;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN

NXDOMAIN 表明域名解析失败。

4. 还原dns_exclusion_list尝试使用Fake-IP + QX内部转发到10.内网IP

查看QX日志发现:

[QTXDomainResolver] Through special DNS server 10.150.0.12 for example.domain
[QTXDomainResolver] Begin A query for example.domain
[QTXDomainResolver] Send type A query packet for example.domain to 10.150.0.12
[QTXDomainResolver] End A query for example.domain  from server 10.150.0.12 no A record, takes 0.013070 seconds

分析:

  1. QX无法通过dns_exclusion_list解析到有效IP

    • 开启dns_exclusion_list后,域名不再经过QX的[dns]配置。
  2. QX降级解析失败的尝试

    • 配置[filter] example.domain reject:返回127.0.0.1,流量被阻断。
    • 配置[dns] server=/*.example.domain/127.0.0.1使其超时降级:未成功。
  3. QX无法正常访问内网DNS服务无法进行到下一步使用Fake-IP 通过QX内部转发到10.内网IP:

    • 即使明确指定内网DNS为[dns] server=/*.example.domain/10.150.0.12,QX依然无法解析有效记录。
    • 由于内网DNS(10.150.0.12)没有响应A记录,导致解析失败。

5. 最终解决方案:手动配置hosts

example.domain手动映射到内网IP地址,跳过DNS解析:

sudo nano /etc/hosts

添加以下内容:

10.250.0.xx example.domain
命令解释nano 是终端中的文本编辑器。/etc/hosts 文件用于手动配置域名到IP地址的映射。

结果

  • 成功访问MPP资源(example.domain)。
  • 两个VPN均能正常工作,分别访问其对应资源。

收获与总结

1. DNS与流量转发的关系

  • DNS解析:将域名解析为IP地址。
  • 路由表:根据解析得到的IP地址,通过相应网关转发流量。
  • VPN隧道:通过虚拟网卡和加密隧道实现安全的数据传输。

两者结合,实现流量分流和资源访问。

2. VPN运行机制

  • Quantumult X:基于分流策略,结合虚拟网卡、路由表和DNS模块,灵活管理流量。
  • MotionPro Plus:通过内网网关和TLS协议建立安全连接,适用于企业内部资源访问。

3. 解决中的关键问题

  • QX的dns_exclusion_list机制限制:不能直接通过QX的dns模块为特定域名指定非fake-IP解析。
  • QX对内网DNS的访问限制:导致内网资源解析失败。
  • 手动配置hosts文件:有效解决了DNS优先级冲突。

4. 额外尝试

  • 配置多种DNS降级机制,探讨其可行性。
  • 排查QX对内网DNS服务访问失败的具体原因。

未来优化方向

  1. 自定义的DNS解析工具?
  2. 探索QX为何无法正常访问内网IP的DNS服务,并优化其DNS降级策略。
  3. 研究通过动态脚本实现自动化域名解析分流,减少手动配置工作。
  4. 深入了解MacOS虚拟网卡的DNS解析机制,进一步优化VPN工具间的兼容性。

通过以上调整,成功解决了两款VPN冲突的问题,确保资源访问的稳定性和灵活性。如果您也面临类似问题,希望本文的解决思路对您有所帮助。


VPN 的基础介绍与软件特性

虚拟专用网络(VPN, Virtual Private Network) 是一种通过公用网络建立加密连接的技术,能够保护数据传输安全、隐藏真实IP地址、访问受限制资源等。根据功能和实现方式不同,VPN通常分为多种类型。以下是对本次使用的两款VPN软件的详细介绍:

1. Quantumult X (QX)

Quantumult X 是一款功能强大的网络代理工具,主要用于网络分流、隐私保护和协议对接。其核心特点包括:

  • 支持多种协议:如VMess、Shadowsocks(SS)、SOCKS5等。
  • 强大的分流策略:用户可基于域名、IP地址、地域等自定义规则,将流量分配到不同的代理或直接连接。
  • DNS设置与流量控制:提供精细化的DNS模块,可为特定域名绑定DNS服务器。
  • 适用场景:适合需要跨境访问的用户,也可用于复杂网络环境中的流量优化。

QX 的运行机制:

  • 在本地创建虚拟网卡,并结合路由表实现流量转发。
  • 通过DNS解析,将域名转换为IP地址后分配到相应的代理。

2. MotionPro Plus (MPP)

MotionPro Plus 是一款企业级VPN解决方案,专注于通过加密隧道实现安全远程访问。其特点包括:

  • 网关认证:通过网关、用户名+密码以及多因素认证(MFA)确保连接安全。
  • TLS协议支持:使用安全传输层协议(TLS)保护数据通信。
  • 专属内网资源访问:适用于访问特定内网服务(如公司文件系统或内部应用)。
  • 适用场景:企业员工远程办公或访问受限制的内部资源。

MPP 的运行机制:

  • 在本地配置虚拟网卡并启动加密隧道,与指定网关建立连接。
  • 通过专属DNS和路由表,将数据流量安全地导向内网资源。

两款VPN在本次实验中的区别

特性Quantumult X (QX)MotionPro Plus (MPP)
主要用途跨境访问和流量分流安全连接企业内网
协议支持VMess、Shadowsocks、SOCKS5等TLS VPN
认证方式无需专门认证,依赖代理配置用户名+密码+MFA认证
DNS配置优先级支持多DNS配置,并允许自定义优先级默认优先级高,专注于企业内部DNS解析
适用环境复杂网络环境、多代理需求场景企业内部资源访问及安全需求

VPN的实际应用场景

  • 跨境访问:通过QX快速访问全球受限资源,如国际网站、流媒体服务等。
  • 企业远程办公:利用MPP建立安全隧道,访问公司内部系统(如CRM、ERP等)。
  • 隐私保护:两款工具均具备隐匿IP地址和加密流量的功能,在公共Wi-Fi环境中尤为重要。

命令行工具诊断网络问题

1. 查看网卡配置

在 Linux 和 macOS 系统中,使用 ifconfig 命令可以查看当前网络接口的详细配置。网卡的 IP 地址、子网掩码以及接口的状态等信息都会显示在输出中。

ifconfig

输出示例:

utun6: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 4064
    options=6460<TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
    inet 198.19.0.1 --> 198.19.0.1 netmask 0xffffff00
utun9: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1400
    options=6460<TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
    inet 10.150.73.62 --> 10.150.73.62 netmask 0xfffffc00

从中可以看到每个网络接口的 IP 地址、网络掩码以及 MTU(最大传输单元)。这些信息对定位网络连接问题非常有帮助。

2. 查询路由表

路由表定义了数据包在网络中转发的路径。在某些情况下,网络连接问题可能是由于错误的路由配置引起的。通过 route 命令,可以查看到当前的路由配置。

查询特定目标地址的路由路径:

route -n get 10.150.0.12

输出示例:

route to: 10.150.0.12
destination: 10.150.0.0
       mask: 255.255.255.0
    gateway: 10.150.73.62
  interface: utun9
      flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
       0         0         0         0         0         0      1400         0 

查询默认路由:

route -n get default

输出示例:

route to: default
destination: default
       mask: default
  interface: utun6
      flags: <UP,DONE,CLONING,STATIC,GLOBAL>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
       0         0         0         0         0         0      4064         0 

从这些路由信息中,我们可以看到数据包会通过特定的网关和接口转发,能够帮助我们判断是否存在路由错误。

3. 路由追踪

traceroute 命令用于追踪数据包从本地计算机到达目标地址的路径。它可以帮助你分析网络中的延迟和瓶颈。

使用 traceroute 命令追踪目标地址的路由:

traceroute 10.150.50.107

输出示例:

traceroute to 10.150.50.107 (10.150.50.107), 200 hops max, 40 byte packets
 1  * * *

如果 traceroute 命令没有得到响应,可能是目标地址的防火墙阻止了 ICMP 数据包,或者网络中存在其他问题。

查询另外一个目标:

traceroute 10.150.0.12

输出示例:

traceroute to 10.150.0.12 (10.150.0.12), 200 hops max, 40 byte packets
 1  10.150.5.58 (10.150.5.58)  19.869 ms  16.813 ms  15.787 ms
 2  2.255.255.253 (2.255.255.253)  13.391 ms  15.780 ms  13.814 ms
 3  10.150.5.126 (10.150.5.126)  16.705 ms  15.134 ms  33.041 ms
 4  192.170.4.10 (192.170.4.10)  19.544 ms  21.756 ms  19.241 ms
 5  * *^X *

通过 traceroute 命令,可以清楚地看到从源主机到目标主机的数据包经过的各个节点(路由器)。如果有某一跳长时间没有响应,可以初步怀疑在该节点或之后的网络链路上存在问题。

4. DNS 服务查询

DNS 是将域名解析为 IP 地址的系统。当网络连接正常,但无法通过域名访问网站时,问题很可能出在 DNS 配置上。通过 scutil --dns 命令可以查看系统当前的 DNS 配置。

scutil --dns

输出示例:

DNS configuration

resolver #1
  nameserver[0] : 198.19.0.3
  if_index : 28 (utun9)
  flags    : Supplemental, Request A records
  reach    : 0x00000003 (Reachable,Transient Connection)
  order    : 101600

resolver #2
  nameserver[0] : 10.150.0.12
  nameserver[1] : 10.150.0.91
  nameserver[2] : 198.19.0.3
  if_index : 29 (utun6)
  flags    : Supplemental, Request A records
  reach    : 0x00000002 (Reachable)
  order    : 102000

输出中列出了所有配置的 DNS 服务器及其对应的接口信息。如果某个 DNS 服务器不可达,系统会自动尝试使用其他 DNS 服务器。通过查看这些信息,您可以确认当前 DNS 是否配置正确,是否存在 DNS 服务不可用的情况。

Mac 应用工具分类整理

本文整理了一系列常用的 Mac 应用程序,按照不同类别进行了分类,并标注了其主要作用及官方网站。


开发工具

应用名称主要作用官方网站
ApifoxAPI 文档管理、接口调试和测试工具Apifox 官网
PostmanAPI 开发与测试Postman 官网
IntelliJ IDEA CEJava IDEIntelliJ IDEA 官网
PyCharm CEPython IDEPyCharm 官网
DBeaver数据库管理工具DBeaver 官网
Sublime Text文本编辑器Sublime Text 官网
TyporaMarkdown 文档编辑器Typora 官网
VS Code轻量级代码编辑器VS Code 官网
Git版本控制工具Git 官网
SoapUIWeb 服务测试工具SoapUI 官网
SourcetreeGit 图形化管理工具Sourcetree 官网
JProfilerJava 性能分析工具JProfiler 官网
ZenTermLite轻量化终端工具无官方网站,基于社区开发。

网络与运维工具

应用名称主要作用官方网站
Docker容器化工具Docker 官网
SecureCRTSSH 远程连接SecureCRT 官网
Wireshark网络抓包工具Wireshark 官网
Apache JMeter性能测试工具JMeter 官网
TunnelblickVPN 客户端Tunnelblick 官网
Tabby终端模拟器Tabby 官网
SwitchHosts快速切换 Hosts 文件SwitchHosts 官网
FinalShellSSH 连接与管理工具FinalShell 官网
XmanagerWindows 系统下的图形化远程桌面管理Xmanager 官网

数据分析工具

应用名称主要作用官方网站
Navicat Premium数据库管理与开发Navicat 官网
Memory Analyzer (MAT)Java 堆分析工具MAT 官网
Offset Explorer 2Kafka 数据流监控Offset Explorer 官网

通信与远程协作

应用名称主要作用官方网站
TeamViewer远程桌面连接工具TeamViewer 官网
Zoom视频会议Zoom 官网
Microsoft Remote Desktop Beta微软远程桌面连接Microsoft 官网
ToDesk远程协作工具ToDesk 官网
Linphone开源 VoIP 通信工具Linphone 官网

浏览器与办公工具

应用名称主要作用官方网站
Google Chrome浏览器Chrome 官网
Microsoft Edge浏览器Edge 官网
Adobe Acrobat ReaderPDF 阅读器Adobe 官网
Microsoft Office办公套件(Word、Excel、PowerPoint)Office 官网
Anaconda Navigator数据科学与 Python 开发环境管理工具Anaconda 官网

文件管理与效率工具

应用名称主要作用官方网站
TransmitFTP 文件传输工具Transmit 官网
ClashX Pro网络代理客户端ClashX 官网
EasyConnect企业 VPN 工具EasyConnect 官网
Cursor提升工作效率的快捷工具Cursor 官网
Quantumult X网络代理与规则配置Quantumult 官网
V2rayU网络代理客户端V2rayU 官网
Maccy剪贴板管理工具Maccy 官网
Snipaste截图小工具(可钉在桌面)Snipaste 官网
uTools高效工具集插件平台uTools 官网
Draw.io绘图与流程图工具Draw.io 官网

说明: 以上分类及应用整理基于实际功能划分,帮助您快速找到所需工具。根据需求选择最适合的应用!