当前位置: 首页 > Linux运维 > Linux安装rinetd实现TCP/UDP端口转发

Linux安装rinetd实现TCP/UDP端口转发

发布于:2018-4-3 最后更新:2021-8-18 Linux运维 12条评论 20,968 views
本站提供Linux服务器运维,自动化脚本编写等服务,如有需要请联系博主微信:xiaozme

在Linux系统中大多数情况选择用iptables来实现端口转发,iptables虽然强大,但配置不便,而且新手容易出错。在此分享另一个TCP/UDP端口转发工具rinetd,rinetd体积小巧,配置也很简单。

安装rinetd

这篇文章以CentOS 7为例,复制下面的命令输入,一行一个:

#安装依赖
yum -y install gcc gcc-c++ make automake
#下载rinetd
wget https://github.com/samhocevar/rinetd/releases/download/v0.70/rinetd-0.70.tar.gz
#解压
tar -zxvf rinetd-0.70.tar.gz
#进入目录
cd rinetd-0.70
#编译安装
./bootstrap
./configure
make && make install

安装后,可以输入rinetd -v查看当前版本。

[root@kryptcn2 rinetd-0.70]# rinetd -v
rinetd 0.70

随着时间推移,上面下载地址不一定是最新的,大家可前往Github:https://github.com/samhocevar/rinetd/releases下载最新版本。

设置TCP端口转发

#新建rinetd配置文件
vi /etc/rinetd.conf
#填写如下内容
0.0.0.0 2018 103.74.192.160 2019
#启动rinetd
rinetd -c /etc/rinetd.conf

rinetd配置文件的格式如下:

  • 0.0.0.0:源IP
  • 2018:源端口
  • 103.74.192.160:目标IP
  • 2019:目标端口

上面配置的意思是将本地2018端口转发到103.74.192.160的2019端口,启动后可以输入netstat -apn|grep 'rinetd'查看是否运行正常,注意还需要在自己服务器防火墙放行对应的源端口,否则无法正常使用用。

0.70版本开始rinetd已经支持UDP转发,写法如下:

127.0.0.1   8000/udp  192.168.1.2     8000/udp

创建systemd服务

为了方便管理,我们可以为rinetd编写一个systemd服务,有兴趣的同学可参考《Linux系统编写Systemd Service实践》,xiaoz已经编写好了,直接复制下面的内容即可:

#创建rinetd服务
vi /etc/systemd/system/rinetd.service

复制下面的内容进行保存:

[Unit]
Description=rinetd
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/sbin/rinetd -c /etc/rinetd.conf

[Install]
WantedBy=multi-user.target

输入命令:systemctl daemon-reload重载daemon使其生效,然后就可以使用下面的命令来管理rinetd了。

#启动rinetd
systemctl start rinetd
#设置开机启动
systemctl enable rinetd
#停止rinetd
systemctl stop rinetd
#重启
systemctl restart rinetd

rinetd的一些问题

rinetd支持转发到域名,rinetd会提前解析域名,并将解析出的IP缓存到内存中,如果您的域名解析IP发生了变化必须重启rinetd才会生效,所以rinetd并不适合转发到域名IP经常发生变化的情况,而socat则不存在此问题。

其它转发工具

总结

rinetd安装和配置都非常简单,并且从0.70版本开始已经支持UDP转发,但rinetd具体性能如何xiaoz并未进一步测试,不知道高并发的情况下能否扛得住。

项目地址:https://github.com/samhocevar/rinetd


12 条评论 “Linux安装rinetd实现TCP/UDP端口转发”

  1. passerby说道:

    rinetd很C蛋的不支持epoll,几年前看到原作者还直接把软件的开发交给了一个fork维护者。rinetd原版好像还不支持ipv6,不知道现在如何了,支持什么新功能了

  2. creeksidenine说道:

    也可以使用 rein, 功能与 Rinetd 类似,使用 golang开发,更方便,直接提供 linux,windows 和 mac 版本的可执行程序。 https://github.com/firstboot/rein
    详见说明:
    https://www.cnblogs.com/gleaners/p/11497148.html

    1. xiaoz说道:

      谢谢推荐,我研究下rein

  3. 小清新说道:

    xiaoz,问下那些情况下需要端口转发?

  4. 追梦说道:

    haproxy支持端口段转发

    1. xiaoz说道:

      嗯,haproxy功能更强大,rinetd配置比较简单。

  5. 唯一度博客说道:

    转发之后,php怎么获取用户真实IP?

  6. 菜鸟运维说道:

    自打nginx支持端口转发后我就觉得服务器只需要一个nginx了

  7. 机器侠说道:

    貌似不支持 tcp 端口段批量转发吧?只支持单端口转发吗?

    1. xiaoz说道:

      好像只支持单端口,我也希望有批量转发的功能。

  8. 淘惠网说道:

    这个方法不错,很实用!

  9. tracymc说道:

    确实比iptables好用多了,简单易懂。

发表评论

邮箱地址不会被公开。 必填项已用*标注