【Linuxの勉強】ncコマンドで仮想マシン間のファイル出力を検証する 

最終更新日 2024年10月24日

【Linuxの勉強】ncコマンドで仮想マシン間のファイル出力を検証する 

この記事はこんな人におすすめ!

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コマンドを使用したファイル転送イメージ

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 ~]#

■この作業をするにあたり参照した資料:

Centos7 でポートを開放する方法:コマンドとファイル書き込み | ふらっと考える (omohikane.com)