netcat で port forward

単純にncをパイプで入出力を繋げると、入力はforwardされるけど、出力はclientに返らずに、ncを実行している端末の標準出力に出てしまう。

  • localhostの8080にきたものを192.168.0.1の80にforward
$ nc -l 8080 | nc 192.168.0.1 80

これでcilentからnc 10.0.0.1 8080 と接続すると192.168.0.1:80 にport forwardされるけど、出力はnc -l を実行している端末に出てしまう。


名前付きパイプで解決

$ mkfifo fifo
$ nc -l 8080 < fifo | nc 192.168.0.1 80 > fifo

これでclientからlocalhostの8080にアクセス

$ telnet localhost 8080
GET / HTTP/1.0 
	
## 192.168.0.1:80 のサーバの応答が返ってくる

socat - Multipurpose relay (SOcket CAT)

netcat がパワーアップしたようなもの?

netcatのport forwardが面倒くせーなーと思っていたけど、socatなら名前付きパイプを作らなくても良かった。(といっても内部的にncを実行しているようなのでラッパーのようなもの?)

簡単にportフォワードできたり。telnet,ncのようにTCP/UDPのクライアントに使ったり。

ただ、TCP/UDP portに接続するだけならncでいいやん?と思いきや
名前の通りsocketに直接接続できるのも大きな違いかな。

tcp/udp client

$ socat STDIN TCP4:www.example.com:80 
GET / HTTP/1.0  # http request を標準入力から入力
	
### もしくは、http requestの内容をファイルに書いておいて
$ socat - TCP4:www.example.com:80 < http.request

port forward

localの8080に来たものを192.168.0.1:8080にforward

$ socat TCP4-LISTEN:8080 TCP4:192.168.0.1:8080
  • socket
$ socat - UNIX-CONNECT:/path/to/file.socket