[转载] iptables配置无SNAT转发所有流量,保留来源真实ip

iptables配置无SNAT转发所有流量,保留来源真实IP

前言

在网络架构中,我们经常需要通过中转机转发流量到后端服务器。传统方案通常使用 SNAT/MASQUERADE 来实现,但这会导致一个严重问题:后端服务器看到的来源IP全部变成了中转机的IP,丢失了真实客户端IP信息。

tinyfecVPN 全自动部署

这里提供一个“够用且可回滚”的 tinyfecVPN 一键部署脚本:自动安装依赖、拉取/更新源码(含 submodule)、编译 NOLIMIT(无限制)版本、安装二进制到 /usr/local/bin/tinyvpn,并生成/启用 systemd 服务(Server/Client 分开)。脚本全程交互式输入参数,直接写进 ExecStart,重启不丢;部署后默认删除源码目录(带路径保护),机器上只留下 tinyvpn + systemd unit。

利用iptables转发服务器流量

这里提供一个“够用且可回滚”的最小 iptables 转发脚本:安装时交互式输入转发目标 IP、需要排除的不转发端口(可多个),并选择入口网卡;其余 TCP/UDP/ICMP 流量统一 DNAT 到后端。由 systemd 托管,重启不丢;一键卸载,出错可干净撤回。

自建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