本文详细介绍如何在 CentOS、RHEL、Ubuntu 等 Linux 系统上安装和配置 Rinetd 端口转发工具,实现灵活的端口映射和流量转发功能。

应用场景:

Rinetd 端口转发在以下场景中非常实用:

  • 内网服务器端口映射到公网
  • 跨网段服务器端口转发
  • 负载均衡和流量分发
  • 绕过防火墙限制访问服务
  • 多服务器端口统一管理

无论您使用的是香港独立服务器新加坡VPS还是其他地区的服务器,Rinetd 都能帮助您实现灵活的端口转发配置,优化网络架构。


什么是 Rinetd:

Rinetd 是一个轻量级的 TCP/UDP 端口转发工具,可以将一个端口的流量转发到另一个 IP 地址和端口。它的特点是配置简单、资源占用少、性能稳定,特别适合需要端口映射的场景。

主要功能:

  • TCP 和 UDP 协议转发
  • 支持多个端口同时转发
  • 支持本地和远程转发
  • 配置文件简单易懂
  • 可以实现负载均衡(配合多个转发规则)

与其他工具对比:

  • iptables - 功能更强大但配置复杂,适合复杂的网络环境
  • Rinetd - 配置简单,适合简单的端口转发需求
  • HAProxy - 专业的负载均衡工具,功能强大但配置较复杂
  • Nginx - 主要用于 HTTP/HTTPS 反向代理

系统要求和准备工作:

适用系统:

  • CentOS 5/6/7/8
  • RHEL 5/6/7/8
  • Rocky Linux 8/9
  • AlmaLinux 8/9
  • Ubuntu 14.04/16.04/18.04/20.04/22.04
  • Debian 8/9/10/11

必需组件:

  • gcc 编译器
  • make 工具
  • tar 解压工具

权限要求:

  • root 或 sudo 权限
  • 能够绑定小于 1024 的端口需要 root 权限

安装步骤:

第一步:安装编译环境

在开始安装 Rinetd 之前,需要先安装编译所需的工具。

CentOS/RHEL 系统:

yum -y install gcc make wget tar

Ubuntu/Debian 系统:

apt update apt -y install gcc make wget tar

验证安装:

gcc --version make --version

如果显示版本信息,说明编译环境已经准备就绪。


第二步:下载 Rinetd 源码

下载源码包:

cd /usr/local/src wget http://www.boutell.com/rinetd/http/rinetd.tar.gz

如果官方地址无法访问,可以使用备用下载地址:

wget https://github.com/samhocevar/rinetd/releases/download/v0.62/rinetd-0.62.tar.gz

解压源码:

tar zxvf rinetd.tar.gz cd rinetd

或对于新版本:

tar zxvf rinetd-0.62.tar.gz cd rinetd-0.62


第三步:修复端口范围限制(重要)

在编译之前,需要修改源码中的端口限制,否则会导致编译错误。

编辑源码文件:

vi rinetd.c

或使用其他编辑器:

nano rinetd.c

查找并修改端口限制:

在 vi 编辑器中,按下 / 进入搜索模式,输入:

/bindPort >= 65536

找到这一行后,按 n 继续查找下一个:

/connectPort >= 65536

需要修改的内容:

将找到的所有 65536 修改为 65535

原代码:

if (bindPort >= 65536) { fprintf(stderr, "rinetd: invalid bind port\n"); return 1; }

if (connectPort >= 65536) { fprintf(stderr, "rinetd: invalid connect port\n"); return 1; }

修改后:

if (bindPort >= 65535) { fprintf(stderr, "rinetd: invalid bind port\n"); return 1; }

if (connectPort >= 65535) { fprintf(stderr, "rinetd: invalid connect port\n"); return 1; }

为什么要修改: 系统最大端口号是 65535,原代码使用 >= 65536 作为判断条件会导致无法使用最大端口。修改为 >= 65535 可以正确支持所有有效端口范围(1-65535)。

保存并退出编辑器(vi 中按 Esc,然后输入 :wq 回车)。


第四步:编译和安装

编译源码:

make

可能出现的警告(可忽略):

rinetd.c:176: 警告:与内建函数 'log' 类型冲突 rinetd.c: In function 'log': rinetd.c:1395: 警告:'log' 的地址总是等价为 'true'

这些警告不影响程序功能,可以忽略。

安装程序:

make install

可能遇到的错误:

install: 无法创建一般文件"/usr/man/man8": 没有那个文件或目录 make: *** [install] 错误 1

解决方法:

如果出现上述错误,需要手动创建目录:

mkdir -p /usr/man/man8

mkdir -p /usr/share/man/man8

然后重新执行:

make install

验证安装:

安装成功后,程序会被复制到以下位置:

  • 主程序:/usr/sbin/rinetd
  • 配置文件示例:/etc/rinetd.conf(需要手动创建)
  • 帮助文档:/usr/man/man8/rinetd.8

检查程序是否安装成功:

which rinetd /usr/sbin/rinetd

ls -l /usr/sbin/rinetd -rwx------ 1 root root 24576 Dec 18 10:30 /usr/sbin/rinetd


配置 Rinetd:

创建配置文件:

Rinetd 的配置文件默认位于 /etc/rinetd.conf,需要手动创建。

vi /etc/rinetd.conf

配置文件格式:

配置文件每行一条转发规则,格式为:

绑定地址 绑定端口 目标地址 目标端口

参数说明:

  • 绑定地址 - 本机监听的 IP 地址,使用 0.0.0.0 表示监听所有网卡
  • 绑定端口 - 本机监听的端口号
  • 目标地址 - 转发到的目标服务器 IP 地址
  • 目标端口 - 转发到的目标端口号

配置示例:

示例 1:基础端口转发

将本机 88 端口转发到远程服务器的 22 端口:

0.0.0.0 88 192.168.1.100 22

使用场景: 通过非标准端口(88)访问 SSH 服务(22),增加安全性。

示例 2:多端口转发

同时转发多个端口:

0.0.0.0 8080 192.168.1.100 80 0.0.0.0 8443 192.168.1.100 443 0.0.0.0 2222 192.168.1.100 22

使用场景: 将多个服务通过不同端口映射到公网,适合内网服务器对外提供服务。

示例 3:指定网卡转发

只在特定网卡上监听:

192.168.1.10 80 10.0.0.100 80 192.168.1.10 443 10.0.0.100 443

使用场景: 服务器有多个网卡,只在内网网卡上提供端口转发。

示例 4:负载均衡配置(简单轮询)

虽然 Rinetd 本身不支持真正的负载均衡,但可以通过多个转发规则实现简单的流量分发:

0.0.0.0 80 192.168.1.101 80 0.0.0.0 80 192.168.1.102 80

注意: 这种方式并非真正的负载均衡,建议使用专业的负载均衡工具如 HAProxy 或 Nginx。

示例 5:跨网段转发

从公网 IP 转发到内网服务器,特别适合日本独立服务器韩国VPS等需要访问内网资源的场景:

公网IP 端口 内网IP 端口 203.0.113.10 3306 192.168.1.50 3306 203.0.113.10 6379 192.168.1.51 6379

使用场景: 数据库服务器在内网,通过跳板机转发访问。

示例 6:端口映射(端口转换)

将标准端口映射到非标准端口:

0.0.0.0 10022 127.0.0.1 22 0.0.0.0 10080 127.0.0.1 80

使用场景: 本机服务使用标准端口,对外提供非标准端口访问。


配置文件高级选项:

日志配置:

在配置文件中可以添加日志记录:

logfile /var/log/rinetd.log logcommon

参数说明:

  • logfile - 指定日志文件路径
  • logcommon - 使用通用日志格式

完整配置示例:

Rinetd 配置文件

格式:绑定地址 绑定端口 目标地址 目标端口

日志配置

logfile /var/log/rinetd.log logcommon

SSH 端口转发

0.0.0.0 2222 192.168.1.100 22

Web 服务转发

0.0.0.0 8080 192.168.1.101 80 0.0.0.0 8443 192.168.1.101 443

数据库转发

0.0.0.0 13306 192.168.1.102 3306

FTP 转发

0.0.0.0 2121 192.168.1.103 21

保存配置文件并退出。


启动和管理 Rinetd:

启动 Rinetd 服务:

rinetd -c /etc/rinetd.conf

或简写(默认读取 /etc/rinetd.conf):

rinetd

注意: Rinetd 启动成功时不会有任何输出提示,只有在出错时才会显示错误信息。

验证是否启动成功:

方法 1:检查进程

ps aux | grep rinetd

输出示例:

root 12345 0.0 0.1 12345 1234 ? Ss 10:30 0:00 rinetd -c /etc/rinetd.conf

方法 2:检查端口监听

netstat -tunlp | grep rinetd

或使用 ss 命令:

ss -tunlp | grep rinetd

输出示例:

tcp LISTEN 0 128 0.0.0.0:88 0.0.0.0:* users:(("rinetd",pid=12345,fd=3))

方法 3:测试连接

telnet localhost 88

如果配置正确,应该能够连接到转发的目标服务。

再次启动验证:

如果不确定是否启动成功,可以再次执行启动命令:

rinetd -c /etc/rinetd.conf

如果出现以下错误,说明已经在运行:

rinetd: couldn't bind to address 0.0.0.0 port 88

这表示端口已被占用(被之前启动的 Rinetd 进程占用),说明服务正在运行。


停止和重启 Rinetd:

停止 Rinetd 服务:

pkill rinetd

或使用完整命令:

killall rinetd

强制停止(如果普通停止无效):

pkill -9 rinetd

重启 Rinetd 服务:

先停止再启动:

pkill rinetd rinetd -c /etc/rinetd.conf

重新加载配置:

Rinetd 不支持热重载配置,修改配置后必须重启服务:

pkill rinetd && rinetd -c /etc/rinetd.conf


设置开机自启动:

方法 1:添加到 rc.local(传统方法)

编辑 rc.local 文件:

vi /etc/rc.local

在文件末尾添加:

启动 Rinetd 端口转发

/usr/sbin/rinetd -c /etc/rinetd.conf

CentOS 7/8 额外步骤:

在 CentOS 7 及更高版本中,需要确保 rc.local 有执行权限:

chmod +x /etc/rc.d/rc.local

方法 2:创建 systemd 服务(推荐)

对于使用 systemd 的系统(CentOS 7+、Ubuntu 16.04+),建议创建 systemd 服务单元。

创建服务文件:

vi /etc/systemd/system/rinetd.service

输入以下内容:

[Unit] Description=Rinetd Port Forwarding Service After=network.target

[Service] Type=forking ExecStart=/usr/sbin/rinetd -c /etc/rinetd.conf ExecStop=/usr/bin/pkill rinetd Restart=on-failure RestartSec=5s

[Install] WantedBy=multi-user.target

保存并退出。

重新加载 systemd 配置:

systemctl daemon-reload

启动服务:

systemctl start rinetd

设置开机自启动:

systemctl enable rinetd

查看服务状态:

systemctl status rinetd

管理服务:

systemctl start rinetd # 启动 systemctl stop rinetd # 停止 systemctl restart rinetd # 重启 systemctl status rinetd # 查看状态


配置防火墙:

配置好 Rinetd 后,必须在防火墙中开放相应的端口,否则外部无法访问。对于使用台湾独立服务器马来西亚VPS等云服务器的用户,还需要在云平台的安全组中配置规则。

CentOS 7/8(firewalld):

开放单个端口:

firewall-cmd --permanent --add-port=88/tcp firewall-cmd --reload

开放多个端口:

firewall-cmd --permanent --add-port=88/tcp firewall-cmd --permanent --add-port=8080/tcp firewall-cmd --permanent --add-port=8443/tcp firewall-cmd --reload

开放端口范围:

firewall-cmd --permanent --add-port=8000-9000/tcp firewall-cmd --reload

查看已开放端口:

firewall-cmd --list-ports

CentOS 6(iptables):

添加防火墙规则:

/sbin/iptables -I INPUT -p tcp --dport 88 -j ACCEPT /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT

保存规则:

/etc/rc.d/init.d/iptables save

service iptables save

查看规则:

/etc/init.d/iptables status

iptables -L -n

Ubuntu/Debian(ufw):

开放端口:

ufw allow 88/tcp ufw allow 8080/tcp

启用防火墙:

ufw enable

查看规则:

ufw status


监控和日志管理:

启用日志记录:

在 /etc/rinetd.conf 中添加日志配置:

logfile /var/log/rinetd.log logcommon

重启 Rinetd 使配置生效:

pkill rinetd && rinetd -c /etc/rinetd.conf

查看日志:

实时查看日志:

tail -f /var/log/rinetd.log

查看最后 100 行:

tail -n 100 /var/log/rinetd.log

搜索特定 IP 的连接:

grep "192.168.1.100" /var/log/rinetd.log

日志轮转配置:

为避免日志文件过大,建议配置日志轮转:

vi /etc/logrotate.d/rinetd

输入以下内容:

/var/log/rinetd.log { daily rotate 7 compress delaycompress missingok notifempty postrotate /usr/bin/pkill -HUP rinetd endscript }

监控脚本:

创建一个简单的监控脚本,自动重启异常退出的 Rinetd:

vi /usr/local/bin/rinetd_monitor.sh

输入以下内容:

#!/bin/bash

Rinetd 监控脚本

if ! ps aux | grep -v grep | grep rinetd > /dev/null; then echo "$(date): Rinetd is not running, starting..." >> /var/log/rinetd_monitor.log /usr/sbin/rinetd -c /etc/rinetd.conf fi

保存并添加执行权限:

chmod +x /usr/local/bin/rinetd_monitor.sh

添加到 crontab(每 5 分钟检查一次):

crontab -e

添加以下行:

*/5 * * * * /usr/local/bin/rinetd_monitor.sh


实际应用案例:

案例 1:内网 Web 服务器对外发布

场景: 有一台内网 Web 服务器(192.168.1.100),需要通过公网服务器(公网 IP: 203.0.113.10)对外提供服务。

配置:

0.0.0.0 80 192.168.1.100 80 0.0.0.0 443 192.168.1.100 443

防火墙配置:

firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=443/tcp firewall-cmd --reload

用户访问 http://203.0.113.10 时,流量会自动转发到内网服务器。

案例 2:SSH 跳板机

场景: 通过跳板机访问内网多台服务器的 SSH。

配置:

0.0.0.0 2201 192.168.1.101 22 0.0.0.0 2202 192.168.1.102 22 0.0.0.0 2203 192.168.1.103 22

使用方法:

ssh -p 2201 user@跳板机IP # 连接到 192.168.1.101 ssh -p 2202 user@跳板机IP # 连接到 192.168.1.102 ssh -p 2203 user@跳板机IP # 连接到 192.168.1.103

案例 3:数据库远程访问

场景: 内网数据库服务器需要被远程开发人员访问。

配置:

0.0.0.0 13306 192.168.1.50 3306

安全建议:

  • 仅开放给特定 IP 地址
  • 使用强密码和证书认证
  • 定期检查访问日志

案例 4:游戏服务器端口转发

场景: 游戏服务器在内网,需要通过公网访问。

配置:

0.0.0.0 27015 192.168.1.200 27015 0.0.0.0 27016 192.168.1.200 27016


常见问题排查:

问题 1:端口转发不生效

  • 检查 Rinetd 是否运行: ps aux | grep rinetd
  • 检查端口是否监听: netstat -tunlp | grep 端口号
  • 检查防火墙规则: firewall-cmd --list-ports 或 iptables -L -n
  • 检查配置文件语法: 确保每行格式正确,没有多余空格
  • 查看日志: tail -f /var/log/rinetd.log

问题 2:提示端口已被占用

  • 原因: Rinetd 已经在运行,或其他程序占用了该端口
  • 解决: 先停止 Rinetd(pkill rinetd),检查端口占用(netstat -tunlp | grep 端口),然后重新启动

问题 3:无法连接到转发的目标服务器

  • 检查目标服务器是否可达: ping 目标IP
  • 检查目标端口是否开放: telnet 目标IP 目标端口
  • 检查目标服务器防火墙: 确保允许来自转发服务器的连接
  • 检查网络路由: traceroute 目标IP

问题 4:转发速度慢

  • 原因: 网络带宽限制、服务器性能不足或路由跳数过多
  • 解决: 优化网络路由、升级服务器配置或考虑使用 CDN

问题 5:编译时出错

  • 缺少编译工具: 安装 gcc 和 make
  • 端口范围错误: 按照教程修改源码中的端口限制
  • 权限不足: 使用 sudo 或 root 权限操作

问题 6:配置修改后不生效

  • 原因: Rinetd 不支持热重载
  • 解决: 必须重启服务:pkill rinetd && rinetd -c /etc/rinetd.conf

问题 7:日志文件过大

  • 原因: 未配置日志轮转
  • 解决: 配置 logrotate 或定期手动清理日志

通过以上详细的安装、配置和管理步骤,您可以在 Linux 系统上成功部署 Rinetd 端口转发服务。虽然 Rinetd 功能相对简单,但对于基本的端口映射需求已经足够。如果需要更复杂的转发功能,建议考虑使用 iptables、HAProxy 或 Nginx 等更强大的工具。