Postfix中转投递和收件简单方案

Postfix核心服务器设置

# -----------------------------
# 配置 Postfix 使用边缘服务器代理
# -----------------------------
echo "==> 配置 Postfix 使用边缘服务器代理发件"

# 登录到 MIAB,并设置 relayhost
sudo postconf -e "relayhost = [relay.example.com]:2525"
sudo postconf -e "smtp_use_tls = yes"
sudo postconf -e "smtp_tls_security_level = may"
sudo postfix reload

 

Postfix边缘服务器

#!/bin/bash

# -----------------------------
# Postfix 实际私网地址
MIAB_IP="10.0.0.2"
# -----------------------------

echo "==> 安装 Postfix 和相关邮件服务"

# 更新包列表并安装所需的软件
apt update
DEBIAN_FRONTEND=noninteractive apt install -y postfix

# 备份原配置
cp /etc/postfix/main.cf /etc/postfix/main.cf.bak.$(date +%s)

# -----------------------------
# 配置 Postfix 作为邮件代理
# -----------------------------
cat > /etc/postfix/main.cf <<EOF
myhostname = relay.example.com
myorigin = /etc/mailname
inet_interfaces = all
inet_protocols = all
mydestination =
relay_domains = *
transport_maps = hash:/etc/postfix/transport
smtpd_banner = relay.example.com ESMTP Proxy
disable_vrfy_command = yes

# 接受外部连接(可以根据需要更改限制)
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
mynetworks = 0.0.0.0/0

# 邮件转发到 MIAB(接收邮件)
local_recipient_maps =
mailbox_command =
EOF

# 添加 transport 映射
cat > /etc/postfix/transport <<EOF
* smtp:[${MIAB_IP}]
EOF

postmap /etc/postfix/transport

# 确保 Postfix 不加头部
# 创建 header_checks 文件
cat >/etc/postfix/header_checks <<EOF
/^Received:/ IGNORE
EOF

# 编译 header_checks
postmap /etc/postfix/header_checks

# 在 main.cf 中添加 header_checks 设置(如果不存在)
POSTFIX_MAIN_CF="/etc/postfix/main.cf"
if ! grep -q "^header_checks" "$POSTFIX_MAIN_CF"; then
    echo "header_checks = pcre:/etc/postfix/header_checks" >> "$POSTFIX_MAIN_CF"
else
    sed -i '/^header_checks/s|=.*|= pcre:/etc/postfix/header_checks|' "$POSTFIX_MAIN_CF"
fi
echo "[+] Postfix 已配置忽略 Received: 头部"


# -----------------------------
# 配置 Postfix 代理外发邮件
# -----------------------------
cat >> /etc/postfix/master.cf <<EOF

# 外发专用端口
2525     inet  n       -       n       -       -       smtpd
  -o smtpd_authorized_xforward_hosts=${MIAB_IP}
  -o smtpd_client_restrictions=permit_mynetworks,reject
  -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
  -o local_recipient_maps=
  -o relay_domains=
  -o smtpd_relay_restrictions=permit_mynetworks,reject
EOF

systemctl restart postfix

# -----------------------------
# 防火墙配置
# -----------------------------
ufw allow 25
ufw allow 2525
ufw --force enable

echo "✅ 边缘服务器已配置为邮件代理服务"
echo "    - 25/2525 用于 SMTP 转发"
echo "    - MIAB 完全不暴露"
echo "    - 防火墙已配置,允许邮件端口访问"
echo "🚀 配置完成!"

LXD/Incus UI设置登录

LXD/incus ui的验证逻辑是创建一套 crt + pfx 证书, crt添加到服务器上,pfx导入到登录客户端,通过证书凭证进行验证。

apt install -y incus-ui-canonical   #安装ui
incus config set core.https_address :8443 #配置端口
incus config show   #查看配置

打开https://IP::8443/ui/login/certificate-generate

具体步骤如下:

 点击“Generate”,生成incus-ui.crt和incus-ui.pfx后下载到本地, 把incus-ui.crt文件传服务器上用添加证书

incus config trust add-certificate incus-ui.crt      #导入证书
incus config trust list                                                #查看证书

导入incus-ui.pfx浏览器或者操作系统证书管理

然后重启浏览器用证书进行登录, pfx就是登录凭证。

 

另外还有个好玩的项目,可以集中管理所有服务器,https://github.com/PenningLabs/lxconsole

apt install python3 python3-pip  git -y
git clone https://github.com/PenningLabs/lxconsole.git
cd lxconsole
pip3 install -r requirements.txt  --break-system-packages
python3 run.py

基础安装完后创建账号登录进去, 添加 Server有提示如何生成证书,把证书内容保存到lxd服务器上再添加一下就可以直接管理了。

 

LXC incus 初体验

官方项目地址

https://github.com/lxc/incus

已有大神写好了基于 debian一键安装脚本

apt update -y
apt install curl -y 
curl -SsL https://github.com/Hentioe/server-helpers/raw/refs/heads/main/debian-install-incus |bash

按照https://blog.hentioe.dev/posts/incus-usage.html的设置部署步骤基本大同小异,  也可以查看https://github.com/oneclickvirt/incus/

也可以参照官方的文档

https://linuxcontainers.org/incus/docs/main/tutorial/first_steps/

https://github.com/zabbly/incus

 

启动 webui

 apt install -y incus-ui-canonical lsof 
 incus config set core.https_address :8443
 incus config show

https://xxx.xxx.xxx.xxx:8443/ui/login

需要设置证书才能登录。

 

具体的只是初步安装看了一遍,配套整合管理软件没到位,暂时只能简单玩玩。

临时加 swap

fallocate -l 120G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon -s
echo "/swapfile none swap sw 0 0" >> /etc/fstab

Linux 监控md 阵列

 

mdadm --monitor --scan --daemonise --alert "bash /opt/mdadm_alert.sh"
或者指定阵列路径
mdadm --monitor /dev/md10 /dev/md1 --daemonise --alert "bash /opt/mdadm_alert.sh"

 

TG BOT通知脚本

#!/bin/bash

# 你的 Telegram Bot API Token 和 Chat ID(修改成你的)
TG_BOT_TOKEN="123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ"
TG_CHAT_ID="987654321"

# 发送 Telegram 消息的函数
send_tg_message() {
    MESSAGE="$1"
    curl -s -X POST "https://api.telegram.org/bot$TG_BOT_TOKEN/sendMessage" \
        -d "chat_id=$TG_CHAT_ID" \
        -d "text=$MESSAGE" \
        -d "parse_mode=Markdown"
}

# 获取 mdadm 提供的警告信息(传递给脚本的参数)
ALERT_MSG="🚨 *ALERT:* RAID issue detected!\n\n\`\`\`\n$1\n\`\`\`"
send_tg_message "$ALERT_MSG"

MacOS ARM版本mtr免sudo设置

其实之前已经遇到过此问题了。

这次换Apple Silicon Mac版本后 brew 目录改到/opt目录。

 

brew install mtr

安装好后第一步先提权到 root,需要输入密码

sudo su

在 root 权限下后不用带 sudo 命令,设置权限。

ver=$(brew list mtr  --versions| awk '{print $2}')
chown root `brew --prefix`/Cellar/mtr/$ver/sbin/mtr-packet
chmod 4755 `brew --prefix`/Cellar/mtr/$ver/sbin/mtr-packet
exit

MacMini M4换硬盘迁移数据备忘录

过完年一次3600 价格买到了丐版MacMini M4

一直闲置没空,到这两天才买了2T 的第三方硬盘板替换。

提前下载好IPSW系统文件 https://mrmacintosh.com/apple-silicon-m1-full-macos-restore-ipsw-firmware-files-database/

在现有MAC上面apple store下载安装好apple configure

更换好硬盘板子后拿type-c线接背面的雷劈接口上。

按住开机键接上电源

状态灯变成闪烁黄色,

打开apple configure查看个设备状态,

虚线框内显示DFU的时候把IPSW文件拖动到虚线框,

状态灯变成白色即开始刷入数据,

如果接了显示器会看到logo和进度条,

等待 10 分钟左右完成刷机。

 

1743337234514.jpg

个人踩坑,搞了 2 小时都没有进入DFU模式,最后通过先按开机键再插电源一次性成功。

迁移数据

刷机用的type-c支持雷劈, 直接在雷劈网桥下设置PTP IP地址,然后打开迁移助手,十多分钟就迁移完数据了。

将老intel MacMini 数据迁移完后一些程序无法运行, 得安装Rosetta来兼容X86

softwareupdate --install-rosetta --agree-to-license

列出查看所有X86 版本的软件

system_profiler SPApplicationsDataType | grep -B 5 "Intel"

目前brew仍然安装不上,暂时未解决, 大致上完成了迁移使用,待续。

Centos7 EOL后的善后挣扎

elrepo官方已经移除了centos7 的支持, 继续使用 CentOS7 高版本内核只有找一些稀有的归档存储源了。

https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/
https://dl.lamp.sh/kernel/el7/ 

elrepo最后一个 kernel 版本是 6.9.7-1.el7, 加上 almalinux延后支持,勉强可以继续使用。

curl -o /etc/yum.repos.d/CentOS-Base.repo https://el7.repo.almalinux.org/centos/CentOS-Base.repo
yum install -y http://repo.almalinux.org/elevate/elevate-release-latest-el$(rpm --eval %rhel).noarch.rpm
yum upgrade -y
yum install  epel-release wget -y
rpm -ivh https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/{kernel-ml,kernel-ml-devel,kernel-ml-headers}-6.9.7-1.el7.elrepo.x86_64.rpm
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

openssh glibc 这些重要的包需要自己想办法处理。

没有能力玩透 Linux 的话建议还是使用新版本系统, 最头痛的是指定要旧版本的系统连yum仓库都不知道如何设定归档源,张口就说是故障问题要求额外的技术支持。

另外新版本的 openssl 已彻底放弃对sha1的支持。

 

参考文章https://www.oscarice.com/book/linux/centos7-last.html

Debian12 部署软阵列遇上的一些问题

组建 RAID 后重启, 阵列名变成了/dev/127

网上搜索了一下更新initramfs解决

 

update-initramfs -u
mdadm --detail --scan > /etc/mdadm/mdadm.conf

 

Centos 更新initramfs方法

dracut --force

 

另外重启网卡会导致kvm虚拟机网络离线,需要重启 libvirtd 才能恢复(网卡网桥模式),原因未知。

 systemctl restart  networking 
 systemctl restart libvirtd

nginx 401 动态验证备忘录

        auth_request /auth; 获取验证信息

server {  
    listen 8080;  
    resolver 1.1.1.1; 
    location @error401 { return 401 "Unauthorized";  }
        location = /auth {
        internal;
        proxy_pass http://backend-server/authenticate;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location / {  
        auth_request /auth;
        error_page 401 = @error401;
        proxy_bind $server_addr;
        proxy_pass $scheme://$http_host$request_uri;
        proxy_set_header HOST $http_host;
        proxy_buffers 256 4k;
        proxy_max_temp_file_size 0k; 
        proxy_connect_timeout 30;
        proxy_send_timeout 60;
        proxy_read_timeout 60;
        proxy_next_upstream error timeout invalid_header http_502;
    }  
deny 127.0.0.1;
}

Proxmox VE vncproxy noVNC 配置备忘录

PVE直接封装了WebSocket, 需要调用 VNC 和 xterm的几种方案:

1. 给虚拟机配置单独的 vnc监听端口和 ip并设置密码直接连接, 或者拿websockify转WebSocket

2.重新封装转发/api2/json/nodes/{node}/qemu/{vmid}/vncwebsocket  

3.直接访问 PVE 原生接口方式。(1.直接访问 2.nginx单独封装反向代理xtermjs和novnc|)

 

前期准备

GET /api2/json/access/ticket
POST /api2/json/nodes/{node}/qemu/{vmid}/vncproxy
wss /api2/json/nodes/{node}/qemu/{vmid}/vncwebsocket

 vncproxy 和 ticket 需要一起创建,noVNC连接vncwebsocket 需要 PVEAuthCookie才能正常通信否则无法连接。

注意:请求/api2/json/access/ticket必须要用户密码获取,用root token无法创建。
PVE 的设计思路是将 VM 分配给用户,但是没给token设计获取 ticket 应该是考虑权限分离。

 

偷懒思路解决方案,直接nginx代理 PVE 的 noVNC和xterm(又不想开放 PVE 访问)

map $arg_node  $proxyhost  {
   "PVE NODE NAME-1"  "PVE IP";
   "PVE NODE NAME-1"  "PVE IP";
   "PVE NODE NAME-1"  "PVE IP";
}

location ~/(xtermjs|novnc|api2) {
     if ( $arg_console ) { set $new_uri /?$query_string;  }
        proxy_pass https://$proxyhost:8006$new_uri;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
}

如果有安装 redis 插件, 可以从 redis 存取主机 IP, 另外还有一个版本由于安全问题暂不公开。 

和代理websocket方法一样也是需要保证wss通信的时候要带上PVEAuthCookie的 cookies

阅读剩余部分...

ipv4/ipv6分拆工具

官方项目https://github.com/emden-norfolk/cidrl

wget  https://github.com/emden-norfolk/cidrl/archive/refs/tags/v1.0.2.tar.gz   -O - | tar xz 
cd cidrl-*
./configure
make
make install

用法

cidrl6 -s50 2001:db8::1428:55ab/48
cidrl -s24 10.0.0/20

 

移除 whmcs 的 cart 蛋疼的 html 标签问题

#order-standard_cart .product-info  p:empty{ display: none; }
 li + br {display: none;}

不想改代码, 初学了下css用 empty和下一个标签功能给隐藏了

php 运行 ipmi 命令滞后卡顿解决方案

	public function IPMIcommand($ip, $user, $password, $cmd)
	{
		if (!(ereg('^[[:alnum:] ]+', $cmd))) {
			throw new Exception('Invalid characters in command');
		}
		if (ereg('^bootdev ', $cmd)) {
			$cmd = 'chassis ' . $cmd;
		}

		$output = array();
		exec('/usr/bin/ipmitool -H ' . escapeshellarg($ip) . ' -U ' . escapeshellarg($user) . ' -P ' . escapeshellarg($password) . '' . ' ' . $cmd . ' 2>&1', $output);
		return implode("\n", $output);
	}

 看别人写代码, 解决了 10 年为啥php 命令跑起来会卡顿的疑惑

debootstrap部署打包系统debian 和 ubuntu

目前为止好像还不支持 ubuntu24

具体支持的版本查看/usr/share/debootstrap/scripts/目录

#!/bin/bash
# 设置变量
NAME="jammy"
DISK="/dev/vdb"

BOOT_PART="${DISK}1"
SWAP_PART="${DISK}2"
ROOT_PART="${DISK}3"

apt update -y
apt install -y debootstrap  arch-install-scripts parted dosfstools
parted ${DISK} --script -- mklabel msdos
parted ${DISK} --script -- mkpart primary ext4 1MiB 2GiB
parted ${DISK} --script -- mkpart primary linux-swap 2GiB 3GiB
parted ${DISK} --script -- mkpart primary ext4 3GiB 100%

# 格式化分区
#mkfs.vfat -F32 $BOOT_PART
mkfs.ext4 -F $BOOT_PART
mkfs.ext4 -F $ROOT_PART
mkswap $SWAP_PART
swapon $SWAP_PART  

mount $ROOT_PART /mnt/
mkdir -p /mnt/boot
mount $BOOT_PART /mnt/boot

# 使用 debootstrap 安装基本系统
debootstrap --arch amd64 $NAME  /mnt/ http://archive.ubuntu.com/ubuntu/

mount --bind /proc /mnt/proc
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount -t devpts devpts /mnt/dev/pts

#更新设置系统内核和配置
chroot /mnt /bin/bash -c "echo 'root:your_password' | chpasswd"
chroot /mnt/ apt -y update
chroot /mnt/ apt -y upgrade
chroot /mnt/ locale-gen en_US.UTF-8
chroot /mnt/ update-locale LANG=en_US.UTF-8
for I in linux-image-generic linux-firmware initramfs-tools efibootmgr grub2-common grub-efi-amd64 grub-pc;
do chroot /mnt/ apt -y install --no-install-recommends $I ; done 
chroot /mnt/ sed -i 's#GRUB_CMDLINE_LINUX=""#GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"#g' /etc/default/grub  
chroot /mnt/ echo GRUB_DISABLE_OS_PROBER=true >/etc/default/grub 
chroot /mnt/ grub-install $DISK
chroot /mnt/ grub-mkconfig -o /boot/grub/grub.cfg
chroot /mnt/ update-grub
#chroot /mnt/ grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck
chroot /mnt/ apt -y install  --no-install-recommends  openssh-server 
chroot /mnt/  sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config
chroot /mnt/ systemctl enable systemd-networkd
chroot /mnt/ systemctl enable  ssh

cat>/mnt/etc/apt/sources.list<<EOF
deb http://archive.ubuntu.com/ubuntu ${NAME} main 
deb http://archive.ubuntu.com/ubuntu ${NAME} ${NAME}-security  main
deb http://archive.ubuntu.com/ubuntu ${NAME} ${NAME}-updates   main
EOF

cat>/mnt/etc/systemd/network/10-eth0.network<<EOF
[Match]
Name=eth0

[Network]
DHCP=yes
EOF

# 配置网络、主机名、fstab等(可根据需要添加)
cat>/mnt/etc/fstab<<EOF
/dev/vda1  /boot  ext4  defaults        1 1
/dev/vda2  swap   swap  defaults        0 0
/dev/vda3  /      ext4   defaults       1 2
EOF

echo "ubuntu" > /mnt/etc/hostname
cat <<EOL > /mnt/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
EOL

swapoff $SWAP_PART
for i in /dev/pts /dev /proc /sys /boot /; do umount /mnt$i; done  ## 卸载挂载
echo "Ubuntu installation setup completed on $DISK"