socat – 多用途な双方向データ転送ツール

ポートフォワーディング/トンネリング

socat(SOcket CAT)は、任意の2つのデータストリーム間で双方向にデータを転送するためのコマンドです。
netcat の上位互換的な位置づけで、TCP/UDP通信、UNIXドメインソケット、シリアルポート、ファイル、標準入出力など多様な組み合わせをサポートします。

構文(Syntax)

socat [オプション] <アドレス1> <アドレス2>
  • <アドレス> には TCP/UDP ポート、UNIXソケット、ファイル、デバイスなどを指定可能。
  • アドレス例:
    • TCP:HOST:PORT
    • UDP:HOST:PORT
    • UNIX:/tmp/socket
    • PTY(仮想端末)
    • STDIO(標準入出力)

主なオプション一覧

オプション説明使用例
-d -dデバッグ情報を詳細に出力socat -d -d TCP4-LISTEN:1234,fork STDOUT
fork接続ごとに新しいプロセスを生成(サーバー用途)socat TCP-LISTEN:8080,fork EXEC:/bin/cat
reuseaddrLISTEN時にアドレス再利用を許可socat TCP-LISTEN:80,reuseaddr,fork TCP:192.168.1.10:8080
crlf改行を CRLF に変換socat TCP-LISTEN:1234,reuseaddr,fork FILE:log.txt,crlf

実行例

TCPサーバーとして待ち受け

socat TCP-LISTEN:1234,fork STDOUT

(クライアントが接続すると、その入力を標準出力に表示)

TCPクライアントとして接続

socat - TCP:example.com:80

(標準入力から入力した文字が example.com の 80番ポートに送信される)

簡易チャット(片方がサーバー、もう片方がクライアント)

  • サーバー側
socat TCP-LISTEN:5000,fork STDOUT
  • クライアント側
socat - TCP:localhost:5000

ファイルを転送

  • 送信側
socat TCP-LISTEN:6000,fork FILE:send.txt
  • 受信側
socat TCP:sender-host:6000 FILE:recv.txt

ポートフォワーディング

socat TCP-LISTEN:8080,reuseaddr,fork TCP:192.168.1.20:80

(ローカル8080番ポートへの接続をリモートホストの80番ポートに転送)

UNIXドメインソケットと標準出力の接続

socat UNIX:/tmp/mysocket STDOUT

エラー例(存在しないアドレス指定)

socat TCP:localhost:9999 STDOUT

出力例:

2025/08/27 16:22:10 socat[12345] E connect(5, AF=2 127.0.0.1:9999, 16): Connection refused

関連コマンド

  • netcat (nc) : TCP/UDPでシンプルな接続やポートスキャンが可能。
  • nmap : ネットワークスキャンに特化したツール。
  • telnet : TCP接続テストに使われる古いツール。

備考

  • socat は **「ネットワークのスイスアーミーナイフ」**と呼ばれ、netcat より柔軟に使える。
  • root権限が必要なポート(1024以下)にバインドする場合は sudo が必要。
  • 高度な用途では SSL/TLS、シリアル通信、VPN トンネルの作成なども可能。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント