共计 1634 个字符,预计需要花费 5 分钟才能阅读完成。
在 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
:源 IP2018
:源端口103.74.192.160
:目标 IP2019
:目标端口
上面配置的意思是将本地 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 并未进一步测试,不知道高并发的情况下能否扛得住。