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 )以及 禁止规则 ( allow rules )。只要定义了放行规则,任何不匹配的来源 IP 将被拒绝连接;只要定义了禁止规则,任何匹配的来源 IP 将被拒绝连接。

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

  • 写在 转发规则 之前的是 全局规则 ,对所有转发规则均有效;
  • 写在某条转发规则后的,则只对当前转发规则有效。回过头来看看访问控制规则怎么写:
  1. allow pattern
  2. deny pattern

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

  1. allow 206.125.69.*

这条规则指示对来源 IP206.125.69.0/24 这个段内的所有连接放行。

日志输出规则

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

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

完整示例

  1. logfile /var/log/rinetd.log
  2. logcommon
  3. allow 10.*.*.*
  4. 206.125.69.81 80 10.1.1.2 80
  5. allow 206.125.69.*
  6. 10.101.1.2 3306 10.1.1.10 3306

部署

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

  1. $ rinetd -c /etc/rinetd.conf

注解

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

警告

再次强调,请不要将 rinetd 应用到生产服务!

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

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

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

下一步

订阅更新,获取更多学习资料,请关注我们的 微信公众号

../_images/wechat-mp-qrcode.png小菜学编程

参考文献