socat
socat是linux下的一个工具,其功能与与‘瑞士军刀’之称的netcat类似,但在一些功能上是netcat的加强版,netcat可能是太久没维护了。
socat的主要特点就是在两个数据流之间建立通道,且支持的协议与链接方式众多,如IP、TCP、 UDP、IPv6、PIPE、EXEC、System、Open、Proxy、Openssl、Socket等。
使用
基本语法:
1 | socat [options] <address> <address> |
其中这两个address可以理解为文件描述符,socat的工作就是在这两个address的文件描述符之间建立一个pipe用于发送和接收数据。
- -,STDIN, STDOUT: 表示标准输入输出,可以用-代替
- /path/to/file: 打开一个文件作为数据流
- TCP:: ;建立一个tcp连接作为数据流,tcp可以替换为udp
- TCP-LISTEN::建立tcp监听端口
- EXEC::执行一个程序作为数据流
在这些描述符可以逗号隔开附加上一些选项:fork,reuseaddr,stdin,stdout,ctty等
soctat当cat
1 | echo 'hello' | socat - ./chunk |
socat当netcat
1 | nc localhost 80 |
2 | socat - TCP:localhost:80 |
1 | echo 'test' | socat - tcp-connect:127.0.0.1:7000 |
2 | echo 'test' | socat - udp-connect:127.0.0.1:7000 |
1 | nc -lp 7000 |
2 | socat TCP-LISTEN:7000 - |
1 | socat unix-listen:/tmp/unix.socket - |
2 | echo "test" | socat - unix-connect:/tmp/unix.socket |
3 |
|
4 | socat unix-recvfrom:/tmp/unix.dg.sock - |
5 | echo "test" | socat - unix-sendto:/tmp/unix.dg.sock |
1 | nc -lp 7000 -e /bin/bash |
2 | socat TCP-LISTEN:7000 EXEC:/bin/bash |
1 | nc localhost 7000 -e /bin/bash |
2 | socat tcp-connect:localhost:7000 exec:"bash -li",pty,stderr,setsid,sigint,sane |
端口转发
TCP转发
1 | socat -d -d -lf /var/log/socat.log TCP4-LISTEN:15672,bind=192.168.2.204,reuseaddr.fork TCP4:192.168.2.205:15672 |
- -d -d 代表调试信息的输出级别
- -lf指定输出信息文件保存位置
- TCP4-LISTEN:在本地建立一个监听端口,也就是转发端口
- bind:指定绑定的ip
- reuseaddr重利用本地套接字
- fork复制出一个子进程转发到服务器
UDP转发
1 | socat -d -d -lf /var/log/socat.log UDP4-LISTEN:15672,bind=192.168.2.204,reuseaddr.fork UDP4:192.168.2.205:15672 |
nat映射:
在外部公网机器上执行:
1 | socat tcp-listen:1234 tcp-listen:3389 |
在内部私网地址:
1 | socat tcp:outerhost:1234 tcp:192.168.1.34:3389 |
将外部的机器的3389映射到内网的192.168.1.34的3389端口
文件传送
发送端:
1 | socat -u open:test.tar tcp-listen:2000,reuseaddr |
接收端:
1 | socat -u tcp:127.0.0.1:2000 open:test.tar,create |
- -u 表示数据传输模式为单向,从左面参数到右面参数
- -U 表示数据传输模式为单向,从右面参数到左面参数