最終更新日 2024年10月24日
この記事はこんな人におすすめ!
ncコマンドの使用方法を知りたい
仮想マシンを使用して実際にファイルを転送してみたい
ファイル転送でncコマンドを使用した場合、どのような動作をするのか知りたい
記事の概要
ncコマンドをどのように使用するのか、実際に使用した場合、どのような動作をするのか知るために、
Linuxで仮想マシンを2つ使用して、ncコマンドでファイルの内容を仮想マシン同士で送るという
検証をしました。検証の際、実際にどのような動作でファイルの内容が転送されるのか
詳しく記載しています。
また、ncコマンドの使用法についてもわかりやすく記載しています。
Linuxの勉強をしている方にはとてもオススメです!
なぜなら、仮想マシンを使用して1から設定を行っているため、ncコマンドでファイルを転送するために
必要な設定が全部わかります。
ncコマンドを利用するには、ファイアウォールに穴あけをしたりと、様々な設定が必要になります。
そのため、実際にncコマンドを使用するために必要な情報を身に着けることが出来ます。
ncコマンドについて
ncコマンドはホストからホストへ、データや、ファイルの内容を転送したりすることが出来ます。
NetCatコマンドを省略したもので、実際にデータを転送るときには、TCP、UDPのプロトコルを使用して
データを転送します。
ncコマンドの検証内容
検証で使用する環境
<検証で使用するもの>
・VMware 仮想マシンA Centosバージョン7
・VMware 仮想マシンB Debian 11x
※上記の仮想マシンA、Bはデフォルトの設定状態で使用。(仮想マシン出来立てほやほや)
※WindowsのPC(メモリ8G)で上記の2種類の仮想マシンを動作させました。
そのため、メモリの使用率が高かったです。
検証で行う作業
今回は仮想マシン2台でncコマンドを使用してファイルの内容を転送します。
事前に転送するファイルを作成しておき、ファイアウォールで穴あけ作業をしてから
ncコマンドを使用して、実際にファイルの内容を転送します。
具体的に対応する作業の内容と手順を以下にまとめました。
1.仮想マシンB⇒仮想マシンAにテキストファイルの内容を出力。
2.仮想マシンAは12345番ポートで待ち受け。
3.仮想マシンAは12345ポートで受信したファイルの内容をテキストファイルに出力。
4.仮想マシンAのファイヤーウォールで12345ポートを穴あけ。
検証内容イメージ
ncコマンド(netcat)のインストール方法
ncコマンドを使用するためにパッケージのインストールを行います。
※インストール済みの方は対応不要です。
epel-releaseパッケージのインストール
netcatパッケージをインストールするために、まず、epel-releaseパッケージをインストールする
必要があります。
インストールするコマンドは↓のコマンドです。
yum -y install epel-release
※yumの-yオプションは、すべての問い合わせに対してyesと回答するオプションです。
簡単にepel-releaseパッケージについて説明します。
epel-releaseとは:
epel-releaseは、yum用のレポジトリです。
レポジトリとは、yum install コマンドを実行した際に、インターネットからパッケージをダウンロード、インストールしますが、
その際にダウンロード、インストールする場所(パッケージが蓄積されている保管場所)のことです。
netcatコマンドは、epel-releaseのパッケージの中にあるので、epel-releaseパッケージをインストールすることで、
インストールすることが可能になります。
netcatパッケージのインストール
netcatパッケージのインストールは↓のコマンドでインストールする出来ます。
yum -y install netcat
以上でncコマンドが使用できるようになりました!
ncコマンドのオプション・業務でよく使う使い方
ncコマンドで使用できるオプションや、業務でよく使用する使い方をご紹介します。
クライアントとして動作させる方法
ncコマンドでよく使用される使い方として、確認したい対象のサーバーのホストに対して、ポートを指定し、
クライアントとして動作させ、疎通確認を行うという使い方をします。
その際のncコマンドの使用法は以下です。
nc 対象のホスト(IPアドレスやホスト名)ポート番号
[root@centosvm]# nc 8.8.8.8 12345
TCPではなく、UDPで疎通の確認を行う場合は、「-u」オプションを使用する。
nc -u 対象のホスト(IPアドレスやホスト名)ポート番号
[root@centosvm]# nc -u 8.8.8.8 12345
サーバーとして動作させる方法
ncコマンドでサーバーとして動作させ、1時的に指定したポートで待ち受けをするには↓のコマンドを使用します。
※このコマンドは一度クライアントとの通信に成功するとポートが閉じてしまいます。
<TCPのポートで待ち受ける場合>
nc -l ポート番号
<UDPのポートで待ち受ける場合>
nc -ul ポート番号
ncコマンドを使用して、サーバー側でずっとポートを開けさせたいときは、TCPでは「-k」、
UDPでは「-e ‘cat’」でポートを解放することが出来る。
<TCPの場合>
nc -kl ポート番号
<UDPの場合>
nc -e /bin/cat -ul ポート番号
ファイルの転送方法
ncコマンドを使用して直接クライアントとサーバーでファイルを転送する際に使用する方法です。
<サーバーからクライアントにファイルを転送する際に使用するコマンド>
サーバーで転送するファイルを指定し、ポートを解放。
クライアントで、転送されたファイルを受け取り、ファイルに出力します。
サーバ側:nc -l ポート番号 < 転送するファイルのパス
クライアント側:nc 対象のホスト(IPアドレスもしくはホスト名) ポート番号 > 受け取ったファイルを出力するパス
<クライアント側からサーバー側にファイルを転送るする方法>
サーバー側でポートを解放し、ファイルを受け取った際の出力先を指定。
クライアント側で転送するファイルの指定。
サーバ側:nc -l ポート番号 > 受け取ったファイルを出力するパス
クライアント側:nc 対象のホスト(IPアドレスもしくはホスト名) ポート番号 < 転送するファイルのパス
仮想マシン間でファイルを転送るための事前準備
ここからは仮想マシン間でncコマンドを使用してファイルを転送する作業を行っていきます。
ncコマンドを使用して、ファイルの内容を転送する前に、2つ事前に準備を行います。
・仮想マシンBで、転送するファイルを作成。
・仮想マシンAで12345番ポートを穴あけ。
仮想マシンBで、転送するファイルを作成
仮想マシンB(ファイルを転送する側)で転送するファイルを作成します。
今回はファイル「test.log」を作成し、中身に日付を入れています。
ファイルの中に入れる内容はなんでも大丈夫です。
仮想マシンAで12345番ポートを穴あけ(ファイアウォールの設定変更)
1.仮想マシンAで待ち受けしているポートを確認
コマンド:firewall-cmd --list-all
「ports:」の項目で何も記載されていないことから、12345番ポートはまだ解放されていないことが分かります。
[root@goritarou ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
2.12345番ポートを解放するためにコマンドを入力。
コマンド:firewall-cmd --zone=public --add-port=12345/tcp --permanent
※一時的にポートを解放するのであれば「–permanent」は不要です。「–permanent」を使用するとポートが解放されたままです。
※上記のコマンドはrootの権限で実行する必要があります。
[root@goritarou ~]# firewall-cmd --zone=public --add-port=12345/tcp --permanent
success
3.ファイアウォールを再起動する。
※ファイアウォールを再起動させないとポートを解放させても設定が反映されません。
コマンド:systemctl restart firewalld.service
[root@goritarou ~]# systemctl restart firewalld.service
[root@goritarou ~]#
4.ポートが解放されたか確認する。
コマンド:firewall-cmd --list-all
「ports:」の項目でtcpの12345番ポートが解放されたことが確認できます。
[root@goritarou ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports: 12345/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
<補足>
ファイアウォールの設定を変更させてポートを解放する方法で、ファイルを編集する方法もあったので、記載します。
ファイアウォールの設定ファイルは「/usr/lib/firewalld/services/」のディレクトリにあります。
このディレクトリの中にあるファイルを編集することでポートを解放するすることが出来ます。
[root@goritarou ]# cd /usr/lib/firewalld/services/
[root@goritarou services]# ls -l
合計 616
-rw-r--r--. 1 root root 786 4月 28 2021 RH-Satellite-6-capsule.xml
-rw-r--r--. 1 root root 741 4月 28 2021 RH-Satellite-6.xml
-rw-r--r--. 1 root root 412 4月 28 2021 amanda-client.xml
-rw-r--r--. 1 root root 447 4月 28 2021 amanda-k5-client.xml
-rw-r--r--. 1 root root 273 4月 28 2021 amqp.xml
-rw-r--r--. 1 root root 283 4月 28 2021 amqps.xml
-rw-r--r--. 1 root root 285 4月 28 2021 apcupsd.xml
-rw-r--r--. 1 root root 301 4月 28 2021 audit.xml
-rw-r--r--. 1 root root 320 4月 28 2021 bacula-client.xml
-rw-r--r--. 1 root root 346 4月 28 2021 bacula.xml
-rw-r--r--. 1 root root 339 4月 28 2021 bgp.xml
-rw-r--r--. 1 root root 275 4月 28 2021 bitcoin-rpc.xml
-rw-r--r--. 1 root root 307 4月 28 2021 bitcoin-testnet-rpc.xml
-rw-r--r--. 1 root root 281 4月 28 2021 bitcoin-testnet.xml
-rw-r--r--. 1 root root 244 4月 28 2021 bitcoin.xml
-rw-r--r--. 1 root root 294 4月 28 2021 ceph-mon.xml
以下省略
上記のファイルの中身は↓のような構成になっています。
[root@goritarou services]# cat ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>
ファイルを編集する手順
・/usr/lib/firewalld/services/の中にpublicなどというファイル名のファイルがあると思うのでそのファイルに以下を追加する。
<port protocol=”tcp” port=”12345″/>
「ssh.xml」を例にとると↓の太文字の部分に追加する。
[root@goritarou services]# cat ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
<port protocol="tcp" port="12345"/> ←この部分
</service>
・ファイアウォールを再起動する。
ncコマンドを実行
仮想マシンAで12345番ポートで待ち受けをし、受け取ったデータをファイルに出力する
コマンド:nc -l -p 12345 -o test.log
[root@goritarou ~]# nc -l -p 12345 -o test.log
仮想マシンBで、上記の待ち受けをしているホストの12345番ポートに対し、ファイルの内容を出力する
コマンド:nc goritaou.com 12345 < test.log
[root@goritarou ~]# nc goritaou.com 12345 < test.log
仮想マシンAでファイルの内容が受け取れたことを確認
※今回は日付の内容を転送しているため、日付の内容が表示されています。
[root@goritarou ~]# nc -l -p 12345 -o test.log
2022年 8月 9日 火曜日 10:46:17 JST
[root@goritarou ~]# ^C
[root@goritarou ~]#
[root@goritarou ~]# cat test.log
2022年 8月 9日 火曜日 10:46:17 JST
[root@goritarou ~]#
■この作業をするにあたり参照した資料: