端口转发程序已经介绍过rinetd了,但是rinetd不支持域名动态解析功能,如果域名对应的ip发生改变,需要重新才能重新加载新的地址。这里自然找到了端口转发工具socat,它完美的解决了动态dns的问题。且由于工作模式的不同,socat的转发效率更高。
socat是一个长期维护的项目,rinetd已经很久没有更新了。如果只有少数几个端口需要转发,socat将是非常不错的选择。socat长期维护所以可以直直接在线支持redhat/centos/debian等发行版本。
socat项目
socat项目地址:http://www.dest-unreach.org/socat/
源代码下载:http://www.dest-unreach.org/socat/download/
socat安装
使用包管理工具进行安装:
#CentOS系统 yum install -y socat #Ubuntu或Debian系统 apt-get update apt-get install -y socat
socat的使用
2.1转发TCP流量
nohup socat TCP4-LISTEN:10000,reuseaddr,fork TCP4:1.1.1.1:10000 >> socat.log 2>&1 &
1、TCP4-LISTEN:10000监听ipv4的10000TCP端口,10000改成你自己需要转发的端口;
2、fork TCP4:1.1.1.1:10000`转发到1.1.1.1的10000端口,根据需求修改自行修改ip和端口;
3、nohup后台运行,可以把这个命令写到/etc/rc.local里面开机启动启动。
2.2转发UDP流量
nohup socat -T 600 UDP4-LISTEN:10000,reuseaddr,fork UDP4:1.1.1.1:10000 >> socat.log 2>&1 &
说明对照tcp流量转发,如果想要开机自己动可以将命令吸入到/etc/rc.local。更好的办法是将命令写作shell脚本,开机自启动。
开机自启动
创建一个systemd服务
echo "[Unit] Description=/etc/rc.local ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target " > /etc/systemd/system/rc-local.service
创建配置文件:
echo "#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. " > /etc/rc.local
将socat端口转发配置写入文件即可
echo "nohup socat TCP4-LISTEN:10000,reuseaddr,fork TCP4:1.1.1.1:10000 >> /root/socat.log 2>&1 & nohup socat -T 600 UDP4-LISTEN:10000,reuseaddr,fork UDP4:1.1.1.1:10000 >> /root/socat.log 2>&1 & " >> /etc/rc.local
附加执行权限
chmod +x /etc/rc.local
加载开机自动并启动服务
systemctl enable rc-local systemctl start rc-local
总结
socat转发时,流量进程时一对一模式,可以动态伸缩调整,转发效率更加优秀。总体性能比rinetd好,且作为一个长期维护的项目,可以有专业人员修复bug和新增功能。