第3話 centOS7 SSH接続の構築編 ~ 実践!Hyper-Vで開発環境構築! CentOS7+VSCode+Laravel
はじめに
これは初めてhyper-VでCentOS7を使用する人向けの記事です
前提
-
Hyper-Vにインストール済みのCentOS7(ver: 7.9)
CentOS7のバージョン確認するにはCentOSを起動して以下コマンドを実行してください。CentOS7cat /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アドレスを確認
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にログインしましょう。
ログインしたら以下のコマンドを実行。
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アドレスに
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
で設定してください。
次はデフォルトゲートウェイに
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してみましょう。
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や更にその外のインターネットとの通信出来るようになるとのこと。
では早速設定していきましょう。
以下コマンドを実行。
New-NetNat -Name centos7 -InternalIPInterfaceAddressPrefix 172.16.10.0/24
確認するときは以下コマンドを実行
Get-NetNat
間違ったので削除したいときは以下コマンドを実行
Remove-NetNat
では外へ通信出来るようになったか試してみましょう。
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まで通信出来るようになりました!
ではさらに外へ
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
外への通信も出来るようになりました!
あともう一つ
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接続できるようになりました。
ssh root@172.16.10.2
しかし、これから先、沢山の仮想マシンを作成してIPアドレスを設定していったとすると
果たしてIPアドレスだけで判断・管理ができるでしょうか?
先ほどの名前解決の話ではありませんが、SSHの接続先に名前を付けられると幸せになれそうです。
そんな幸せになれそうな方法のお話です。
windowsにはhostsというファイルがあります。
そこに定義するとIPアドレスに名前を付けることができます。
ではやってみましょう。
hostsはC:\Windows\System32\drivers\etcにあります。
これを管理者権限のメモ帳で開きます。
一番下に以下を追記して上書き保存します。
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の設定を変更します。CentOS7vi /etc/ssh/sshd_config
ここでLinux操作の鬼門。viが出てきました。
今回ここでは操作方法を説明しませんので、ググってみてください
(編集するときはi
で編集モード。編集モードを抜けたいときはESC
ファイルを保存したいときは:w
エディタを終了したいときは:q
です)以下のプロパティを編集保存します。
/etc/ssh/sshd_config#PubkeyAuthentication yes PubkeyAuthentication yes
PubkeyAuthentication はデフォルトでコメントアウトしているため外します。
sshdを再起動して適用完了!
CentOS7systemctl 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ファイルに設定を書き込んでいきましょう。
通常起動のメモ帳で大丈夫です。
# ---------------------------------
# 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