「ちょっと動作確認したいだけなのに、わざわざアプリケーションを立ち上げる必要がある?」
こういった場面で役立つのが nc(netcat)コマンドです。
ncコマンドはTCP/UDPソケットを直接操作できるツールで、ファイル転送・ポートスキャン・簡易チャット・ポートフォワーディングなど、ネットワーク診断の「万能ナイフ」とも呼ばれます。
この記事では、
nc の基本概念から、サーバー側(listen)とクライアント側(connect)の実例、ファイル転送・チャット・ポートフォワーディングの実践的な使い方を解説します。ncatとの違い、セキュリティ上の注意点まで、現場で即使える内容をまとめました。
この記事のポイント
・nc -l ポート番号 でサーバー側がリッスン状態になる
・nc ホスト ポート でクライアントが接続しTCP通信を確立できる
・パイプと組み合わせるだけでファイル転送・チャットが実現できる
・本番環境での常用は避け、一時的な診断ツールとして使うのが鉄則
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
ncコマンドとは何か?
nc(netcat)は「ネットワークのcat」とも言われるコマンドです。cat コマンドがファイルの内容を標準出力へ流すように、nc はTCP/UDPソケットを通じてデータをやり取りします。通常のネットワーク通信では、アプリケーション層のプロトコル(HTTP、FTPなど)がSocketの上に乗っています。
ncコマンドはそのプロトコル層をすっとばして、SocketレベルでTCP/UDP通信を直接操作できるため、次のような場面で重宝します。
・ポート疎通確認:ファイアウォール越しに特定ポートが開いているか確認する
・簡易ファイル転送:SCPやFTPが使えない環境でのデータ受け渡し
・サービスデバッグ:HTTPリクエストを手動で送りレスポンスを直接確認する
・ポートフォワーディング:特定ポートを別ホスト・別ポートへ転送する
RHEL 9.4 / Ubuntu 24.04 LTS での動作確認環境
本記事の実行例はすべて以下の環境で動作確認しています。# 動作確認環境 # - RHEL 9.4 / Rocky Linux 9.4(nmap-ncatパッケージ) # - Ubuntu 24.04 LTS(netcat-openbsdパッケージ)
ncコマンドの主要実装3種の違い
Linuxで使える「nc」には主に3種類の実装があります。| 実装名 | パッケージ名 | 主なOS | 特徴 |
|---|---|---|---|
| netcat-openbsd | netcat-openbsd | Ubuntu/Debian | -e オプションなし(セキュリティ重視) |
| ncat | nmap-ncat | RHEL/CentOS/Rocky | SSL対応・nmapチームメンテ |
| netcat-traditional | netcat | 古いDebian系 | -e オプションあり(シェル実行可・危険) |
RHEL系では
yum install nmap-ncat でインストールした ncat が nc コマンドとして使えます。Ubuntu系では
apt install netcat-openbsd が推奨です。ncコマンドのインストール
1. RHEL 9 / Rocky Linux 9 / AlmaLinux 9 の場合
# nmap-ncatパッケージをインストール(ncatコマンドがncとしても使えるようになる) $ sudo dnf install -y nmap-ncat # バージョン確認 $ nc --version Ncat: Version 7.93 ( https://nmap.org/ncat ) # または $ ncat --version
2. Ubuntu 24.04 LTS / Debian の場合
# netcat-openbsd をインストール $ sudo apt install -y netcat-openbsd # バージョン確認 $ nc -h OpenBSD netcat (Debian patchlevel 1.219-1ubuntu1)
基本的な使い方 — listen と connect
ncコマンドの基本は「サーバー側(listen)」と「クライアント側(connect)」の2役です。1. サーバー側でポートをリッスンする
まずサーバー側のホストで以下を実行します。# サーバー側: TCPポート 9000 でリッスン開始 $ nc -l 9000 # または明示的にTCPを指定 (RHEL系ncatで推奨) $ nc -l -p 9000
・-l :listenモード(サーバー側として待ち受ける)
・-p ポート番号:待ち受けるポート番号(-l の後ろに数字で直接書ける実装も多い)
2. クライアント側から接続する
別の端末(またはクライアントPC)から次のコマンドで接続します。# クライアント側: サーバー(192.168.1.10)のポート 9000 へ接続 $ nc 192.168.1.10 9000
接続を終了するには両側で Ctrl+D(EOFを送る)または Ctrl+C を押します。
3. ポート疎通確認 (-z -v オプション)
アプリケーションを起動せずに「ポートが開いているか」だけ確認したい場合は-z -v を使います。# ポート 443 が開いているか確認(-z=ゼロIOモード、-v=詳細表示) $ nc -zv 192.168.1.10 443 Connection to 192.168.1.10 443 port [tcp/https] succeeded! # ポートが閉じている場合 $ nc -zv 192.168.1.10 8080 nc: connect to 192.168.1.10 port 8080 (tcp) failed: Connection refused # 複数ポートをまとめて確認(範囲指定) $ nc -zv 192.168.1.10 22 80 443 Connection to 192.168.1.10 22 port [tcp/ssh] succeeded! Connection to 192.168.1.10 80 port [tcp/http] succeeded! Connection to 192.168.1.10 443 port [tcp/https] succeeded!
-w タイムアウト秒 を追加すると、接続タイムアウトを制御できます。# 3秒でタイムアウトする疎通確認 $ nc -zv -w 3 192.168.1.10 3306
応用・実務Tips
1. 簡易ファイル転送
ncコマンドのもっとも実用的な使い方の一つが、サーバー間のファイル転送です。SCPが使えない、鍵交換が面倒な場面でも、同一ネットワーク内なら nc で即座に転送できます。
受信側(サーバー側)で先にリッスンを開始します。
# 受信側: ポート9000で待ち受け、受信データをファイルに書き出す $ nc -l 9000 > received_file.tar.gz
# 送信側: ファイルを標準入力からncへパイプ $ nc 192.168.1.10 9000 < backup.tar.gz # 転送完了の確認(受信側で) $ ls -lh received_file.tar.gz -rw-rw-r-- 1 ec2-user ec2-user 248M May 23 10:15 received_file.tar.gz
tar を組み合わせます。# 受信側: tarで展開しながら受け取る $ nc -l 9000 | tar xzvf - # 送信側: ディレクトリをtarで圧縮しながら流す $ tar czvf - /var/www/html/ | nc 192.168.1.10 9000
ただし 通信が暗号化されない 点には注意してください。機密データを扱う場合はSSHポートフォワーディング経由か、ncatのSSLオプション(後述)を使います。
2. 簡易チャット(ターミナル間の双方向通信)
両端末でnc をlistenに対してconnectするだけで、リアルタイムのテキスト通信ができます。これはLinuxサーバー間でメッセージを素早くやり取りする場面や、VMとホストPC間の動作確認に使えます。
# サーバー側 [server]$ nc -l 9000 # クライアント側 [client]$ nc 192.168.1.10 9000 # クライアントで入力した文字がサーバー側に表示される(双方向)
3. HTTPリクエストを手動で送る
Webサーバーへ手動でHTTPリクエストを送り、生のレスポンスを確認する用途でも nc は役立ちます。curlが使えない環境でのデバッグや、Apacheの設定確認に使えます。
# Webサーバーへ手動でGETリクエストを送る $ printf "GET / HTTP/1.0\r\nHost: localhost\r\n\r\n" | nc localhost 80 HTTP/1.1 200 OK Date: Fri, 23 May 2026 01:10:00 GMT Server: Apache/2.4.62 (Rocky Linux) Content-Type: text/html; charset=UTF-8 ...
4. ポートフォワーディング(ローカル転送)
特定のポートへ来た通信を別のホスト・ポートへ転送する簡易プロキシとして使えます。# ローカルの8080ポートへの通信をリモート(192.168.1.20)の80へ転送(mkfifoを使う手法) $ mkfifo /tmp/nc_pipe $ nc -l 8080 < /tmp/nc_pipe | nc 192.168.1.20 80 > /tmp/nc_pipe # 転送が終わったらパイプを削除 $ rm /tmp/nc_pipe
--sh-exec や --proxy オプションがあり、より洗練された転送が可能です。本番環境での常用には
socat や ssh -L の利用を検討してください。5. ncatのSSL暗号化通信
ncat(RHEL系)は--ssl オプションでSSL/TLS暗号化通信をサポートしています。機密性が必要なファイル転送や、暗号化した疎通確認に使えます。
# サーバー側: SSLリッスン(証明書はncat自動生成) $ ncat --ssl -l 9443 > received_file.txt # クライアント側: SSL接続(証明書検証なし・テスト用) $ ncat --ssl 192.168.1.10 9443 < send_file.txt
ncatとnetcat-openbsdの違い
RHEL系のncat とUbuntu系の netcat-openbsd は、ともに nc コマンドとして使えますが、オプションに差異があります。| 機能 | ncat(RHEL系) | netcat-openbsd(Ubuntu系) |
|---|---|---|
| listenオプション | nc -l -p 9000 または nc -l 9000 |
nc -l 9000 |
| SSL暗号化 | ncat --ssl |
非対応 |
| IPv6 | nc -6 |
nc -6 |
| UDPモード | nc -u |
nc -u |
| ポート範囲スキャン | 非対応(nmapを使う) | nc -zv host 22-80 |
| keep-open(複数接続受け付け) | ncat -k -l 9000 |
非対応 |
スクリプト内でncコマンドを使う場合は、実行環境に合わせてオプションを調整するか、実装の違いを吸収する処理を入れてください。
詳細な Linux ポート確認の全コマンド(ss・lsof・netstatの比較)も参考になります。
トラブルシュート・エラー対処
「Connection refused」が出た場合
$ nc -zv 192.168.1.10 9000 nc: connect to 192.168.1.10 port 9000 (tcp) failed: Connection refused
・サーバー側のncが起動しているか:
ss -tlnp | grep 9000 でリッスン状態を確認・ファイアウォールでブロックされていないか:
firewall-cmd --list-all でポート許可を確認・IPアドレスが正しいか:
ip a でサーバーの実際のIPを確認一時的なテスト目的でポートを開ける場合は次のコマンドを使います。
# firewalld(RHEL系): ポート9000/tcpを一時的に許可 $ sudo firewall-cmd --add-port=9000/tcp # テスト終了後は削除 $ sudo firewall-cmd --remove-port=9000/tcp
「Address already in use」が出た場合
$ nc -l 9000 Ncat: bind to 0.0.0.0:9000: Address already in use. QUITTING.
# ポート9000を使っているプロセスを確認 $ ss -tlnp | grep 9000 LISTEN 0 128 0.0.0.0:9000 0.0.0.0:* users:(("nc",pid=12345,fd=4)) # 該当プロセスを停止してから再実行 $ kill 12345
ncコマンドが見つからない場合
# RHEL系: インストール確認 $ rpm -q nmap-ncat package nmap-ncat is not installed # インストール $ sudo dnf install -y nmap-ncat # Ubuntu系: インストール確認 $ dpkg -l netcat-openbsd # インストール $ sudo apt install -y netcat-openbsd
セキュリティ上の注意点
ncコマンドは強力ですが、誤用するとセキュリティリスクになります。現場で守るべきルールをまとめます。
・-e オプション(シェル実行)は絶対に使わない:
netcat-traditional の -e /bin/sh はリバースシェルを作れるため、本番環境では使わない・listenポートはテスト中のみ開放する:作業終了後は必ず Ctrl+C でncを終了する
・通信は平文:標準の nc は暗号化しないため、内部ネットワーク限定で使う。外部への転送はncatのSSLか
ssh -L を使う・1518番以下のポートはrootが必要:1024番未満のポートをlistenする場合は
sudo が必要postfix mynetworks の書き方はこちら など、サーバー間通信の設定と組み合わせる際も、通信の暗号化・認証の有無を必ず確認してください。
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| ポートをリッスンする(サーバー側) | nc -l 9000 |
| ホストのポートへ接続する | nc 192.168.1.10 9000 |
| ポートの疎通確認 | nc -zv 192.168.1.10 443 |
| タイムアウト付き疎通確認 | nc -zv -w 3 192.168.1.10 3306 |
| ファイルを受信する | nc -l 9000 > received_file.tar.gz |
| ファイルを送信する | nc 192.168.1.10 9000 < send_file.tar.gz |
| ディレクトリをtar圧縮して転送 | tar czvf - /var/www/html/ | nc 192.168.1.10 9000 |
| HTTPリクエストを手動送信 | printf "GET / HTTP/1.0\r\nHost: localhost\r\n\r\n" | nc localhost 80 |
| SSL暗号化転送(ncat) | ncat --ssl -l 9443 > received.txt |
| UDPモードで接続 | nc -u 192.168.1.10 9000 |
ncコマンドはLinuxエンジニアの「ツールベルト」の中でも特に汎用性が高いコマンドです。
ポートの疎通確認、一時的なファイル転送、サービスのデバッグ……どれも数秒で実行できます。
ただし、平文通信・listenポートの解放・-e オプションのリスク の3点は必ず頭に入れておいてください。
使い終わったらncプロセスを必ず終了する習慣をつけることが、安全なnc活用の第一歩です。
なお、ポート確認には Linux ポート確認の全コマンド(ss・lsof・netstat) も合わせてご覧ください。
ネットワーク接続の全体像を把握することで、ncコマンドをより効果的に使えるようになります。
Linux無料マニュアルを受け取る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:ip routeコマンドでLinuxのルーティングテーブルを確認・設定する方法|静的ルート追加とトラブルシュートも
- この記事の属するカテゴリ:Linuxtips・ネットワークへ戻る

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