socat是不支持端口段转发,只适用于单端口或者少量端口,如果需要大量端口考虑使用 iptables 或 haproxy 。( haproxy 只能转发TCP ) 。
Socat安装
Centos 系统:
yum install -y socat
Debian/Ubuntu 系统:
apt-get update
apt-get install -y socat
Socat使用
TCP4-LISTEN:在本地建立的是一个TCP ipv4协议的监听端口;
reuseaddr:绑定本地一个端口;
fork:设定多链接模式,即当一个链接被建立后,自动复制一个同样的端口再进行 监听 。
socat启动监听模式会在前端占用一个shell,因此需使其在后台执行。
转发TCP
socat TCP4-LISTEN:8888,reuseaddr,fork TCP4:233.5.5.5:1006>> /root/socat.log
一般来说socat 是前台运行的如果需要后台运行则要加上 nohup 命令如
nohup socat TCP4-LISTEN:8888,reuseaddr,fork TCP4:233.5.5.5:1006 >> /root/socat.log
TCP4-LISTEN:8888 指的是 监听ipv4的端口,也就是转发后的端口。
fork TCP4:233.5.5.5:1006 是指被转发的 IP 和端口,也就是你要中继的服务器的IP和端口。
/root/socat.log 是指转发日志。
转发UD
nohup socat UDP4-LISTEN:8888,reuseaddr,fork UDP4:223.5.5.5:1008 >> /root/socat.log 2>&1 &
转发UDP很简单,只要把TCP4改成UDP4就行了!
文件传输
服务端:
socat -u open:FILENAME tcp-listen:12345
客户端
socat -u tcp:ServerIP:12345 open:LOCALFILE,create
【说明】
-u 表示数据单向传送,从第一个参数传递到第二个参数;-U则表示从第二个参数传送到第一个参数。 open 表示使用系统调用open()打开文件,不能打开unix域socket。 tcp-listen 表示监听tcp端口。 create 表示如果文件不存在则创建。 传输结束后两端均退出。
读写分流功能
Socat 具有一个独特的读写分流功能,比如:可以实现一个假的 Web Server,客户端连过来之后就把 hello.html 里面的内容传过去,同时把客户端的数据保存到 log.txt 里面 ( !! 符号用于合并读写流,前面的用于读,后面的用于写。由于 ! 在 Shell 中是特殊字符,所以这里在命令行中使用 \ 对其进行了转义 )
socat open:hello.html\!\!open:log.txt,create,append tcp-listen:12345,reuseaddr,fork
【说明】
open: hello.html 表示读hello.html文件。
open: log.txt 表示收到的数据写入log.txt文件。
reuseaddr 见socket的SO_REUSEADDR。
fork 请求到达时,fork一个进程进行处理。 在bash下,需要用\对!进行转义。
开机启动
因为这个工具并没有开机启动的设定,所以需要设置系统的开机启动。
Centos系统:
chmod +x /etc/rc.d/rc.local
vi /etc/rc.d/rc.local
Ubuntu/Debian系统:
chmod +x /etc/rc.local
vi /etc/rc.local
输入I 键 进入编辑模式(如果没反应请看上面的教程安装 vim),然后在打开的文件中的exit 0代码前面插入你的 socat 命令代码。
查看端口情况
netstat -antup
终止运行
ps -ef|grep socat kill -9 xxxID
Socat卸载
Centos系统:
yum remove socat
Debian/Ubuntu系统:
sudo apt-get remove socat
sudo apt-get autoremove
参考来源:
https://www.dest-unreach.org/socat/doc/socat.html