Jusene's Blog

Socat 新网络瑞士军刀

字数统计: 704阅读时长: 3 min
2018/08/11 Share

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
socat - -
2
hello
3
hello  # 将stdin与stdout连接起来,直接回显
1
socat - /etc/fstab   # 直接输出文件内容
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 # 向tcp端口发送数据
2
echo 'test' | socat - udp-connect:127.0.0.1:7000 # 向udp端口发送数据
1
nc -lp  7000               # 监听端口
2
socat TCP-LISTEN:7000 -
1
socat unix-listen:/tmp/unix.socket -      # 监听一个unix socket
2
echo "test" | socat - unix-connect:/tmp/unix.socket # 向本地unix socket发送数据
3
4
socat unix-recvfrom:/tmp/unix.dg.sock -   # 监听一个unix datagram socket
5
echo "test" | socat - unix-sendto:/tmp/unix.dg.sock # 向本地unix datagram socket发送数据
1
nc -lp 7000 -e /bin/bash    # 正向shell
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 表示数据传输模式为单向,从右面参数到左面参数
CATALOG
  1. 1. socat
  2. 2. 使用
    1. 2.1. soctat当cat
    2. 2.2. socat当netcat
    3. 2.3. 端口转发
    4. 2.4. 文件传送