ncコマンドでLinuxの簡易ファイル転送・チャットを行う方法|listen・connect実例

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)LinuxtipsLinuxtips, ネットワーク > ncコマンドでLinuxの簡易ファイル転送・チャットを行う方法|listen・connect実例
「ファイルを別のサーバーへ転送したいけど、SCPは設定が面倒だし、FTPはインストールしていない」
「ちょっと動作確認したいだけなのに、わざわざアプリケーションを立ち上げる必要がある?」

こういった場面で役立つのが nc(netcat)コマンドです。
ncコマンドはTCP/UDPソケットを直接操作できるツールで、ファイル転送・ポートスキャン・簡易チャット・ポートフォワーディングなど、ネットワーク診断の「万能ナイフ」とも呼ばれます。

この記事では、nc の基本概念から、サーバー側(listen)とクライアント側(connect)の実例、ファイル転送・チャット・ポートフォワーディングの実践的な使い方を解説します。
ncatとの違い、セキュリティ上の注意点まで、現場で即使える内容をまとめました。

この記事のポイント

・nc -l ポート番号 でサーバー側がリッスン状態になる
・nc ホスト ポート でクライアントが接続しTCP通信を確立できる
・パイプと組み合わせるだけでファイル転送・チャットが実現できる
・本番環境での常用は避け、一時的な診断ツールとして使うのが鉄則


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

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 でインストールした ncatnc コマンドとして使えます。
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

このone-linerは、一時的なデータ移行やサーバー引っ越しの現場で非常によく使います。
ただし 通信が暗号化されない 点には注意してください。機密データを扱う場合は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

ncat(RHEL系)には --sh-exec--proxy オプションがあり、より洗練された転送が可能です。
本番環境での常用には socatssh -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

確認すべき点は次の3つです。

サーバー側の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

ファイアウォールの詳細は Linux ポート確認の全コマンド で解説しています。

「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サーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Linux無料マニュアルを受け取る >>

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

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

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

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

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

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

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

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

この記事を書いた人

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

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

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