Realm 端口转发完全指南:跨网段、IPv4/IPv6 双栈中转与负载均衡
Contents
1. 为什么需要 Realm?
Firewalld 端口转发 能处理 90% 的单机转发场景——但当你的需求超过「A 端口 → B 机器」这个点对点模型时,firewalld 就开始力不从心了。
以下三种场景,firewalld 要么配置极其繁琐,要么根本做不了:
| 场景 | firewalld | Realm |
|---|---|---|
| IPv4 → IPv6 跨栈转发 | 需手写两套规则 | 一条 endpoint 配置 |
| 同一端口转发到多个目标(负载均衡) | 不支持 | 原生多 remote |
| 域名目标(DNS 解析变更自动跟随) | 不支持 | remote = "domain:port" |
| 流量过滤/白名单 | 需额外 iptables 规则 | 内置 include/exclude |
Realm 是 Rust 编写的用户态端口转发程序,约 3MB 的二进制文件,依赖为零。它把上述复杂需求收敛到 /etc/realm/config.toml 一个文件中,结构清晰、维护成本低。
2. 实验环境
| 项目 | 详情 |
|---|---|
| CPU 架构 | x86_64(也提供 aarch64 版本) |
| 操作系统 | Debian 12 / Ubuntu 24.04 |
| Realm 版本 | v2.9.3 |
| 监听示例 | [::]:10001-10003(双栈,匹配 IPv4 + IPv6) |
| 目标示例 | 域名 / IPv4 / IPv6 各一 |
3. 安装与配置
第 1 步:下载 Realm
sudo mkdir -p /usr/src/realm && cd /usr/src/realm
sudo wget https://github.com/zhboner/realm/releases/download/v2.9.3/realm-x86_64-unknown-linux-gnu.tar.gz
ARM 架构
Oracle Cloud Always Free 的 ARM 机器或其他 ARM 服务器,用 realm-aarch64-unknown-linux-gnu.tar.gz:
sudo wget https://github.com/zhboner/realm/releases/download/v2.9.3/realm-aarch64-unknown-linux-gnu.tar.gz第 2 步:解压并安装到 $PATH
sudo tar -zxvf realm-x86_64-unknown-linux-gnu.tar.gz
sudo chmod +x realm
sudo chown -R root:root realm
sudo mv realm /usr/local/bin/
sudo rm -rf /usr/src/realm验证安装:
realm --version第 3 步:编写 config.toml
sudo mkdir -p /etc/realm
sudo nano /etc/realm/config.toml以下是一个生产级配置模板,覆盖三种常见目标类型:
[log]
level = "info"
output = "/var/log/realm.log"
[network]
use_udp = true
# 转发至域名(DNS 解析自动跟随)
[[endpoints]]
listen = "[::]:10001"
remote = "bl.xzcloudnode.sbs:50309"
tcpFastOpen = true
udp = true
# 转发至 IPv4
[[endpoints]]
listen = "[::]:10002"
remote = "158.21.17.235:35003"
tcpFastOpen = true
udp = true
# 转发至 IPv6
[[endpoints]]
listen = "[::]:10003"
remote = "[2404:7a80:ff20:6900:be24:11ff:fe6c:e661]:30123"
tcpFastOpen = true
udp = true
为什么 listen 用 [::] 而不是 0.0.0.0?
[::] 在 Linux 上默认开启 IPV6_V6ONLY=0,可以同时接收 IPv4 和 IPv6 连接。用 0.0.0.0 则只监 IPv4。除非有特殊需求(如只允许内网 IPv4),否则直接写 [::] 是最省事的选择。第 4 步:创建 systemd 服务
sudo nano /etc/systemd/system/realm.service[Unit]
Description=Realm Port Forwarding
After=network.target
[Service]
ExecStart=/usr/local/bin/realm -c /etc/realm/config.toml
Restart=always
User=root
Group=root
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target第 5 步:启动并设置开机自启
sudo systemctl daemon-reload
sudo systemctl enable realm --now
sudo systemctl status realm --no-pager4. 常用命令速查
| 动作 | 命令 |
|---|---|
| 启动 | sudo systemctl start realm |
| 停止 | sudo systemctl stop realm |
| 重启 | sudo systemctl restart realm |
| 状态 | sudo systemctl status realm --no-pager |
| 日志 | sudo journalctl -u realm -n 80 --no-pager |
| 实时日志 | sudo tail -f /var/log/realm.log |
5. Realm vs firewalld:什么时候用哪个?
| 维度 | firewalld | Realm |
|---|---|---|
| 运行层级 | 内核 netfilter | 用户态 |
| 性能 | 接近线速 | 高(Rust,零开销抽象) |
| 配置复杂度 | 低(单端口场景) | 低(TOML 一目了然) |
| 多目标 / 负载均衡 | 不支持 | 原生支持 |
| IPv4↔IPv6 跨栈 | 需手写两套规则 | 一个 listen=[::] 搞定 |
| 流控 / 限速 / 白名单 | 需 nftables 配合 | 内置 |
| 国内云厂商友好度 | 高(内核标准能力) | 中(用户态程序,需注意合规使用) |
简单结论:点对点转发用 firewalld,跨栈/多目标/负载均衡用 Realm。两者并不互斥——同一台机器上可以共存,各自管理自己的端口集合。
6. FAQ
Q: Realm 延迟会比 firewalld 高吗?
用户态转发的确比内核态多一次上下文切换,但 Realm 基于 Rust 异步运行时(tokio),实际增加延迟在亚毫秒级。对远程桌面、游戏代理这类延迟敏感场景也足够。实测中转机到目标机在同一机房时,增加 < 2ms。
Q: 同一端口可以转发到多个目标吗?
可以。在 config.toml 的同一个 [[endpoints]] 块中,remote 字段支持多个地址(逗号分隔),Realm 自动进行轮询负载均衡。
Q: 在国内云厂商(如阿里云/腾讯云)上用 Realm 安全吗?
Realm 本身是合法的端口转发工具——它不加密、不混淆,功能透明。但国内云厂商对「中转境外流量」的监控较为严格。如果你用 Realm 做国内中转 → 境外落地这类链路,建议配合 WireGuard 提前加密 或使用专线(如 IEPL/IPLC),避免明文流量触发风控。
7. 推荐阅读
- Firewalld 端口转发完全指南:IPv4/IPv6 双栈配置与排错 — 简单点对点转发首选
- WireGuard 安装与组网完整教程 — 先加密再转发,内网组网减少端口暴露
- Xray VLESS + REALITY 源码编译安装 — 代理落地端部署
- 从零编译安装 Nginx:最新安全加固版全流程 — 反向代理分流替代方案
- 服务器选型:腾讯云轻量云 · 阿里云 99 计划 · 搬瓦工限量优惠 · RackNerd 特价 VPS