rinetd

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

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

    警告

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

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

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

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

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

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

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

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

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

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

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

    1. bindaddress bindport connectaddress connectport

    其中, bindaddress绑定地址bindport绑定端口 (监听端口);connectaddress目标地址connectport目标端口

    举个例子:

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

    访问控制规则规定了哪些来源 IP 可以连接。

    访问控制规则可以分成两种: 放行规则 ( allow rules )以及 禁止规则 ( allow rules )。只要定义了放行规则,任何不匹配的来源 IP 将被拒绝连接;只要定义了禁止规则,任何匹配的来源 IP 将被拒绝连接。

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

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

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

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

    1. allow 10.*.*.*
    2. allow 206.125.69.*
    3. 10.101.1.2 3306 10.1.1.10 3306

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

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

    注解

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

    警告

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

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

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

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

    小菜学编程