読者です 読者をやめる 読者になる 読者になる

designetwork

ネットワークを軸としたIT技術メモ

Ubuntu OSバージョンとkernelバージョンの対応表

f:id:daichi703n:20170305141711p:plain

Linuxの主要ディストリビューションの一つで、デスクトップ用途で広いシェアを持つUbuntu。各種ソフトウェアをインストールする際には、OSそのもののバージョンに加え、kernel(カーネル)のバージョンにも注意する必要がある。

UbuntuのOSバージョンとkernelバージョンの対応表を示す。

Ubuntu OSバージョンとkernelバージョン

Ubuntuのバージョンの歴史はこちらのWikipediaにまとまっている。(英語)

Ubuntu version history - Wikipedia

また、こちらで本内容と同じディスカッションがされている。

askubuntu.com

ここ最近でのバージョン対応は以下の通り。LTS versionでは新しいkernel versionをサポートしているものもある。これによりOSバージョンはそのまま新kernelの機能を使用することができる。

OS Ver  OS Name             kernel Ver
14.04   Trusty Tahr         3.13 or newer
14.10   Utopic Unicorn      3.16
15.04   Vivid Vervet        3.19
15.10   Wily Werewolf       4.2
16.04   Xenial Xerus        4.4 or newer
16.10   Yakkety Yak         4.8

Ubuntuバージョン確認方法

UbuntuのOSバージョン及びkernelバージョンは以下の通り確認できる。次の例ではOSバージョン:14.04.5 LTS, kernelバージョン:4.8.4-c9となっている。先の表で言うor newerカーネルが使用されている。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"

$ uname -a
Linux <hostname> 4.8.8-c9 #1 SMP Mon Feb 13 03:16:28 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

まとめ - Ubuntu OSバージョンとkernelバージョンの対応表

UbuntuのOSバージョンとkernelバージョンの対応表は本文の通り。LTSではより新しいkernelバージョンも使用できる。

Express + Node.jsで別サイトにHTTP GETして結果を表示する

公開しているサーバが、他のサーバからアクセス(HTTP/S GET)可能な状態かを確認したいタイミングがあり、Express + Node.jsで簡易プログラムを作成した。これにより、APIへのアクセス確認、HTTPS(SSL)の証明書確認など、自身だけではできない確認ができる。ポイントはクライアントPCからではなく、サーバ(アプリケーション)自身からアクセスしていること。

確認できること

HTTP/Sの通信確認 (Webアプリケーション自身からGET)

StatusCodeとBodyを表示する。このような表示。

f:id:daichi703n:20170228222338p:plain

公開プログラム

Herokuにてプログラムを公開している。(フリープランなので立ち上がり遅い場合あり)

HTTP/S Checker - Heroku

できないこと・修正したい点

なお、エラーハンドリングは実装しきれておらず、HTTPSの通信ができないときはInternal Server Error (500)になってしまう…。また、form送信時に新規タブが立ち上がってしまったり、修正したいことは多々あり…。

随時修正して公開プログラムをアップデートしていきたい。

ソースコード

Express + Node.jsのソースコードはこちらで公開している。ご自由にお持ちください。

仕組みとしては、jadeのformで宛先URLを入力し、クエリとしてNode.jsで読み込む。与えられたURL(クエリ)に対してthen-requestモジュールでアクセスして各種情報を取得する。then-requestは同期処理ができないが今回は問題なく動作した。

まとめ - Express + Node.jsで別サイトにHTTP GETして結果を表示する

Express + Node.js then-requestモジュールにより、アプリケーション自身が別サイトにアクセスして結果を表示するプログラムを作成した。表示内容を編集することでAPIの動作確認等の用途に使用できる。

Node.jsのHTTP通信はsync-request非推奨でthen-requestを推奨

f:id:daichi703n:20170221232447p:plain

こちらの記事で紹介しているとおり、sync-requestモジュールは同期処理でHTTP通信を行うことができる。これにより、javascript特有の非同期処理によるコールバック処理なく、シンプルなコードになる。

designetwork.hatenablog.com

designetwork.hatenablog.com

ところが、npmのsync-requestページで、商用では非推奨、then-requestへの切り替えを推奨されている。(2017/2/21確認)

npmのアナウンス

npmのsync-requestのページでは次の通りアナウンスされている。

www.npmjs.com

N.B. You should not be using this in a production application. In a node.js application you will find that you are completely unable to scale your server. In a client application you will find that sync-request causes the app to hang/freeze. Synchronous web requests are the number one cause of browser crashes. For production apps, you should use then-request, which is exactly the same except that it is asynchronous.

商用アプリケーションでのsync-requestの使用は非推奨。node.jsのアプリケーションがスケールしなくなる。sync-requestを使用することで、クライアントアプリがハングアップ・フリーズすることが分かる。同期処理でのWebリクエストはブラウザクラッシュの要因の一つだ。商用アプリでは、then-requestを使用すべきだ。それはsync-requestとほぼ同等だ。非同期であることを除いて。

非同期を避けて同期処理のsync-requestを使用しているので、その差分は受け入れられない。ただ、私の用途は開発環境なので、警告を受け入れて継続使用する。

sync-request Ver.4 で警告表示

使用開始当初はVer.3.0.1を使用。こちらのpackage.json(抜粋)で実行すると以下の結果となる。

"sync-request": "~3.x.x"

$ npm install
sync-request@3.0.1 node_modules/sync-request
├── http-response-object@1.1.0
└── concat-stream@1.6.0 (inherits@2.0.3, typedarray@0.0.6, readable-stream@2.2.2)

サンプルプログラムを実行
main

function https://google.comにアクセス(同期で完了待機)してStatus Codeを表示
↓return Status Code
main Status Codeを表示

$ node ./returnReqSync.js 
Start  Return Request Sync
Status Code (function) : 200
Status Code (main)     : 200
End    Return Request Sync

Version 4を使用してみる。

"sync-request": "~4.x.x"

$ npm install
sync-request@4.0.1 node_modules/sync-request
├── http-response-object@1.1.0
├── concat-stream@1.6.0 (inherits@2.0.3, typedarray@0.0.6, readable-stream@2.2.2)
└── get-port@2.1.0 (pinkie-promise@2.0.1)

実行すると、「Could not use “nc”, falling back to slower node.js method for sync requests.」の警告が表示される。npmの記載と同等内容だが、"nc"が何を指しているかは不明。エラーではないので無視する。

$ node ./returnReqSync.js 

Start  Return Request Sync
Could not use "nc", falling back to slower node.js method for sync requests.
Status Code (function) : 200
Status Code (main)     : 200
End    Return Request Sync

then-requestモジュールを使ってみる

せっかくなのでthen-requestモジュールに書き換えてみる。使い方はnpmを参照。

var request = require('then-request');
var returnCode;

console.log("Start  Return Request Sync");
returnCode = httpGet();
console.log("Status Code (main)     : "+returnCode);
console.log("End    Return Request Sync");

function httpGet(){
  //var response = request('GET', 'https://google.com/'); //pattern of sync-request
  request('GET', 'https://google.com/').done(function (response) {
    console.log("Status Code (function) : "+response.statusCode);
    return response.statusCode;
  });
}

実行するとこの通り、非同期処理となってmain関数の表示時点で値が返っていないことが分かる。

$ node ./returnReqThen.js 
Start  Return Request Sync
Status Code (main)     : undefined
End    Return Request Sync
Status Code (function) : 200

まとめ - Node.jsのHTTP処理はsync-request非推奨になりthen-requestを推奨

非推奨とは言え、現状でHTTP同期処理を簡単に実装できるsync-requestは非常に有用だ。私は開発環境用途なので引き続き使用していく。非同期で問題ない場合は、sync-requestの豊富なオプションを継承しているthen-requestへの切り替えを考慮しても良い。

マルチドメインかつワイルドカードの証明書は発行できない

f:id:daichi703n:20170217014705p:plain

(2017/4/15 ValueSSLではマルチドメインかつワイルドカードの証明書を発行可能)

HTTPS(SSL)を実装する際には証明書の検討も必要となる。多くのサイトを公開する場合にはFQDNが多数となるが、ワイルドカード証明書、マルチドメイン(SANs)証明書を使用することで証明書の数を削減することができる。

さらなる効率化として、マルチドメインかつワイルドカードの組合せ証明書は発行することができないのか確認する。

認証局(CA)/証明書発行機関の説明

SSLサーバ証明書を発行する各種認証局、証明書発行機関ではそれぞれ、マルチドメイン(SANs)証明書・ワイルドカード証明書についての説明がされている。しかし、タイトルの通り「マルチドメインかつワイルドカードの証明書は発行できない」という明記は見当たらない。ただ、記載の組合せで発行できないことが分かる。

Cybertrust

SureServer MD|Cybertrust.ne.jp

マルチドメイン証明書でSANsを追加する手順が記載されている。使用可能文字は以下の通り。

  • 半角英数字(a〜z, A〜Z, 0〜9)
  • - (ハイフン)
  • . (ピリオド)

ここにワイルドカード * (アスタリスク)は含まれていない。マルチドメイン証明書にワイルドカードを組み合わせることはできない。

GeoTrust

www.geotrust.co.jp

各証明書のサポート範囲が記載されている。これらもSANとしてFQDNを追加できるが、ワイルドカードは含まれない。

CN:geotrust.co.jp クイックSSLプレミアム 4 サブドメインパック クイックSSLプレミアム ワイルドカード
SANs:
abc.geotrust.co.jp
abc1.geotrust.co.jp
abc.abc.geotrust.co.jp × *部分と違う階層のため
abc.abc.abc.geotrust.co.jp × *部分と違う階層のため
abc.abc.abc.symantec.com × 別ドメインのため × 別ドメインのため

ValueSSL

ワイルドカード証明書について « ValueSSLサポート

安価で個人でも取得がしやすいValueSSLのFAQより。

項目 マルチドメインSSL証明書 ワイルドカードSSL証明書
CSRのコモンネーム (例1)yourdomain.com 
(例2)ssl.yourdomain.com
(例1)*.yourdomain.com
(例2)*.ssl.yourdomain.com
注意点 FQDN(完全修飾ドメイン名)を指定する FQDN(完全修飾ドメイン名)の頭に「*. 」をつけて指定する

注意事項に記載されている通り、マルチドメイン証明書の場合はFQDNを指定する必要があるため、*の指定はできない。

ValueSSL訂正 発行可能

(2017/4/15追記)実績を紹介いただき追記しました。

ValueSSLでは、SANsとして登録するドメインに対してワイルドカードでの登録ができる。

SANsに設定できる例 説明
www2.yourdomain.co.jp サブドメイン
secondaname.com ドメイン
ssl001.shopsite.secondaname.com 多階層のサブドメイン
*.yourdomain.co.jp ワイルドカード

ワイルドカード証明書使用時のSANs

一般的な証明機関では、ワイルドカード証明書を発行する際に以下のように*.階層のサブドメインを含まないSANが登録される。

申請: *.example.com
CN: *.example.com
SAN: example.com

技術的には可能

こちらの議論では、マルチドメインかつワイルドカード証明書は、技術的には可能、しかしCAのポリシーにより発行されない、と結論づいている。

stackoverflow.com

まとめ - マルチドメインかつワイルドカードの証明書は発行できない

マルチドメインかつワイルドカード証明書は、技術的には可能だが、認証局のポリシーにより発行されない。日本国内の認証局の説明を確認しても、やはり、マルチドメインかつワイルドカードの証明書は発行できないことがわかる。(ValueSSLを除く)

Chromebook Secure Shell 公開鍵認証でCentOSにSSH接続する

f:id:daichi703n:20170202010439p:plain

Chromebook (Google Chrome)で提供されているSecure Shellがあれば、ChromebookでもTeraTermなしでLinux (CentOS) サーバを運用できる。なお、今回の手順では開発者モード (デベロッパーモード) への切り替えは必要ない。

公開鍵を生成する

Chromebookで公開鍵を生成する場合は開発者モードへの切り替えが必要となる。しかし、今回はLinuxサーバ側でキーを生成するため、開発者モードへの切り替えは必要ない。

Linuxサーバで以下の通りSSH公開鍵・秘密鍵を生成する。鍵生成は、既に作成済みの運用ユーザにパスワード認証でログインした状態で実施するのが簡単。

$ ssh-keygen
(必要に応じてパスフレーズ入力)

~/.ssh/配下にid_rsa, id_rsa.pubが生成される。公開鍵を認証鍵リストに登録する。

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

ファイル名、アクセス権の設定が誤っているとSSH接続エラー(SSH Error Code 255 など)になるため、見直して修正する。

Chromebookに公開鍵・秘密鍵をコピーする

SFTPツールなどにより、手元に公開鍵と秘密鍵をコピーする。 TeraTerm等の場合は秘密鍵のみでよいが、Secure Shellでは公開鍵も必要となる。

chrome.google.com

「ダウンロード」フォルダ配下にssh等のフォルダを作成し、サーバから鍵をコピーする。残念ながら.sshなど.(ピリオド)始まりのフォルダは作成できない。※Googleドライブには置かないように注意!!秘密鍵流出のリスクあり!!

Secure Shellに鍵をセットする

ここがTeraTerm等とは異なるので注意が必要。Importをクリックして鍵セットを選択する。

f:id:daichi703n:20170202005417p:plain

一つ選択してShift+矢印で公開鍵と秘密鍵を選択する。

f:id:daichi703n:20170202005441p:plain

これで鍵がインポートされる。

f:id:daichi703n:20170202005500p:plain

秘密鍵だけを選択した場合はプルダウンリストに選択した鍵が表示(インポート)されない。

これで接続することで、SSH接続できる。表示はパスフレーズありのパターン。パスワードではなくパスフレーズが要求されている。ここでパスワードが要求されている場合はSSH設定に誤りがある。

f:id:daichi703n:20170202005643p:plain

鍵セットの削除方法

鍵選択を誤った時は以下の通り削除できる。

Identityで選択した状態でDELキー

私のChromebook Acer C720では検索+BackSpaceでDELコマンドを送信できる。

詳細マニュアルはこちらに記載がある。

chromeapps/nassh/doc/faq.txt - chromiumos/platform/assets - Git at Google

まとめ - Chromebook Secure Shell 公開鍵認証でCentOSSSH接続する

Linux(CentOS)サーバ側で鍵生成することで、Chromebookを開発者モードにすることなく、Secure Shellでの公開鍵認証SSH接続ができる。TeraTerm等と異なり、公開鍵・秘密鍵をセットでクライアントに読み込む必要がある。

ESXi6.5にCentOS7.3をインストールする(VMコンソール不具合あり?)

f:id:daichi703n:20170121174757p:plain

VMware vSphere ESXi 6.5 にCeontOS 7.3 をインストールする。

ESXiは無償(Essential)版を使用する。残念ながらvCenterは無償では使えないのでスタンドアロン構成とする。ゲストOSにはLinuxディストリビューションCentOSを使用する。CentOSオープンソースなので、すべて無料で環境を構築できる。

環境

物理サーバ:DELL PowerEdge T110 II (検討・購入は以下の記事の通り)

designetwork.hatenablog.com

ハイパーバイザ:VMware vSphere ESXi6.5

仮想サーバ:CentOS 7.3

PC:Chromebook Acer C720

Webブラウザ:Google Chrome

ESXi6.5インストール

MyVMwareで評価版登録しダウンロードする。インストールはウィザードの通りで特に問題ないため割愛。

my.vmware.com

CentOS7.3インストール

CentOSはオフィシャルからISOイメージをダウンロードする。私は自分で各種セットアップしたいのでMinimalを使用。

Download CentOS

作成した仮想マシンにISOイメージをマウントして起動する。コンソールは従来と大きく変わらないが、ESXi6.5ではvSphere Clientは不要で、vSphere Web ClientによりWebから管理できる。

f:id:daichi703n:20170121165449p:plain

ここからは通常のCentOSのセットアップとなる。

f:id:daichi703n:20170121165755p:plain

それぞれ設定する。

f:id:daichi703n:20170121165859p:plain

DISK設定・ネットワーク画面がうまく表示されない

DISKの設定をする中で一部うまく表示されない不具合?があるように見える。

f:id:daichi703n:20170121165941p:plain

下にスクロールし、「パーティションを自分で構成する」にチェックを入れて「完了」をクリックする。

f:id:daichi703n:20170121170030p:plain

画面の右部分が切れてしまっている... ウィンドウを広げても横の表示領域は広がらない...

PC・Webブラウザの問題かも知れない...

f:id:daichi703n:20170121170126p:plain

上部の歯車アクションから解像度を変更してみても効果なし...

f:id:daichi703n:20170121170240p:plain

パーティション設定画面で下にスクロールすると「設定の...」ボタンがあるので、ここで変更を反映させる。

f:id:daichi703n:20170121170752p:plain

ネットワークに至ってはかろうじてオン/オフボタンは切り替えられるが、設定ボタンが見えない...
Tabでうまくカーソルを飛ばすこともできるが、ネットワークの設定はインストール後にnmtui/nmcliでするのが良さそうだ。

f:id:daichi703n:20170121170919p:plain

本来の画面ではどう表示されているのかは、こちらを参考にさせていただくと良いかと思います。 これを参考にTabで対象ボタンにたどり着いてください。

www.jifu-labo.net

キーマッピングに注意

歯車アクションからキーマッピングを変更できる。ここに使用言語に合わせておかないと、パスワード等で記号を使用した際に想定外の記号が入力される。

f:id:daichi703n:20170121173642p:plain

まとめ - ESXi6.5にCentOS7.3をインストールする(VMコンソール不具合あり?)

VMware vSphere ESXi 6.5 のWeb Clientから CentOS7.3 をインストールした。VMのコンソールに画面表示不具合があるように見えるが、初期インストールだけであれば問題ない。

無料・無償で仮想化環境で検証ができる。

基本ライセンスのASA5505でVLAN nameif設定エラーを解消する

f:id:daichi703n:20170116224342j:plain

Cisco ASA5505は基本ライセンスでは3つまでVLANを設定できる。ただし、普通に設定をしようとすると、3つ目のVLANにnameifを設定する際にエラーとなる。エラーを解消して、3つ目のVLANにnameifを設定する方法を記載する。

Cisco ASA5505の中古価格が下がってきており、自宅インターネット接続ルータとして導入するハードルが下がってきている。この手順でDMZも構築でき、インターネットへのサービス公開が安全にできる。

自宅ネットワーク構成

ASA5505は基本ライセンスのため、VLAN trunkの設定ができない。拡張ライセンスで20VLANまで、trunk接続も可能。そのため、Cat2960に対してそれぞれのVLANをaccessで接続し、ルーティングポイントとしてのみASA5505を使用している。

ASA5505(基本ライセンス)
|V1 |V50 |V99
Cat2960(ASA接続はすべてaccess)
|V1 |V50 |V99
PC SV ONU

VLAN内訳

1 : management(inside)
50: dmz
99: outside(internet)

ASA5505# sh run int vlan 1
!
interface Vlan1
 nameif management
 security-level 100
 ip address 192.168.1.5 255.255.255.0 
ASA5505# sh run int vlan 99
!
interface Vlan99
 description internet
 nameif outside
 security-level 0
 pppoe client vpdn group nifty
 ip address pppoe setroute 

エラー内容

VLANにnameifを設定しようとすると、以下のエラーとなる。基本ライセンスの場合、3つ目のVLANからは先に設定のいずれかのVLANにしかアクセスできない。

ASA5505# conf t
ASA5505(config)# int vlan 50
ASA5505(config-if)# nameif dmz
ERROR: This license does not allow configuring more than 2 interfaces with 
nameif and without a "no forward" command on this interface or on 1 interface(s)
with nameif already configured.

エラー回避設定手順

Ciscoオフィシャルにも手順の記載がある。

Cisco ASA 5500 シリーズ コンフィギュレーション ガイド (CLIを使用) ソフトウェア バージョン8.4 - インターフェイス コンフィギュレーションの 開始(ASA 5505) - Cisco Systems

DMZからinsideへの転送を禁止することで、nameifが設定でき通信が可能となる。

ASA5505# conf t
ASA5505(config)# int vlan 50
ASA5505(config-if)# no forward interface vlan 1
ASA5505(config-if)# nameif dmz
ASA5505(config-if)# security-level 50
ASA5505(config-if)# ip address 192.168.50.1 255.255.255.0
ASA5505(config-if)# end
ASA5505# sh run int vlan 50
!
interface Vlan50
 no forward interface Vlan1
 nameif dmz
 security-level 50
 ip address 192.168.50.1 255.255.255.0 
ASA5505# 

なお、インターネットへのアクセスにはinsideと同様にNAPT設定が必要。FW設計によってはACL適用も必要。(この例はSecurity Levelで制御)

ASA5505# sh run | grep Internet
object-group network Internet-PAT
nat (management,outside) source dynamic Internet-PAT interface
ASA5505# conf t
ASA5505(config)# nat (dmz,outside) source dynamic Internet-PAT interface
ASA5505(config)# end

まとめ - 基本ライセンスのASA5505でVLAN nameif設定エラーを解消する

3つ目のVLANにno forwardのコマンドを設定することにより、基本ライセンスのCisco ASA5505でのVLAN nameif設定エラーを解消した。これにより、inside, outside, dmzの一般的なネットワーク構成が可能となる。