×

linux学习笔记

wireguard安装与配置

dingpeng dingpeng 发表于2025-09-30 浏览10 评论0

#!/bin/bash
# wg-manager.sh - WireGuard 跨平台管理脚本 (使用 192.168.108.0/24 网段)

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 变量定义 - 修改为 192.168.108.0/24 网段
CONFIG_DIR="/etc/wireguard"
SERVER_CONFIG="$CONFIG_DIR/wg0.conf"
SERVER_PUBLIC_KEY="$CONFIG_DIR/server_public.key"
SERVER_PRIVATE_KEY="$CONFIG_DIR/server_private.key"
CLIENTS_DIR="$CONFIG_DIR/clients"
NETWORK="192.168.108.0/24"
SERVER_IP="192.168.108.1"
PORT="51820"

# 日志函数
log() {
    echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}

warn() {
    echo -e "${YELLOW}[警告]${NC} $1"
}

error() {
    echo -e "${RED}[错误]${NC} $1"
    exit 1
}

# 检测操作系统
detect_os() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS=$ID
        OS_VERSION=$VERSION_ID
    else
        OS=$(uname -s)
    fi
    log "检测到操作系统: $OS $OS_VERSION"
}

# 安装 WireGuard
install_wireguard() {
    log "开始安装 WireGuard..."
    
    case $OS in
        ubuntu|debian)
            sudo apt update || warn "apt update 失败,继续安装..."
            sudo apt install -y wireguard-tools resolvconf qrencode || {
                warn "仓库安装失败,尝试编译安装..."
                compile_install
            }
            ;;
        centos|rhel|fedora|rocky|almalinux|opencloudos)
            if command -v dnf >/dev/null 2>&1; then
                sudo dnf install -y wireguard-tools qrencode || {
                    sudo dnf install -y epel-release
                    sudo dnf install -y wireguard-tools qrencode
                }
            else
                sudo yum install -y wireguard-tools qrencode || {
                    sudo yum install -y epel-release
                    sudo yum install -y wireguard-tools qrencode
                }
            fi
            ;;
        *)
            warn "不支持的操作系统 $OS,尝试编译安装..."
            compile_install
            ;;
    esac
    
    # 验证安装
    if command -v wg >/dev/null 2>&1; then
        log "WireGuard 安装成功: $(wg --version)"
    else
        error "WireGuard 安装失败"
    fi
}

# 编译安装
compile_install() {
    log "开始编译安装 WireGuard..."
    
    # 安装编译依赖
    case $OS in
        ubuntu|debian)
            sudo apt install -y git build-essential libmnl-dev pkg-config
            ;;
        *)
            if command -v dnf >/dev/null 2>&1; then
                sudo dnf groupinstall -y "Development Tools"
                sudo dnf install -y git libmnl-devel pkgconfig gcc-c++
            elif command -v yum >/dev/null 2>&1; then
                sudo yum groupinstall -y "Development Tools"
                sudo yum install -y git libmnl-devel pkgconfig gcc-c++
            fi
            ;;
    esac
    
    # 编译安装 wireguard-tools
    cd /tmp
    rm -rf wireguard-tools
    git clone https://git.zx2c4.com/wireguard-tools
    cd wireguard-tools/src
    make
    sudo make install
    
    # 安装 qrencode(可选)
    if command -v apt >/dev/null 2>&1; then
        sudo apt install -y qrencode
    elif command -v dnf >/dev/null 2>&1; then
        sudo dnf install -y qrencode
    elif command -v yum >/dev/null 2>&1; then
        sudo yum install -y qrencode
    fi
}

# 启用 IP 转发
enable_ip_forward() {
    log "启用 IP 转发..."
    
    # 临时启用
    echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward >/dev/null
    
    # 永久启用
    if grep -q "net.ipv4.ip_forward" /etc/sysctl.conf; then
        sudo sed -i 's/^#*net.ipv4.ip_forward=.*/net.ipv4.ip_forward=1/' /etc/sysctl.conf
    else
        echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
    fi
    
    sudo sysctl -p >/dev/null 2>&1
    log "IP 转发已启用"
}

# 安全的文件操作函数
create_secure_file() {
    local file_path="$1"
    local content="$2"
    
    # 创建目录
    sudo mkdir -p "$(dirname "$file_path")"
    
    # 创建临时文件
    local temp_file=$(mktemp)
    echo "$content" > "$temp_file"
    
    # 复制并设置权限
    sudo cp "$temp_file" "$file_path"
    sudo chmod 600 "$file_path"
    sudo chown root:root "$file_path"
    
    # 清理临时文件
    rm -f "$temp_file"
}

# 生成随机客户端IP (192.168.108.2 - 192.168.108.254)
generate_client_ip() {
    local base_ip="192.168.108"
    local random_suffix=$(( RANDOM % 253 + 2 ))  # 2-254
    echo "${base_ip}.${random_suffix}"
}

# 初始化服务端
init_server() {
    log "初始化 WireGuard 服务端..."
    log "使用网段: $NETWORK"
    log "服务器IP: $SERVER_IP"
    
    sudo mkdir -p $CONFIG_DIR
    sudo mkdir -p $CLIENTS_DIR
    
    # 生成服务器密钥
    if [ ! -f "$SERVER_PRIVATE_KEY" ]; then
        log "生成服务器密钥对..."
        sudo wg genkey | sudo tee $SERVER_PRIVATE_KEY | sudo wg pubkey | sudo tee $SERVER_PUBLIC_KEY >/dev/null
        sudo chmod 600 $SERVER_PRIVATE_KEY $SERVER_PUBLIC_KEY
    fi
    
    # 获取默认网卡
    DEFAULT_IFACE=$(ip route | grep default | awk '{print $5}' | head -1)
    [ -z "$DEFAULT_IFACE" ] && DEFAULT_IFACE="eth0"
    
    # 创建服务端配置
    create_secure_file "$SERVER_CONFIG" "
[Interface]
PrivateKey = $(sudo cat $SERVER_PRIVATE_KEY)
Address = $SERVER_IP/24
ListenPort = $PORT
SaveConfig = false

# 流量转发规则
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o $DEFAULT_IFACE -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o $DEFAULT_IFACE -j MASQUERADE
"

    log "服务端配置已创建: $SERVER_CONFIG"
    log "服务器公钥: $(sudo cat $SERVER_PUBLIC_KEY)"
}

# 启动服务端
start_server() {
    log "启动 WireGuard 服务端..."
    
    sudo systemctl enable wg-quick@wg0
    if sudo systemctl is-active wg-quick@wg0 >/dev/null 2>&1; then
        sudo systemctl restart wg-quick@wg0
    else
        sudo systemctl start wg-quick@wg0
    fi
    
    sleep 2
    if sudo systemctl is-active wg-quick@wg0 >/dev/null 2>&1; then
        log "WireGuard 服务端启动成功"
    else
        error "WireGuard 服务端启动失败"
    fi
}

# 添加客户端
add_client() {
    local client_name=$1
    local client_ip=$2
    
    [ -z "$client_ip" ] && client_ip=$(generate_client_ip)
    
    log "添加客户端: $client_name (IP: $client_ip)"
    
    # 生成客户端密钥
    local client_private_key=$(wg genkey)
    local client_public_key=$(echo $client_private_key | wg pubkey)
    
    # 获取服务器公网IP(用于客户端配置)
    local server_public_ip=$(curl -s -4 ifconfig.me || curl -s -4 ipinfo.io/ip || echo "YOUR_SERVER_IP")
    
    # 创建客户端配置
    local client_config="$CLIENTS_DIR/$client_name.conf"
    local client_config_content="[Interface]
PrivateKey = $client_private_key
Address = $client_ip/24
DNS = 8.8.8.8

[Peer]
PublicKey = $(sudo cat $SERVER_PUBLIC_KEY)
Endpoint = $server_public_ip:$PORT
AllowedIPs = 192.168.108.0/24
PersistentKeepalive = 25"
    
    create_secure_file "$client_config" "$client_config_content"
    
    # 添加到服务端配置
    sudo wg set wg0 peer "$client_public_key" allowed-ips "$client_ip/32"
    
    # 保存到服务端配置文件中
    echo "
# Client: $client_name
[Peer]
PublicKey = $client_public_key
AllowedIPs = $client_ip/32" | sudo tee -a $SERVER_CONFIG > /dev/null

    # 生成二维码(如果安装了 qrencode)
    if command -v qrencode >/dev/null 2>&1; then
        sudo qrencode -t ansiutf8 < "$client_config"
        sudo qrencode -o "$CLIENTS_DIR/$client_name.png" < "$client_config"
        log "客户端二维码已生成: $CLIENTS_DIR/$client_name.png"
    fi
    
    log "客户端添加成功!"
    echo "=========================================="
    echo "客户端名称: $client_name"
    echo "客户端IP: $client_ip"
    echo "客户端公钥: $client_public_key"
    echo "配置文件: $client_config"
    echo "=========================================="
    
    # 显示客户端配置
    echo -e "\n客户端配置内容:"
    sudo cat "$client_config"
}

# 批量添加内网节点
add_internal_nodes() {
    log "开始批量添加内网节点..."
    log "使用网段: $NETWORK"
    
    local nodes=("node1" "node2" "node3" "node4")
    local start_ip=2  # 从 192.168.108.2 开始
    
    for i in "${!nodes[@]}"; do
        local client_name="${nodes[$i]}"
        local client_ip="192.168.108.$((start_ip + i))"
        log "添加节点: $client_name -> $client_ip"
        add_client "$client_name" "$client_ip"
        echo
    done
    
    log "内网节点批量添加完成"
    log "节点IP分配:"
    for i in "${!nodes[@]}"; do
        echo "  ${nodes[$i]} -> 192.168.108.$((start_ip + i))"
    done
}

# 显示状态
show_status() {
    log "WireGuard 状态:"
    sudo wg show
    
    echo -e "\n连接的客户端:"
    sudo wg show | grep -A5 "peer" | grep -E "peer:|allowed ips:" | sed 's/peer:/客户端:/;s/allowed ips:/IP地址:/'
    
    echo -e "\nVPN 网络信息:"
    echo "网段: $NETWORK"
    echo "服务器: $SERVER_IP"
    echo "端口: $PORT"
    
    echo -e "\n配置文件列表:"
    sudo ls -la $CLIENTS_DIR/ 2>/dev/null || warn "客户端配置目录不存在"
}

# 显示使用说明
show_usage() {
    echo -e "${BLUE}WireGuard 管理脚本 (网段: $NETWORK)${NC}"
    echo "用法: $0 [选项]"
    echo
    echo "选项:"
    echo "  install        安装 WireGuard 并启用 IP 转发"
    echo "  server         初始化并启动服务端"
    echo "  add-client <名称> [IP]  添加客户端"
    echo "  add-nodes      批量添加内网节点 (node1-node4)"
    echo "  status         显示状态"
    echo "  restart        重启服务"
    echo "  full-setup     完整安装配置(安装+服务端+内网节点)"
    echo
    echo "示例:"
    echo "  $0 install           # 安装 WireGuard"
    echo "  $0 full-setup        # 完整安装配置"
    echo "  $0 add-client mypc   # 添加客户端"
    echo "  $0 status            # 查看状态"
}

# 完整安装配置
full_setup() {
    log "开始完整安装配置 WireGuard..."
    log "VPN 网段: $NETWORK"
    detect_os
    install_wireguard
    enable_ip_forward
    init_server
    start_server
    add_internal_nodes
    show_status
    log "完整安装配置完成!"
    
    echo -e "\n${GREEN}下一步操作:${NC}"
    echo "1. 在云服务器安全组开放 $PORT UDP 端口"
    echo "2. 将客户端配置文件分发到对应节点"
    echo "3. 在客户端安装 WireGuard 并导入配置"
    echo "4. 使用 VPN IP 建立 Docker Swarm 集群"
    echo -e "\n${YELLOW}重要信息:${NC}"
    echo "服务器公钥: $(sudo cat $SERVER_PUBLIC_KEY)"
    echo "VPN 网段: $NETWORK"
    echo "服务器内网IP: $SERVER_IP"
}

# 主函数
main() {
    case $1 in
        install)
            detect_os
            install_wireguard
            enable_ip_forward
            ;;
        server)
            init_server
            start_server
            ;;
        add-client)
            if [ -z "$2" ]; then
                error "请提供客户端名称"
            fi
            add_client "$2" "$3"
            ;;
        add-nodes)
            add_internal_nodes
            ;;
        status)
            show_status
            ;;
        restart)
            sudo systemctl restart wg-quick@wg0
            log "服务已重启"
            ;;
        full-setup)
            full_setup
            ;;
        *)
            show_usage
            ;;
    esac
}

# 脚本入口
if [ $# -eq 0 ]; then
    show_usage
else
    main "$@"
fi

docker使用

批量生成docker容器配置模板,用于编排大批量的同类容器

dingpeng dingpeng 发表于2025-09-04 浏览31 评论0
###使用weget下载: wget https://dingpeng.cc/mkconfig.py
###使用curl下载: curl -O https://dingpeng.cc/mkconfig.py


def generate_docker_compose(prefix="fsu", terminal_prefix="jsxnj", count=8, output_file="docker-compose.yml"):
    """
    生成Docker Compose配置
    
    Args:
        prefix: 服务名称前缀(如:fsu)
        terminal_prefix: TERMINAL_ID前缀(如:jsxnj)
        count: 生成的服务数量
        output_file: 输出文件名
    """
   
    # 基础模板
    template = f'''version: '3.8'
networks: 
  fsunetwork:
    driver: bridge
    ipam:
      config:
        - subnet: 172.200.200.0/24
services:
'''
    # 为每个服务生成配置,image填写实际需要的镜像的名称
    #####注意:image名称中,\斜杠可能会识别成转义字符,可选择使用/斜杠,docker compose都可以识别
    for i in range(1, count + 1):
        service_name = f"{prefix}{i}"
        terminal_id = f"{terminal_prefix}{service_name}"
       
        service_config = f'''  {service_name}:
    image: fsuclient
    restart: no
    networks: 
      - fsunetwork
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/ppp
    environment:
      - TERMINAL_ID={terminal_id}
'''
        template += service_config
    # 写入文件
    with open(output_file, 'w') as f:
        f.write(template)
   
    print(f"已生成 {count} 个服务配置到 {output_file}")
    print(f"服务名称前缀: {prefix}")
    print(f"TERMINAL_ID前缀: {terminal_prefix}")
# 使用示例
if __name__ == "__main__":
    # 默认生成8个fsu服务,可用参数如下:
    # prefix: 服务名称前缀(如:fsu)
    # terminal_prefix: TERMINAL_ID前缀(如:jsxnj)
    # count: 生成的服务数量
    # output_file: 输出文件名
    generate_docker_compose()
   
    # 自定义示例:生成12个fsu服务,TERMINAL_ID前缀不变
    # generate_docker_compose(count=12

windows系统安装与使用

windows server backup备份副本无法删除的问题

dingpeng dingpeng 发表于2025-01-11 浏览215 评论0

磁盘中发现剩余空间很小,但是从文件查找中发现总文件量远没有这么多,经查询资料,VSS卷影复制时会单独创建一个副本文件,且文件不可访问,不可直接查看。

管理员模式进入CMD

输入:diskshadow   进入卷影复制服务 (VSS) 管理的工具

输入:list shadows all  展现本机电脑上所有的卷影副本

输入:delete shadows ?   可查看删除副本文件相关的功能说明,使用 delete shadows all 可删除所有的备份副本

工作常用笔记

常用sql语句记录

dingpeng dingpeng 发表于2025-01-10 浏览520 评论0

历史告警导出

Select 
OBJID as FSUID,
OBJNAME as FSU名称,
SUBOBJID as 设备ID,
ALARMLEVEL as 告警等级,
ALARMNAME as 告警名称,
DETAILINFO as 告警信息,
INSERTTIME as 告警开始时间,
CLEARSYSTEMTIME as 告警清除时间,
FAULTID as 工单号,
CLEARCAUSE as 告警清除方式,
STATIONID as 站址系统编码,
STATIONSTATUS as 站址状态,
MID as 信号量 
from 
itower.V_IF_PROV_ALARM_JSFGS 
WHERE 
CLEARSYSTEMTIME >= TO_DATE('2022-03-01 00:00:00','yyyy-MM-dd HH24:MI:ss') AND CLEARSYSTEMTIME < TO_DATE('2022-04-01 00:00:00','yyyy-MM-dd HH24:MI:ss')