そんな場面で力を発揮するのが socat(SOcket CAT) コマンドです。
socatはあらゆる種類のソケット・ファイル・デバイスを相互に接続できる汎用の双方向通信ツールです。
ncコマンドより機能が豊富で、TCP/UDP はもちろん、Unix ドメインソケット・SSL/TLS・シリアルポートまで扱えます。
この記事では、socatコマンドの基本的な使い方から、ポートフォワード・SSL通信テスト・ファイル転送といった実務でよく使うパターンまでを体系的に解説します。
RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済みです。
この記事のポイント
・socat はアドレスを2つ指定し、双方向にデータを中継する
・TCP/UDP・Unix ソケット・SSL・シリアルを同一構文で扱える
・ポートフォワードはローカル/リモート両方を1コマンドで実現できる
・ファイル転送・SSL テストを nc より詳細に制御できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
socatとは何か|nc(netcat)との違い
socat は「SOcket CAT」の略で、2つのアドレス(接続先・接続元)を指定して双方向にデータを中継するコマンドです。基本構文は非常にシンプルです。
# 基本構文 socat [オプション] アドレス1 アドレス2
| 機能 | nc(netcat) | socat |
|---|---|---|
| TCP/UDP | ○ | ○ |
| Unix ドメインソケット | △(実装依存) | ○ |
| SSL/TLS | × | ○(openssl必要) |
| シリアルポート | × | ○ |
| ポートフォワード | △(限定的) | ○ |
| 接続維持(fork) | × | ○(-lオプション相当) |
socatのインストール
1. RHEL 9 / Rocky Linux 9 / AlmaLinux 9 の場合
# EPELリポジトリを有効にしてからインストール sudo dnf install -y epel-release sudo dnf install -y socat
2. Ubuntu 24.04 LTS の場合
sudo apt-get install -y socat
3. バージョン確認
socat -V socat, version 1.8.0.0 2023-01-17 ...
socatのアドレス型一覧
socat はアドレス型(address type)の組み合わせで動作が変わります。主なものを押さえておきましょう。| アドレス型 | 意味 | 例 |
|---|---|---|
| TCP:host:port | TCP 接続(クライアント側) | TCP:192.168.1.10:80 |
| TCP-LISTEN:port | TCP 待ち受け(サーバー側) | TCP-LISTEN:8080,fork |
| UDP:host:port | UDP 送信 | UDP:10.0.0.1:514 |
| UNIX-CONNECT:path | Unix ソケット接続 | UNIX-CONNECT:/var/run/docker.sock |
| OPENSSL:host:port | SSL/TLS 接続 | OPENSSL:example.com:443 |
| STDIO | 標準入出力 | STDIO(省略時は -) |
| FILE:path | ファイル | FILE:/tmp/test.txt,creat |
基本的な使い方
1. TCP接続テスト(echoサーバーに接続)
最も単純な使い方は、TCPポートへの接続確認です。# TCPポート80に接続して標準入出力とやり取りする socat - TCP:example.com:80 # 実行すると接続が確立し、キーボード入力を送れる GET / HTTP/1.0 Host: example.com
2. 簡易TCPサーバーを立てる
受け側(listen)として socat を使う場合は TCP-LISTEN を指定します。# ポート8888で待ち受け、受信内容を標準出力に表示する socat TCP-LISTEN:8888 STDIO # 別ターミナルから接続 socat - TCP:localhost:8888 Hello socat!
# サーバー側の出力例 Hello socat!
# 複数クライアントを受け付ける(fork: 接続ごとに子プロセスを生成) socat TCP-LISTEN:8888,fork STDIO
3. UDPで接続する
UDP も同じ構文で扱えます。syslog の動作確認などに使います。# UDPでsyslogサーバー(514番)にテストメッセージを送る echo "test message from socat" | socat - UDP:10.0.0.1:514
ポートフォワーディングの実践
socat のポートフォワード機能は、SSHが使えない環境やデバッグ時に重宝します。1. ローカルポートフォワード(リモートサービスをローカルに引き込む)
# ローカルの8080番を受け付けて、192.168.1.20:80 に転送する socat TCP-LISTEN:8080,fork,reuseaddr TCP:192.168.1.20:80
`reuseaddr` を付けると、プロセス再起動直後でもすぐにポートを再利用できます。
2. 実サーバーでの出力例
# サーバー上で実行 [ops@svr01 ~]$ socat TCP-LISTEN:8080,fork,reuseaddr TCP:192.168.10.50:3306 & [1] 23041 # 別ターミナルから確認 [ops@svr01 ~]$ ss -tlnp | grep 8080 LISTEN 0 5 0.0.0.0:8080 0.0.0.0:* users:(("socat",pid=23041,fd=5))
3. 特定のインターフェイスにバインドする
# 127.0.0.1 のみで受け付けて転送(外部からは接続不可) socat TCP-LISTEN:8080,bind=127.0.0.1,fork,reuseaddr TCP:192.168.1.20:80
不要なポートを外部に露出させないための実務的な使い方です。
SSL/TLS通信のテスト
socat は OPENSSL アドレス型を使って SSL/TLS 接続をそのまま扱えます。1. SSL接続して生のHTTPSリクエストを送る
# SSL/TLS でサーバーに接続(証明書検証なし) socat - OPENSSL:example.com:443,verify=0 # 接続後に HTTP リクエストを送る GET / HTTP/1.1 Host: example.com Connection: close
2. SSLポートフォワード(TCP → SSL変換)
平文の TCP を受け付けて SSL で転送するリレーが作れます。# ローカル8080番(平文TCP)を受けて、443番(SSL)に転送 socat TCP-LISTEN:8080,fork OPENSSL:backend.internal:443,verify=0
ファイル転送の実践
1. サーバー側でファイルを送信する
# 送信側(サーバー): /tmp/backup.tar.gz を待ち受けポート9999から送る socat TCP-LISTEN:9999 FILE:/tmp/backup.tar.gz
2. 受信側でファイルを受け取る
# 受信側: 送信側に接続してファイルを受け取る socat TCP:192.168.1.10:9999 FILE:/tmp/received.tar.gz,creat
nc と違い socat はバイナリデータをそのまま扱えるため、破損の心配が少ないです。
Unix ドメインソケットへの接続
Docker の管理ソケットや MySQL のソケットに直接アクセスするときに使います。1. Docker daemon のソケットに接続してAPIを叩く
# Docker ソケット(Unix ドメインソケット)に HTTP リクエストを送る echo -e "GET /containers/json HTTP/1.0\r\n" | \ socat - UNIX-CONNECT:/var/run/docker.sock
# 出力例(接続中のコンテナ一覧がJSONで返ってくる) HTTP/1.1 200 OK Content-Type: application/json ... [{"Id":"a3f2c...","Names":["/web01"],...}]
2. MySQL ソケットを TCP としてエクスポート
# /var/lib/mysql/mysql.sock を TCP 3307 番として外部に公開 socat TCP-LISTEN:3307,fork UNIX-CONNECT:/var/lib/mysql/mysql.sock
トラブルシュート|よくあるエラーと対処
1. socat: E bind(5, {AF=2 0.0.0.0:8080}, 16): Address already in use
ポートがすでに使われています。# 使用中のプロセスを確認する ss -tlnp | grep 8080 # または lsof で確認 lsof -i :8080
また、直前の socat プロセスが残っている場合は `reuseaddr` を付けておくと再起動が楽になります。
既存のポート確認の詳細は、Linux ポート確認の全コマンドも参考にしてください。
2. socat: E connect(5, AF=2 192.168.1.20:80, 16): Connection refused
接続先のポートが開いていないか、サービスが停止しています。# 接続先のポートが開いているか確認 socat - TCP:192.168.1.20:80,connect-timeout=3 # firewalld でブロックされていないか確認(接続先サーバーで実施) firewall-cmd --list-all
3. OPENSSL 接続時に「certificate verification failed」
証明書の検証に失敗しています。テスト目的なら `verify=0` を追加します。# 証明書検証をスキップ(テスト環境のみ) socat - OPENSSL:target.example.com:443,verify=0
4. socat: E socket(2, 1, 6): Permission denied
特権ポート(1024番以下)を使おうとしています。sudo で実行してください。# 443番など特権ポートはsudoが必要 sudo socat TCP-LISTEN:443,fork,reuseaddr TCP:backend:8443
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| TCPポートに接続してテスト | socat - TCP:host:port |
| TCP待ち受けサーバーを立てる | socat TCP-LISTEN:port,fork STDIO |
| ポートフォワード(ローカル→リモート) | socat TCP-LISTEN:8080,fork,reuseaddr TCP:host:80 |
| SSL接続テスト(証明書検証なし) | socat - OPENSSL:host:443,verify=0 |
| ファイルを送信する | socat TCP-LISTEN:9999 FILE:/path/to/file |
| ファイルを受信する | socat TCP:host:9999 FILE:/path/to/save,creat |
| Unix ソケットにHTTPリクエストを送る | socat - UNIX-CONNECT:/var/run/docker.sock |
| 平文TCPをSSLに変換してリレー | socat TCP-LISTEN:8080,fork OPENSSL:host:443,verify=0 |
・次に読む記事
・Linux ポート確認の全コマンド(ss・lsof・netstat)
socat まで使いこなせる力は、ネットワークの「型」を体系的に身につけた先にあります
ポートフォワードや SSL 通信をコマンドラインで自在に扱えるエンジニアは、障害時に手が動く人です。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:expectコマンドでLinuxの対話型処理を自動化する方法|パスワード入力・SSHログイン・telnetの自動操作実践例
- 前のページへ:flockコマンドでシェルスクリプトの排他制御を行う方法|二重実行防止とロックファイルの実践例
- この記事の属するカテゴリ:Linuxtips・ネットワークへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます