rinetd端口转发工具

进行网络编程、服务部署时,经常需要临时对一些端口进行转发。

举个例子,笔者开发过一个 Agent 软件——它部署于集群每台服务器上,对其上的某个服务进行管理,需要连接服务端口。我在本地进行开发,需要部署一套相同的服务,这多少有些麻烦。如果可以在本地部署端口转发服务,监听服务端口,将请求转发至部署有该服务的测试机,便可完美解决问题。

端口转发方案很多,SSH端口转发 , NAT 端口转发,甚至 HAProxy 之类的工具都可以排上用场。然而,应对开发调试这种 临时需求rinetd 就能胜任,它足够简单轻量级,依赖也少。

请不要将 rinetd 应用到生产服务!

rinetd 底层采用 select 而不是 epoll 实现。众所周知, select 有致命缺陷,一次能处理的 文件描述符(套接字)非常有限,效率也比较低下。

因此,在高并发环境采用rinetd无异于自杀

更多细节可参考文章:rinetd 在生产环境要谨慎使用

安装

rinetd 可以运行在任何 Unix 系统中,但系统一般没有预装,需要用户自己动手。

安装也简单,只需视系统运行包管理工具。以 Debian 为例:

1
$ apt install rinetd

笔者在 OSX 系统开发,则可以使用 brew 来安装:

1
$ brew install rinetd

顺便提一下,笔者使用 brew 安装 rinetd 时,出现一些错误——提示不能写入 /usr/local/sbin 目录。

看了一眼该目录,根本就不存在!这种情况可以自己建好 /usr/local/sbin 再试,所属用户、所属组以及权限可以参考 /usr/local/bin 。

配置

运行 rinetd 前,需要先准备一个配置文件。配置文件非常简单,主要包含 转发规则访问控制规则 以及 日志输出规则

转发规则

转发规则定义了监听什么端口,以及转发到哪个目标地址上的哪个端口。形式如下:

1
bindaddress bindport connectaddress connectport

其中, bindaddress绑定地址bindport绑定端口(监听端口);connectaddress目标地址connectport目标端口 。举个例子:

1
206.125.69.81 80 10.1.1.2 80

这个配置告诉 rinetd 监听本地端口 206.125.69.81:80 ,然后将请求转发到内网机器 10.1.1.280 端口。

访问控制规则

访问控制规则规定了哪些来源 IP 可以连接。访问控制规则可以分成两种:

  • 放行规则allow rules );
  • 禁止规则deny rules )。

只要定义了放行规则,任何不匹配的来源 IP 将被拒绝连接;只要定义了禁止规则,任何匹配的来源 IP 将被拒绝连接。

此外,访问控制规则还定义了两种不同的 作用范围

  1. 写在 转发规则 之前的是 全局规则 ,对所有转发规则均有效;
  2. 写在某条转发规则后的,则只对当前转发规则有效。

回过头来看看访问控制规则怎么写:

1
2
allow pattern
deny pattern

其中, pattern 为来源 IP 模式。例如:

1
allow 206.125.69.*

这条规则指示对来源 IP 在 206.125.69.0/24 这个段内的所有连接放行。

日志输出规则

日志输出规则定义日志输出文件以及格式:

1
2
logfile /var/log/rinetd.log
logcommon

完整示例

1
2
3
4
5
6
7
8
9
logfile /var/log/rinetd.log
logcommon

allow 10.*.*.*

206.125.69.81 80 10.1.1.2 80
allow 206.125.69.*

10.101.1.2 3306 10.1.1.10 3306

部署

准备好配置文件后,通过 -c 选项启动 rinetd 命令即可:

1
$ rinetd -c /etc/rinetd.conf

注意到,程序启动后便退出了。这是因为, rinetd 以后台进程( 守护进程 )的形式运行服务。执行 ps aux | grep rinetd 命令,可以找到该进程。

小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: