外と通信できないサーバーにrpmパッケージをインストール方法を試しました

### はじめに
内部ネットワーク内にあるwebサーバーは、デフォルトでnet-toolsのパッケージがインストールされてないため、netstatコマンドが使用出来ませんでした。そのため、外と通信できる踏み台サーバーに、net-toolsのパッケージファイルをダウンロードし、webサーバーに上記のパッケージをアップロードしました。
※scpコマンドは非推奨のため、サーバー間のファイル転送には、sftpコマンドを使用しました。

### 前提条件
VirtualBox サーバー1台　踏み台 　　CentOS7　ブリッチ接続
VirtualBox サーバー1台　webサーバー CentOS7　内部ネットワーク
詳細には、以下の構成になっています。
https://qiita.com/gama1234/items/dc6a2b6159d10194a313

## 踏み台サーバーにパッケージファイルのダウンロードを試しました

以下のサイトが大変勉強になりました。
https://geekpeach.net/ja/%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E3%81%AE%E3%81%82%E3%82%8Brpm%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89-yumdownloader-vs-yum-do

#### パッケージファイルのダウンロードが失敗しました

踏み台サーバーにnet-toolsが既にインストールされていたため、パッケージをダウンロード出来ませんでした。
```
[test@localhost ~]$ sudo yum install yum-plugin-downloadonly
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp.tsukuba.wide.ad.jp
Package yum-3.4.3-168.el7.centos.noarch already installed and latest version
```
#### パッケージファイルのダウンロードが成功しました
既にパッケージがインストール済みでも、パッケージをダウンロード出来る手順を試しました。
yum-utilsのパッケージをインストールしました。
```
$ sudo yum install yum-utils
```
net-toolsのパッケージファイルをダウンロード出来ました。!!
```
$ [test@localhost ~]$ sudo yumdownloader net-tools
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp.tsukuba.wide.ad.jp
net-tools-2.0-0.25.20131004git.el7.x86_64.rpm                                                                       | 306 kB  00:00:00
total 308
※yumdownloaderコマンドを実行したフォルダ配下にrpmがダウンロードされました。
[test@localhost ~]$ ls -tlr
-rw-r--r-- 1 root root 312968 Aug 23  2019 net-tools-2.0-0.25.20131004git.el7.x86_64.rpm
[test@localhost ~]$$
```
##  webサーバーにパッケージファイルをアップロードしました
踏み台サーバーにssh接続した後、webサーバーにsftpで接続し、net-toolsのパッケージファイルをアップロードしました

sftpコマンドの使い方は以下のサイトを参考にしました。
https://setechlog.com/sftp-how-to-use/

※sftpコマンドはデフォルトで入っていたため、パッケージのインストールはしていません。

```
#1.webサーバーにsftp接続しました。
[test@localhost ~]$ sftp root@10.0.1.1
root@10.0.1.1's password:
Connected to 10.0.1.1.
sftp>
#2.踏み台サーバーのカレントディレクトリを確認した
sftp> lpwd
Local working directory: /home/test
#3.踏み台サーバーのカレントディレクトリにrpmファイルがあることを確認した
sftp> lls -ltr *rpm
-rw-r--r-- 1 root root 312968 Aug 23  2019 net-tools-2.0-0.25.20131004git.el7.x86_64.rpm
sftp>
#4.webサーバーのカレントディレクトリを確認した
sftp> pwd
Remote working directory: /root
#5.webサーバーのカレントディレクトリを/tmpに移動した
sftp> cd /tmp
sftp> pwd
Remote working directory: /tmp
sftp>
#6.net-toolsのパッケージファイルをwebサーバーへアップロードした
sftp> put *rpm
Uploading net-tools-2.0-0.25.20131004git.el7.x86_64.rpm to /tmp/net-tools-2.0-0.25.20131004git.el7.x86_64.rpm
net-tools-2.0-0.25.20131004git.el7.x86_64.rpm                                           100%  306KB  14.5MB/s   00:00
#7.sftpの接続を終了しました
sftp> bye
```
##  webサーバーにnet-toolsのパッケージファイルをインストールしました
```
net-toolsのパッケージファイルが存在すること確認しました。
[root@localhost tmp]# ls -ltr *rpm
-rw-r--r--. 1 root root 312968 Jun 30 07:18 net-tools-2.0-0.25.20131004git.el7.x86_64.rpm
[root@localhost tmp]#
[root@localhost tmp]#
[root@localhost tmp]# rpm -ivh net-tools-2.0-0.25.20131004git.el7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:net-tools-2.0-0.25.20131004git.el################################# [100%]
[root@localhost tmp]#
[root@localhost tmp]# rpm -qa | grep net-tools
net-tools-2.0-0.25.20131004git.el7.x86_64
```
##  webサーバーでnetstatコマンドが使えることを確認しました
```
[root@localhost tmp]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:46:b7:fe brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.1/24 brd 10.0.1.255 scope global noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet6 ipv6アドレス scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@localhost tmp]#
[root@localhost tmp]#
[root@localhost tmp]# netstat | grep ssh
tcp        0      0 localhost.localdoma:ssh 10.0.1.2:33302          ESTABLISHED
[root@localhost tmp]#
```
### 補足ですが、依存関係を含めてパッケージファイルのインストールを試しました。
tmpフォルダに、phpのパッケージファイルの依存関係も含めてインストールするコマンドを実行しました。

```
[test@localhost tmp]$ sudo yumdownloader --destdir=/tmp --enablerepo=remi --resolve php73
```
インストール中画面
```
[test@localhost tmp]$ pwd
/tmp
[test@localhost tmp]$ ls -tlr
total 0
[test@localhost tmp]$
[test@localhost tmp]$ sudo yumdownloader --destdir=/tmp --enablerepo=remi --resolve php73
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp-srv2.kddilabs.jp
 * remi: ftp.riken.jp
 * updates: ftp-srv2.kddilabs.jp
remi                                                                                                                                                                 | 3.0 kB  00:00:00
remi/primary_db                                                                                                                                                      | 3.3 MB  00:00:00
--> Running transaction check
---> Package php73.x86_64 0:2.0-1.el7.remi will be installed
--> Processing Dependency: php73-runtime(x86-64) = 2.0-1.el7.remi for package: php73-2.0-1.el7.remi.x86_64
--> Processing Dependency: php73-runtime for package: php73-2.0-1.el7.remi.x86_64
--> Processing Dependency: php73-php-common(x86-64) for package: php73-2.0-1.el7.remi.x86_64
--> Processing Dependency: php73-php-cli(x86-64) for package: php73-2.0-1.el7.remi.x86_64
--> Running transaction check
---> Package php73-php-cli.x86_64 0:7.3.33-3.el7.remi will be installed
---> Package php73-php-common.x86_64 0:7.3.33-3.el7.remi will be installed
--> Processing Dependency: php73-php-json(x86-64) = 7.3.33-3.el7.remi for package: php73-php-common-7.3.33-3.el7.remi.x86_64
---> Package php73-runtime.x86_64 0:2.0-1.el7.remi will be installed
--> Running transaction check
---> Package php73-php-json.x86_64 0:7.3.33-3.el7.remi will be installed
--> Finished Dependency Resolution
(1/5): php73-2.0-1.el7.remi.x86_64.rpm                                                                                                                               | 2.3 kB  00:00:00
(2/5): php73-php-common-7.3.33-3.el7.remi.x86_64.rpm                                                                                                                 | 655 kB  00:00:00
(3/5): php73-php-json-7.3.33-3.el7.remi.x86_64.rpm                                                                                                                   |  74 kB  00:00:00
(4/5): php73-runtime-2.0-1.el7.remi.x86_64.rpm                                                                                                                       | 1.1 MB  00:00:00
(5/5): php73-php-cli-7.3.33-3.el7.remi.x86_64.rpm                                                                                                                    | 3.3 MB  00:00:01


```
インストール完了しました。
```
[test@localhost tmp]$ ls -ltr
total 5268
-rw-r--r-- 1 root root 1199552 Feb 20  2019 php73-runtime-2.0-1.el7.remi.x86_64.rpm
-rw-r--r-- 1 root root    2384 Feb 20  2019 php73-2.0-1.el7.remi.x86_64.rpm
-rw-r--r-- 1 root root  670248 Jun  7 18:07 php73-php-common-7.3.33-3.el7.remi.x86_64.rpm
-rw-r--r-- 1 root root   75432 Jun  7 18:07 php73-php-json-7.3.33-3.el7.remi.x86_64.rpm
-rw-r--r-- 1 root root 3439116 Jun  7 18:07 php73-php-cli-7.3.33-3.el7.remi.x86_64.rpm
[test@localhost tmp]$
```
## まとめ
ローカルリポジトリを準備していない環境では、yumコマンドを使用すると、パッケージファイルをインターネット経由で、ダウンロードしようとするため、外と通信できないサーバーでは、yumコマンドは使用できません。

パッケージファイルのインストール方法としては、
Google検索エンジンを使用して、一つづつrpmパッケージファイルを調べてダウンロードした
物をインストールすると、依存関係でひっかかり、インストールが上手くいかないため、お勧めできません。

外と通信できるサーバーに、yumdownloaderコマンドを使用して、依存関係も含めてrpmパッケージ自体をダウンロードした後、内部サーバーに上記のパッケージファイルをアップロードして、インストールする方法もあります。

本投稿のnetstatコマンドは問題なくインストール出来ましたが、
nmapコマンドを同様な手順で、yumdownloaderコマンドを使用してインストールしたところ、依存関係でインストール出来ませんでした。

補足事項ですが、rpmパッケージファイルがすべて揃っていても、インストールする順番によって依存関係でインストール出来ないことがあります。その場合、rpmパッケージファイルが大量にある場合は、インストールにとても苦戦します。
rpmパッケージの依存にひっかかると、一日かけても解決できない場合があり、手間と工数がかかってしまいます。

そのため、rpmパッケージをインストール際は一時的に、内部サーバーにNATを使用して、
外と通信できる状態にして、yumコマンド等を使用して、パッケージをインストールした方が手間がかからないため、個人的には良いと思いました。

セキュリティ的にどうしても内部サーバーが外と通信できない環境もあるため、
NATを使用する以外に、何か良い方法がないか今後勉強が必要だと思ってます。

この記事が参考にして頂ければ幸いです。