自建Docker镜像加速服务 mirrors

使用docker compose部署,就俩文件配置好就可以用了

部署镜像仓库代理

(1)创建账号密码【可选】

配置账号密码:设置密码认证后,我们在进行拉取镜像时就需要先 docker login登入到我们的自建的代理镜像仓库,然后才可以拉取镜像

用Caddy搭建Docker加速服务

用Caddy搭建Docker加速服务, 不用跑docker什么的,直接用就可以了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

# Edit this domain to yours
DOMAIN="example.com"

cat << EOF > /etc/caddy/Caddyfile
hub.docker.${DOMAIN} {
  encode gzip
  reverse_proxy * https://registry-1.docker.io {
    header_up Host registry-1.docker.io
    header_up X-Real-IP {http.request.remote.host}
    header_up X-Forwarded-For {http.request.remote.host}
    header_up X-Forwarded-Port {http.request.port}
    header_up X-Forwarded-Proto {http.request.scheme}
    header_down Set-Cookie registry-1.docker.io docker.${DOMAIN}
    header_down Www-Authenticate "Bearer realm=\"https://auth.docker.${DOMAIN}/token\",service=\"registry.docker.io\""
    header_down Location "https://production.cloudflare.docker.com" "https://production.cloudflare.docker.${DOMAIN}"
  }
}

auth.docker.${DOMAIN} {
  encode gzip
  reverse_proxy * https://auth.docker.io {
    header_up Host auth.docker.io
    header_up X-Real-IP {http.request.remote.host}
    header_up X-Forwarded-For {http.request.remote.host}
    header_up X-Forwarded-Port {http.request.port}
    header_up X-Forwarded-Proto {http.request.scheme}
    header_down Set-Cookie auth.docker.io docker.${DOMAIN}
  }
}

production.cloudflare.docker.${DOMAIN} {
  encode gzip
  reverse_proxy * https://production.cloudflare.docker.com {
    header_up Host production.cloudflare.docker.com
    header_up X-Real-IP {http.request.remote.host}
    header_up X-Forwarded-For {http.request.remote.host}
    header_up X-Forwarded-Port {http.request.port}
    header_up X-Forwarded-Proto {http.request.scheme}
    header_down Set-Cookie production.cloudflare.docker.com docker.${DOMAIN}
  }
}

hub.quay.${DOMAIN} {
  encode gzip
  reverse_proxy * https://quay.io {
    header_up Host quay.io
    header_up X-Real-IP {http.request.remote.host}
    header_up X-Forwarded-For {http.request.remote.host}
    header_up X-Forwarded-Port {http.request.port}
    header_up X-Forwarded-Proto {http.request.scheme}
    header_down Set-Cookie quay.io quay.${DOMAIN}
    header_down Www-Authenticate "Bearer realm=\"https://hub.quay.${DOMAIN}/v2/auth\",service=\"quay.io\""
  }
}

hub.gcr.${DOMAIN} {
  encode gzip
  reverse_proxy * https://gcr.io {
    header_up Host gcr.io
    header_up X-Real-IP {http.request.remote.host}
    header_up X-Forwarded-For {http.request.remote.host}
    header_up X-Forwarded-Port {http.request.port}
    header_up X-Forwarded-Proto {http.request.scheme}
    header_down Set-Cookie k8s.gcr.io gcr.${DOMAIN}
    header_down Www-Authenticate "Bearer realm=\"https://hub.gcr.${DOMAIN}/v2/token\",service=\"gcr.io\""
  }
}

hub.k8s.${DOMAIN} {
  encode gzip
  reverse_proxy * https://k8s.gcr.io {
    header_up Host k8s.gcr.io
    header_up X-Real-IP {http.request.remote.host}
    header_up X-Forwarded-For {http.request.remote.host}
    header_up X-Forwarded-Port {http.request.port}
    header_up X-Forwarded-Proto {http.request.scheme}
    header_down Set-Cookie k8s.gcr.io gcr.${DOMAIN}
    header_down Www-Authenticate "Bearer realm=\"https://hub.k8s.${DOMAIN}/v2/token\",service=\"k8s.gcr.io\""
    header_down Location "https://storage.googleapis.com" "https://storage.googleapis.${DOMAIN}"
  }
}

storage.googleapis.${DOMAIN} {
  encode gzip
  reverse_proxy * https://storage.googleapis.com {
    header_up Host storage.googleapis.com
    header_up X-Real-IP {http.request.remote.host}
    header_up X-Forwarded-For {http.request.remote.host}
    header_up X-Forwarded-Port {http.request.port}
    header_up X-Forwarded-Proto {http.request.scheme}
    header_down Set-Cookie storage.googleapis.com storage.googleapis.${DOMAIN}
  }
}
EOF

systemctl restart caddy

禁用docker的ufw,禁止docker无视ufw规则

默认情况下,创建容器如果绑定了端口,则 docker 会自动修改 iptables 打开这个端口。然而 UFW 并不会显示这个规则,这就导致了不管使用 UFW 做什么限制,docker 绑定的这个端口都是开放的。

Openwrt 路由器安装哪吒监控Agent

最近想把路由器也接入nezha监控 于是乎研究下了下发现挺简单的

步骤如下

  1. 下载agent 可执行文件
  2. 编写init.d脚本设置开机启动

以下操作全部都在openwrt的ssh中执行

NaiveProxy 简易配置

20250719 更新增加一键安装脚本,支持一键安装和卸载

20250324 更新

naiveproxy不可以代理udp

(更新)一键安装/卸载/升级脚本

1
2
# 一键安装"
wget http://luodaoyi.com/naiveproxy-deploy.sh && sudo bash naiveproxy-deploy.sh --install

安装golang

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
sudo apt update
sudo apt install wget -y

# 获取最新版本
export GO_VER=$(curl -s https://go.dev/dl/?mode=json | jq -r '.[0].version')
echo $GO_VER

## 清空目录
rm -rf /usr/local/go && mkdir -p /usr/local/go

# amd机器
wget https://go.dev/dl/${GO_VER}.linux-amd64.tar.gz 
sudo tar -zxvf ${GO_VER}.linux-amd64.tar.gz -C /usr/local/

# 甲骨文之类的arm机器
wget https://go.dev/dl/${GO_VER}.linux-arm64.tar.gz
sudo tar -zxvf ${GO_VER}.linux-arm64.tar.gz -C /usr/local/

# 配置path
cat > /etc/profile.d/go.sh << \EOF
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH
EOF

source /etc/profile.d/go.sh

# 加入环境变量
cat >> ~/.bashrc << \EOF
export GOPATH=$HOME/.gopath
export PATH=$GOPATH/bin:$PATH
export GO111MODULE=on
#export GOPROXY=https://goproxy.cn
EOF

source ~/.bashrc && mkdir -p $GOPATH && echo $GOPATH

# 看看正常不
go version
go env

编译安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 开始编译
sudo apt-get install libnss3 debian-keyring debian-archive-keyring apt-transport-https

mkdir ~/src &&  cd ~/src/

# 用xcaddy构建
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest

# 开始构建
xcaddy build \
    --with github.com/caddyserver/forwardproxy@caddy2=github.com/klzgrad/forwardproxy@naive \
    --with github.com/caddy-dns/cloudflare@latest \
    --with github.com/caddy-dns/dnspod@latest \
    --with github.com/caddy-dns/alidns@latest 


sudo mv caddy /usr/bin/
caddy version
sudo setcap cap_net_bind_service=+ep /usr/bin/caddy  # 设置bind权限,可443

# 检查正常不
caddy version 

# 查看caddy已经安装的第三方模块
caddy list-modules --packages

配置服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 开始配置

mkdir -p /etc/caddy/ && touch /etc/caddy/Caddyfile

cat > /etc/caddy/Caddyfile << \EOF
{
    admin off
    order forward_proxy before reverse_proxy
}

:443, luodaoyi.com {
    tls [email protected] 
    request_body {
            max_size 1GB
    }
    forward_proxy {
            basic_auth asura asura123
            hide_ip
            hide_via
            probe_resistance
    }
    # 这里的端口是你反代的地址 随便你填 没的话填域名也可以
    # reverse_proxy www.bing.com
    reverse_proxy 127.0.0.1:33000
}

EOF

# 封装成服务 开机启动
groupadd --system caddy

useradd --system \
    --gid caddy \
    --create-home \
    --home-dir /var/lib/caddy \
    --shell /usr/sbin/nologin \
    --comment "Caddy web server" \
    caddy

cat > /etc/systemd/system/caddy.service << \EOF
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target


[Service]
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE


[Install]
WantedBy=multi-user.target
EOF


# 测试正常不正常
sudo systemctl daemon-reload && sudo systemctl enable caddy  
sudo systemctl start caddy  && sudo systemctl status caddy
 

检查指纹

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

 # 检查指纹
# 下载jarm
wget https://raw.githubusercontent.com/salesforce/jarm/master/jarm.py

# 查看网站jarm指纹 
python3 jarm.py 你的域名

# 网络空间资产搜索引擎:
# 打开网址 https://fofa.info  
# 搜索框输入:  jarm="xxxxx"
# 如果结果有几百万个 那就没问题了,要是几十个就有问题,说明有特征了,重新搞吧

c++ 调试输出简单封装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <windows.h>
#include <fmt/printf.h>
#include <string>
#include <type_traits>

template <typename CharType, typename... Args>
void GlobalOutputDebugString(const CharType* format, Args... args) {
    // 使用 fmt::sprintf 格式化字符串
    std::basic_string<CharType> formatted = fmt::sprintf(format, args...);

    // 根据字符类型调用相应的 OutputDebugString 函数
    if constexpr (std::is_same_v<CharType, char>) {
        OutputDebugStringA(formatted.c_str());
    } else if constexpr (std::is_same_v<CharType, wchar_t>) {
        OutputDebugStringW(formatted.c_str());
    }
}

// 这个宏将根据项目设置自动选择正确的字符类型。
// 如果项目设置为使用 Unicode 字符集,那么 _T 和 __FUNCTIONT__ 将解析为 L 和 __FUNCTIONW__。
// 如果项目设置为使用多字节字符集,那么 _T 和 __FUNCTIONT__ 将解析为无前缀和 __FUNCTION__。
#define LOG_DEBUG(format, ...) GlobalOutputDebugString(_T("[%d] ") __FUNCTIONT__ _T("(%d) ") format, GetCurrentThreadId(), __LINE__, ##__VA_ARGS__)

群晖dsm增加ddns提供商 (HE.net)

只需要在 /etc.defaults/ddns_provider.conf 文件中加入以下内容:

1
2
3
[HE_DDNS]
        modulepath=DynDNS
        queryurl=https://dyn.dns.he.net/nic/update?hostname=__HOSTNAME__&myip=__MYIP__

然后在DDNS配置中选择HE_DDNS,假设主机名是 abc.example.org ,在主机名和用户名都填写 abc.example.org , 密码处填写HE.NET中生成的TOKEN即可

mjj折腾常用脚本

1、DD重装脚本

史上最强脚本

1
wget --no-check-certificate -qO InstallNET.sh 'https://raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh' && chmod a+x InstallNET.sh && bash InstallNET.sh -debian 12 -pwd 'password'

萌咖大佬的脚本

1
bash <(wget --no-check-certificate -qO- 'https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh') -d 11 -v 64 -p 密码 -port 端口 -a -firmware

beta.gs大佬的脚本

1
wget --no-check-certificate -O NewReinstall.sh https://raw.githubusercontent.com/fcurrk/reinstall/master/NewReinstall.sh && chmod a+x NewReinstall.sh && bash NewReinstall.sh

DD windows(使用史上最强DD脚本)

1
bash <(curl -sSL https://raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh) -windows 10  -lang "cn"

账户:Administrator 密码:Teddysun.com 使用Windows徽标+R快捷键打开运行框,输入powershell运行,弹出powershell命名输入窗口,输入以下命令:

Android逆向 ARM汇编简介

Arm汇编简单介绍

控制指令

  1. 跳转指令: B(Branch) => 分支的意思
    • B 无条件跳转
    • BL 带链接的无条件跳转
    • BX 带状态切换的无条件跳转 根据目标地址最低位切换状态(arm/thumb)
    • BLX 带链接和状态切换的无条件跳转
    • B loc_地址
    • BEQ,BNE

存储器与寄存器交互数据指令 核心

  1. 存储器/寄存器: 内存,存储数据(小数据:寄存器,大数据:栈)
    • 内存: 都是为数据服务
  2. LDR/STR
    • LDR: 从存储器中加载数据到寄存器中 => LOAD
      • LDR R8,[R9,#4],R8为待加载数据的寄存器,加载值为 R9+0x4 所指向的存储单元, 伪代码 R8 = *(R9+4)
    • LDR: 将寄存器的火速据存储到存储区 => Store
      • STR R8,[R9,#4],将R8寄存器的数据存储到 R9+0x4指向的存储单元,伪代码: *(R9+4) = R8
  3. LDM/STM
    • LDM: 将存储器的数据加载到一个寄存器列表
      • LDM R0,{R1,R3},将R1指向的存储单元的数据一次加载到 R1,R2,R3寄存器
    • STM: 将一个寄存器列表的数据存储到指定的存储器
  4. PUSH/POP
    • PUSH: 将寄存器的值压入堆栈 压栈==>
    • POP 将堆栈值弹出到寄存器 出栈<==
  5. SWP: 将寄存器与存储器之间的数据进行交换
    • SWP R1,R1 [R0],将R1寄存器与R0指向的存储单元的内容进行交换
  6. 堆,队列:
    • 数据结构:
      • 栈是竖的,后进先出,且只能从栈顶一次填入数据

数据传输指令

MOV 将立即数或寄存器的数据传送到目标寄存器
MOV R0,#8 => R0 = 8

Android逆向 NDK开发总结

NDK开发总结

  1. Jni接口: java native interface
  2. 作用:用于java/c/c++ 代码之间的交互
  3. 使用方法:
    1. jni静态注册
      1. 在java代码中定义native修饰的方法;
      2. 根据java中native修饰的方法生成头文件(SRC路径执行javah -jni);
      3. 编写c/c++代码,导入头文件,同时实现头文件中的方法;
      4. 编写两个mk文件: Android.mk文件 Application.mk文件(头文件/代码文件和两个mk放入jni目录);
      5. 来带指定目录(jni所在路径),生成so文件;
    2. 动态注册
      1. 在java代码中定义native修饰的方法;
      2. 新建c/c++文件,导入jni.h头文件,编写c/c++文件 ,实现java层被native修饰的方法;
      3. 通过JNINativeMethod结构体绑定java和c/c++方法;
      4. 通过RegisterNatives方法注册java相应的类以及方法;
      5. 把c/c++注册方法写入到JNI_onload(两个参数),注意: JNI_onload是系统调用;
      6. 来到指定路径(jni所在路径),ndk_build生成so文件;
  4. 两种注册方法有区别的对比
    • 静态注册:
      1. 编写不方便,jni方法名字必须遵循规则且名字比较长;
      2. 运行效率不高;
    • 动态注册:
      1. 流程清晰可控;
      2. 运行效率高

Android逆向 Android Studio JNI 快速构建项目+动态注册+简易计算器

本文转发语NCK大佬的博客,并且自己跟着做了一遍 有一点点不同 大致上是大佬的文章:
https://www.cnblogs.com/fuhua/p/12725771.html

前面几篇文章演示的是比较原始的创建JNI项目的方法,旨在了解JNI项目构建原理!
但是构建项目效率很低,开发,调试都存在很大的效率低下问题。
本篇文章将演示利用Android Studio快速构建JNI项目。本篇文章要点