🔥

第3話 centOS7 SSH接続の構築編 ~ 実践!Hyper-Vで開発環境構築! CentOS7+VSCode+Laravel

2024/06/12に公開

はじめに

これは初めてhyper-VでCentOS7を使用する人向けの記事です

前提

  • Hyper-Vにインストール済みのCentOS7(ver: 7.9)
    CentOS7のバージョン確認するにはCentOSを起動して以下コマンドを実行してください。

    CentOS7
    cat /etc/centos-release
    

    Linux release 7.9.2009 (core)
    と表示されればOKです

    もしそうでなければ、以下記事を参考に導入してから本記事を閲覧頂ければと思います。

  • 構成

    • hyper-V
      ネットワークアダプタ: Default Switch

    • CentOS7
      version: 7.9
      インストールソフトウェア: 最小限のインストール
      状態: インストール直後

※実践!Hyper-Vで開発環境構築! CentOS7+VSCode+Laravel
 第1~2話を完了後の状態を想定しています。

本題

この記事ではHyper-V上にインストールしたCentOS7にSSHで接続するための
構築手順を解説します。

1.なぜSSHで接続できるようにするのか?

確かに、Hyper-Vで接続すれば基本的に全てのことはそれだけで出来ます。
しかし、管理OSとゲストOS間でコピペが出来ないため、不便が多いのが実情です。
あとは、ウィンドウのサイズ変更が出来ないため他のウィンドウのでの内容を参照しながら
(例えばググった内容を基に作業する場合など)
の作業がやりにくいという問題もあります。
また、vscodeによるリモート開発環境を構築する上でもSSHは必須要件になります。

そのため、今後の作業を楽に出来るようにするためSSH接続を構築していきます。

2.SSHの設定について考えてみる

実は、今のままでもSSH接続はできます。

CentOS7のIPアドレスを確認

CentOS7
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:96:3f:0d brd ff:ff:ff:ff:ff:ff
    inet 172.20.229.244/20 brd 172.20.239.255 scope global noprefixroute dynamic eth0
       valid_lft 62153sec preferred_lft 62153sec
    inet6 fe80::7b58:efe7:d3b7:d130/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

2: eth0: 内のinetを確認すると
どうやら私の場合IPアドレスは172.20.229.244のようです。
ということは・・・?

コマンドプロンプト
ssh root@172.20.229.244
コマンド結果
root@172.20.229.244's password:
Last login: Mon Jun 10 20:30:59 2024 from omen17.mshome.net
[root@CentOS7 ~]#

おお!SSH接続が出来た!!

では、今回の記事はこれにて!・・・となるでしょうか?
確かに、SSH接続自体はできました。

しかし、これでは問題があります。それは・・・
再起動するとIPアドレスが変わってしまうということです。

IPアドレスがころころ変わってしまうとその都度現在のIPアドレスを調べて
それに合わせてSSH接続しなければなりません。
そのような状況だと予め接続情報を設定しておくことも難しいでしょう。
そのためまず1.IPアドレスの固定化はした方が良さそうです。

次に、現在は最初に設定したパスワードrootを入力していますが
これもやはり接続する度に入力する必要があります。

これは正直めんどくさいです。
せっかくなので2.SSH鍵を作成して認証を鍵で済ませてしまいましょう。
今後本番環境にアプリをデプロイするときはSSH鍵は必須になるでしょう。

結論、以下2つを理由にしてSSH接続を出来るようにしてみましょう。
※ もちろん、これらの以外にも理由は色々あります。

1.IPアドレスの固定化
2.SSH鍵を作成

3.IPアドレスの固定化をやってみる

IPアドレスの固定化をするために必要なことは以下の4つです。

1.Hyper-Vで内部ネットワークアダプタを作成する
2.作成した内部ネットワークアダプタに固定IPを設定する
3.CentOS7でネットワークの設定をする
4.NATを設定して外のネットワークと通信出来るようにする

では、簡単に説明を

1.Hyper-Vで内部ネットワークアダプタを作成する
これはIP固定化のために必要な仕込みです。

2.作成した内部ネットワークアダプタに固定IPを設定する
これはCentOS7でのネットワーク設定にはデフォルトゲートウェイとして使用されます。
これもIP固定化のために必要な仕込みです。

3.CentOS7でネットワークの設定をする
これを行うと管理OSからホストOS間へ通信が出来るようになります。
そして管理OSから見たホストOSのIPアドレスが固定になります。
ただし、まだホストOSからは外への通信が出来ないので
ネットワーク上のリポジトリからソフトウェアをインストールするときなどは
出来なくはないですが大変不便です。

4.NATを設定して外のネットワークと通信出来るようにする
NATというものを設定するとなんと内部ネットワークと言いつつも外への通信が
出来る
ようになります。
何かと外との通信は頻繁に行いますので、ここを目指して作業をしていきましょう!

1.Hyper-Vで内部ネットワークアダプタを作成する

winキーまたはwinキー + Rで検索窓を表示して
virtmgmt.mscと入力してenter

このようなウィンドウが表示されたら

右側[操作]ペインにある[仮想スイッチ マネージャー...]を選択します。

このようなウィンドウが表示されたら
内部を選択して仮想スイッチの作成(S)を選択。

このようなウィンドウが表示されたら
赤枠の部分を設定していきます。

名前
今回はMyInternalとしました。

メモ
任意ですが、今回は分かりやすく説明を添えました。

設定に問題なければ適用(A)を選択。

無事、新しい仮想スイッチMyInternalが作成されました。
今後はこれを使用していきます。

OK(O)で画面を閉じたあとは以前にインストールしたCentOS7のネットワークアダプタ
変更していきます。

中央[仮想マシン]ペインにある[CentOS7]を右クリック、設定(E)...を選択。

ネットワークアダプターを選択
仮想スイッチ(S)Default SwitchになっているのでそれをMyInternalに変更
適用(A)を選択
これで設定完了。OK(O)で画面を閉じます。

2.作成した内部ネットワークアダプタに固定IPを設定する

次に、作成した内部ネットワークのアダプタに固定IPを設定します。

winキーまたはwinキー + Rで検索窓を表示して
ncpa.cplと入力してenter

このようなウィンドウが表示されたら
vEthernet(MyInternal)を右クリックプロパティを選択。

少し下にスクロールするとあるインターネット プロトコル バージョン 4 (TCP/IPv4)
ダブルクリック

このようなウィンドウが表示されると思います。
これはDHCP設定のようです。しかし、これではIPがころころ変わってしまうので
ここから固定IPを設定していきます。

今回は
IPアドレス: 172.16.10.1
サブネット: 255.255.255.0

で設定しました。

3.CentOS7でネットワークの設定をする

ここまでで、内部ネットワークを作成して固定IPを設定しました。
しかし、まだ通信はできません。
あともう一息、CentOS7でネットワークの設定をする必要があります。

では、Hyper-VからCentOS7にログインしましょう。

ログインしたら以下のコマンドを実行。

CentOS7
nmtui

このような画面が表示されます。
ここからCentOS7のネットワーク設定を行っていきます。

Edit a Connectionを選択。次にeth0を選択。


このような画面が表示されたらここから具体的な設定を行います。

① IPv4 CONFIGURATION の show を enter
② IPv4 CONFIGURATION を Manualに変更
③ Addressを設定
 今回は172.16.10.2/24としています。
④ GateWayを設定
 内部ネットワークアダプタに設定したIPアドレスを指定
⑤ DNS serverを設定
 Add...を選択して1.1.1.1を指定

OKを選択

Backを選択
これで変更は完了です。
次に変更の反映を行います。

Activation a connectionを選択
enterを2回押下して反映完了。Backを選択。

最後にOKを選択で完了です。

ちゃんと設定できているか疎通確認してみましょう!

まず自分自身のIPアドレスに

CentOS7
ping 172.16.10.2
PING 172.16.10.2 (172.16.10.2) 56(84) bytes of data.
64 bytes from 172.16.10.2: icmp_seq=1 ttl=64 time=0.026 ms
64 bytes from 172.16.10.2: icmp_seq=2 ttl=64 time=0.035 ms
64 bytes from 172.16.10.2: icmp_seq=3 ttl=64 time=0.035 ms
^C
--- 172.16.10.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.026/0.032/0.035/0.004 ms

OKですね!
これで、まず自身のIPアドレスの設定とアダプタが有効になっていることを確認できました。
もしこの段階で応答がない場合は再度nmtuiで設定してください。

次はデフォルトゲートウェイに

CentOS7
ping 172.16.10.1
PING 172.16.10.1 (172.16.10.1) 56(84) bytes of data.
64 bytes from 172.16.10.1: icmp_seq=1 ttl=128 time=0.358 ms
64 bytes from 172.16.10.1: icmp_seq=2 ttl=128 time=0.236 ms
64 bytes from 172.16.10.1: icmp_seq=3 ttl=128 time=0.802 ms
^C
--- 172.16.10.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.236/0.465/0.802/0.243 ms

これもOKですね。
これで自身とデフォルトゲートウェイまでの間の
小さなネットワークが確立されていることが確認出来ました。

では、管理OS(Windows)へはどうでしょうか?
私のwindowsのIPアドレスは192.168.150.53です。

ではpingしてみましょう。

CentOS7
ping 192.168.150.53
PING 192.168.150.53 (192.168.150.53) 56(84) bytes of data.
^C
--- 192.168.150.53 ping statistics ---
26 packets transmitted, 0 received, 100% packet loss, time 24999ms

なにぃ??

どうやら、デフォルトゲートウェイまでは届くけどそれより外には出れないようです。

ちなみにですがwindows側からはCentOS7のアドレスが認識できます。

コマンド結果
ping 172.16.10.2

Pinging 172.16.10.2 with 32 bytes of data:
Reply from 172.16.10.2: bytes=32 time<1ms TTL=64
Reply from 172.16.10.2: bytes=32 time<1ms TTL=64
Reply from 172.16.10.2: bytes=32 time<1ms TTL=64
Reply from 172.16.10.2: bytes=32 time<1ms TTL=64

Ping statistics for 172.16.10.2:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

ということはもちろん

コマンド結果
ssh root@172.16.10.2
root@172.16.10.2's password:
Last login: Tue Jun 11 21:49:59 2024 from gateway
[root@CentOS7 ~]#

SSH接続も出来ました。

しかし、これではまだ大変不便なので次でNATを設定して外と通信出来るようにします。

4.NATを設定して外のネットワークと通信出来るようにする

NATってなぁになぁに??

そう思った人の為に調べてきました。

違う、そうじゃない。

NATはNetwork Address Translation ネットワークアドレストランスレーションの略で
IPアドレスを相互変換するための仕組みのことです。

windowsにはwinNATという機能があるためそれを利用すると
Hyper-Vからwindowsや更にその外のインターネットとの通信出来るようになるとのこと。

では早速設定していきましょう。
以下コマンドを実行。

powershell【管理者権限】
New-NetNat -Name centos7 -InternalIPInterfaceAddressPrefix 172.16.10.0/24

確認するときは以下コマンドを実行

powershell【管理者権限】
Get-NetNat

間違ったので削除したいときは以下コマンドを実行

powershell【管理者権限】
Remove-NetNat

では外へ通信出来るようになったか試してみましょう。

CentOS7
ping 192.168.150.53
PING 192.168.150.53 (192.168.150.53) 56(84) bytes of data.
64 bytes from 192.168.150.53: icmp_seq=1 ttl=127 time=0.219 ms
64 bytes from 192.168.150.53: icmp_seq=2 ttl=127 time=0.333 ms
64 bytes from 192.168.150.53: icmp_seq=3 ttl=127 time=0.314 ms
^C
--- 192.168.150.53 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.219/0.288/0.333/0.053 ms

windowsまで通信出来るようになりました!

ではさらに外へ

CentOS7
ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=16.7 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=17.2 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=118 time=16.5 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 16.591/16.866/17.272/0.311 ms

外への通信も出来るようになりました!

あともう一つ

CentOS7
ping google.com
PING google.com (172.217.26.238) 56(84) bytes of data.
64 bytes from nrt12s51-in-f14.1e100.net (172.217.26.238): icmp_seq=1 ttl=118 time=16.6 ms
64 bytes from nrt12s51-in-f14.1e100.net (172.217.26.238): icmp_seq=2 ttl=118 time=18.7 ms
64 bytes from nrt12s51-in-f14.1e100.net (172.217.26.238): icmp_seq=3 ttl=118 time=17.0 ms
^C
--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 16.683/17.499/18.783/0.931 ms

名前解決もOKですね。

これでIPアドレスの固定化は完了です。

おまけ.IPアドレスに名前をつけてみる。

これまでの作業により固定IPアドレスでSSH接続できるようになりました。

CentOS7
ssh root@172.16.10.2

しかし、これから先、沢山の仮想マシンを作成してIPアドレスを設定していったとすると
果たしてIPアドレスだけで判断・管理ができるでしょうか?

先ほどの名前解決の話ではありませんが、SSHの接続先に名前を付けられると幸せになれそうです。

そんな幸せになれそうな方法のお話です。

windowsにはhostsというファイルがあります。
そこに定義するとIPアドレスに名前を付けることができます。

ではやってみましょう。

hostsC:\Windows\System32\drivers\etcにあります。
これを管理者権限のメモ帳で開きます。

一番下に以下を追記して上書き保存します。

hosts
172.16.10.2 centos7

SSH接続してみましょう。

コマンド結果
ssh root@centos7
The authenticity of host 'centos7 (172.16.10.2)' can't be established.
ED25519 key fingerprint is SHA256:ERF8435gJO//mTk2Vn4xV2+jIhQfSlWPInZqTYhWx78.

Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'centos7' (ED25519) to the list of known hosts.
root@centos7's password:
Last login: Wed Jun 12 00:01:26 2024 from gateway
[root@CentOS7 ~]#

なにやら見慣れない文言がありますが無事にroot@centos7でSSH接続ができました!
以降は172.16.10.2というIPアドレスを忘れてもSSH接続ができます。

4.SSH鍵を作成してみる

SSH鍵を作成して鍵認証できるようにするまでには
・クライアントPC側(windows)
・サーバーPC側(CentOS7)
それぞれの設定が必要になります。
多少面倒くさいかもしれませんが、これを実施することでパスワード入力が不要になるので
是非、試してみてください。

  • クライアントPC側(windows)の設定
    SSH接続用のキーペアを作成する
    以下コマンドで公開鍵・秘密鍵のキーペアを作成する

    コマンドプロンプト
    ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (C:\Users\****/.ssh/id_rsa):
    Created directory 'C:\\Users\\****/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in C:\Users\****/.ssh/id_rsa
    Your public key has been saved in C:\Users\****/.ssh/id_rsa.pub
    The key fingerprint is:
    SHA256:VzAFIdodhnzOCRLBKF4mGLR5LI9kl1UERMWx0KBnq+0 ****@Omen17
    The key's randomart image is:
    +---[RSA 3072]----+
    |o+  oX@Oo.B+.    |
    |. * B +==+.+     |
    | B @ o.o.=...    |
    |o B o .   +.     |
    | . . .  S .      |
    |    o    .       |
    |   . .           |
    |    .            |
    |     E           |
    +----[SHA256]-----+
    

    いくつか質問されますが、今回はローカルでしか使わないSSH鍵なので全てenterでOK。

    そして C:\Users<ユーザー名>.ssh\ のパスに以下2つのファイルが生成されます。
    ・id_rsa <---- 秘密鍵
    ・id_rsa.pub <---- 公開鍵 これはサーバー側に設置するファイル

    作成した公開鍵をサーバー側(CentOS7)に送る
    以下コマンドを実行。
    ※コマンドプロンプトを起動したときはカレントパスがユーザーのためそれを想定。

    コマンドプロンプト
    scp .\id_rsa.pub root@centos7:~/
    
  • サーバーPC側(CentOS7)の設定
    先ほどクライアント側(windows)から送られたid_rsa.pubを設置
    root@centos7でSSHログインして以下コマンドを実行。

    CentOS7
    # .sshディレクトリを作成
    mkdir ./.ssh
    
    # パーミッションを700に設定 ※これ特に重要!!
    chmod 700 ./.ssh
    

    サーバー用の公開鍵を作成
    .sshフォルダ内にauthorized_keysを作成してid_rsa.pubの内容を転記する。
    以下コマンドを実行。

    CentOS7
    # 公開鍵ファイルの作成
    touch ./.ssh/authorized_keys
    
    # クライアント側(windows)から転送された公開鍵をauthorized_keysに追加
    cat ./id_rsa.pub >> ./.ssh/authorized_keys
    
    # パーミッションを600に変更 ※これ特に重要!!
    chmod 600 ./.ssh/authorized_keys
    

    sshd_configでSSH鍵認証(公開鍵認証)を有効化して適用する
    あともう一息。
    sshd_configの設定を変更します。

    CentOS7
    vi /etc/ssh/sshd_config
    

    ここでLinux操作の鬼門。viが出てきました。
    今回ここでは操作方法を説明しませんので、ググってみてください
    (編集するときはiで編集モード。編集モードを抜けたいときはESC
    ファイルを保存したいときは:wエディタを終了したいときは:qです)

    以下のプロパティを編集保存します。

    /etc/ssh/sshd_config
    #PubkeyAuthentication yes
    PubkeyAuthentication yes
    

    PubkeyAuthentication はデフォルトでコメントアウトしているため外します。

    sshdを再起動して適用完了!

    CentOS7
    systemctl restart sshd
    

ではwindowsに戻ってちゃんと設定できているかテストしてみましょう

コマンドプロンプト
ssh root@centos7
Last login: Wed Jun 12 01:34:20 2024 from gateway
[root@CentOS7 ~]#

おおお!パスワード聞かれない!
ssh root@centos7だけでSSH接続が出来ました!成功です!

これで最悪パスワード忘れてもログインが出来ますね。
(パスワードは出来るだけ忘れるべきではないが・・・)

5.僕はもっと楽をしたい!!!!

これまでの作業で既に楽にSSH接続が出来るようになりました。
ssh root@centos7でSSH接続ができますが
今回の場合ユーザーはrootしかいないのでこれを省略できたらもっと幸せになれそうです。

そんな時はwindows側で/.ssh/configで設定すると実現できます。
では早速やってみましょう。

.sshフォルダに移動してconfigファイルがあるかを確認する。

コマンドプロンプト
cd .\.ssh
dir
 Volume in drive C is Windows
 Volume Serial Number is 7847-5E54

 Directory of C:\Users\****\.ssh

2024/06/12  00:43    <DIR>          .
2024/06/12  00:32    <DIR>          ..
2024/06/12  00:32             2,602 id_rsa
2024/06/12  00:32               567 id_rsa.pub
2024/06/12  00:43               650 known_hosts
2024/06/12  00:43                90 known_hosts.old
               4 File(s)          3,909 bytes
               2 Dir(s)  422,083,895,296 bytes free

どうやら私の環境ではconfigファイルはまだ無いようですね。
それではファイルを作成しましょう。

とはいえコマンドプロンプトでは新規ファイルを作成するコマンドというものがありません。
しかし、リダイレクトというテクニックを使用することで、新規ファイルを作成します。

コマンドプロンプト
type nul > config

typeはファイルの中身を確認するコマンドですがそこにnulを渡して
何も表示しないという出力を作ります。
その出力をリダイレクトでconfigというファイルに書き出す
ということをして、新規ファイルを作成しました。

これをさりげなくやれるとプロのエンジニアっぽい雰囲気を作れそうですね。

ではこのconfigファイルに設定を書き込んでいきましょう。
通常起動のメモ帳で大丈夫です。

.ssh/config
# ---------------------------------
# CentOS7 on Hyper-V
# ---------------------------------
host centos7                  # SSHで指定するときの名前
	user root                   # root@172.16.10.2 のroot(ユーザー)
	hostname 172.16.10.2        # root@172.16.10.2 の172.16.10.2(ホスト名)
	port 22                     # ポート SSHのデフォルトは22 今回変更してないので22
	identityfile ~/.ssh/id_rsa  # 秘密鍵のパス

このように記述したら上書き保存して早速SSH接続してみましょう。

コマンドプロンプト
ssh centos7
Last login: Wed Jun 12 22:57:31 2024 from gateway
[root@CentOS7 ~]#

ついにユーザー名も省略してSSH接続が出来るようになりました!

ちなみに先述のおまけにてhostsファイルに別名を付けましたが
configファイルでも同様のことをしているため
hostsファイルに追記した 172.16.10.2 centos7の記述は削除しても大丈夫です。

本記事は以上で終わりです。

さいごに

今回のテーマは慣れていないとハマるポイントが沢山あるため実践形式で解説してみました。
その結果、思った以上のボリュームになりました。
私自身も新米エンジニアの頃にCentOS7の開発環境を構築した際にSSH接続が上手く出来ずに
設定構築を断念した記憶があります。
この記事の執筆にあたり以前出来なかったことが出来るようになり、更には解説記事として
公開できるようになったことに自身の成長も同時に実感している今日この頃です。
とはいえこの記事でもかなり駆け足で解説してしまったので点在している重要なテーマ
一つ一つを深堀した記事をいずれ公開したいと思います。

Discussion