socatコマンドでLinuxのネットワーク通信をデバッグする方法|ポートフォワード・SSL・ファイル転送の実践例

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, ネットワーク > socatコマンドでLinuxのネットワーク通信をデバッグする方法|ポートフォワード・SSL・ファイル転送の実践例
「ポートに接続できているか確認したいのに、ncコマンドでは物足りない」「SSLを含む通信をそのままリレーしてデバッグしたい」
そんな場面で力を発揮するのが 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 より詳細に制御できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

socatとは何か|nc(netcat)との違い

socat は「SOcket CAT」の略で、2つのアドレス(接続先・接続元)を指定して双方向にデータを中継するコマンドです。
基本構文は非常にシンプルです。

# 基本構文 socat [オプション] アドレス1 アドレス2

nc(netcat)と比較したときの主な違いを整理します。
機能 nc(netcat) socat
TCP/UDP
Unix ドメインソケット △(実装依存)
SSL/TLS × ○(openssl必要)
シリアルポート ×
ポートフォワード △(限定的)
接続維持(fork) × ○(-lオプション相当)
nc は手軽さが魅力ですが、SSL や Unix ソケットを扱う場面では socat が必須になります。

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

`-` は STDIO の省略形です。キーボード(標準入力)とTCP接続を双方向につなぎます。

2. 簡易TCPサーバーを立てる

受け側(listen)として socat を使う場合は TCP-LISTEN を指定します。

# ポート8888で待ち受け、受信内容を標準出力に表示する socat TCP-LISTEN:8888 STDIO # 別ターミナルから接続 socat - TCP:localhost:8888 Hello socat!

# サーバー側の出力例 Hello socat!

`fork` オプションを付けると複数クライアントを受け付けられます。

# 複数クライアントを受け付ける(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

これで `http://localhost:8080/` へのアクセスが 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

`bind=127.0.0.1` を指定することで、ループバックインターフェイスだけに限定できます。
不要なポートを外部に露出させないための実務的な使い方です。

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

`verify=0` で証明書の検証をスキップします。オレオレ証明書のテスト時や、証明書失効後の接続確認に使います。

2. SSLポートフォワード(TCP → SSL変換)

平文の TCP を受け付けて SSL で転送するリレーが作れます。

# ローカル8080番(平文TCP)を受けて、443番(SSL)に転送 socat TCP-LISTEN:8080,fork OPENSSL:backend.internal:443,verify=0

SSL を自前で処理できないアプリケーションの前段に置くユースケースで役立ちます。

ファイル転送の実践

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

`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

これにより、TCP しか使えないクライアントから Unix ソケット上の MySQL に接続できます。

トラブルシュート|よくあるエラーと対処

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

本番環境では `verify=0` は使わず、正しい CA 証明書を指定してください。

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
socat は「何でもソケットにつなぐ」ツールです。nc でできないことに直面したとき、真っ先に試してみる価値があります。

・次に読む記事
Linux ポート確認の全コマンド(ss・lsof・netstat)

socat まで使いこなせる力は、ネットワークの「型」を体系的に身につけた先にあります

ポートフォワードや SSL 通信をコマンドラインで自在に扱えるエンジニアは、障害時に手が動く人です。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。