socat(SOcket CAT)は、任意の2つのデータストリーム間で双方向にデータを転送するためのコマンドです。netcat の上位互換的な位置づけで、TCP/UDP通信、UNIXドメインソケット、シリアルポート、ファイル、標準入出力など多様な組み合わせをサポートします。
構文(Syntax)
socat [オプション] <アドレス1> <アドレス2>
<アドレス>には TCP/UDP ポート、UNIXソケット、ファイル、デバイスなどを指定可能。- アドレス例:
TCP:HOST:PORTUDP:HOST:PORTUNIX:/tmp/socketPTY(仮想端末)STDIO(標準入出力)
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
-d -d | デバッグ情報を詳細に出力 | socat -d -d TCP4-LISTEN:1234,fork STDOUT |
fork | 接続ごとに新しいプロセスを生成(サーバー用途) | socat TCP-LISTEN:8080,fork EXEC:/bin/cat |
reuseaddr | LISTEN時にアドレス再利用を許可 | 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 トンネルの作成なども可能。
参考
- manページ: http://www.dest-unreach.org/socat/doc/socat.html
- ArchWiki(socatの活用例): https://wiki.archlinux.org/title/SoCat

コメント