2021年7月31日土曜日

vSphere 7.0より統合Windows認証が非推奨になったので、LDAPSを使ったActive Directory認証を設定する

vCenter ServerやESXiは、Active Directory (以下、AD) のドメインに参加することができ、ADによる認証機能の利用や、ADのユーザやグループに対するロールの割り当てを行い、必要な権限付与を行うことができる。

vSphere 7.0においても引き続きAD認証は利用できるものの、統合Windows認証 (Integrated Windows Authentication ; IWA) の利用は今後廃止予定であり、利用は非推奨となることが発表された。

上記URLにも記載されているが、今後vCenter Serverでは、「Active Directory (統合 Windows 認証)」ではなく「LDAP を介した Active Directory」によるIDソースの設定する必要がある。

また、ADとの認証通信は、セキュリティの観点からLDAPではなくLDAPSにて構成することが推奨される。

本記事では、vCenter Serverにて「LDAP を介した Active Directory」を利用して、LDAPSを利用するIDソースの登録を行う手順を記載する。

Active DirectoryをLDAPSで利用できるよう構成

ADでLDAPSを利用する場合は、証明書の作成と登録が必要となる。

以下記事にてオレオレ証明書を利用した設定手順を記載しているため、参照し事前に設定を完了させておくこと。

vCenter Serverにて「LDAP を介した Active Directory」を利用してIDソースを設定

1. IDソースを登録

vSphere Clientにログインし、「メニュー」→「管理」→「Single Sign-On」→「設定」を選択したのち、「IDソース」タブを開く。

「IDソースの追加」にて、ADを追加する。ここのIDソースタイプの設定として選択できる「Active Directory (統合 Windows 認証)」は非推奨となるため、「LDAP を介した Active Directory」を選択し、以下の通り設定する。

設定項目 設定例 説明
ID ソース タイプ LDAP を介した Active Directory ADをLDAPS経由で使用する場合は左記を選択
名前 example.com 任意の名前を指定。ドメイン名が判別しやすくてお勧め
ユーザーのベース識別名 ou=My OU,dc=example,dc=com 対象とするOU及びドメインを指定
グループのベース識別名 ou=My OU,dc=example,dc=com 対象とするOU及びドメインを指定
ドメイン名 example.com ドメイン名を指定
ドメイン エイリアス example 任意で指定
ユーザー名 user@example.com ADを参照可能なユーザを指定
パスワード ユーザのパスワード 指定したユーザのパスワードを指定
接続先 特定のドメイン コントローラ DNSがADと統合されている場合は、ドメイン内の任意のドメイン コントローラを選択しても問題ない
プライマリ サーバ URL ldaps://hoge1.example.com:636 LDAPSの場合はldaps://[ADのFQDN]:636で指定
セカンダリ サーバ URL ldaps://hoge2.example.com:636 LDAPSの場合はldaps://[ADのFQDN]:636で指定
SSL 証明書 LDAPSに必要となるサーバ証明書を登録 証明書の作成方法は以前の記事を参照

2. 動作確認

「Single Sign-On」→「ユーザーおよびグループ」を選択し、「ドメイン」を先ほど作成したADのドメインを指定する。ADに登録しているユーザ情報が確認できればOKとなる。

参考

2021年7月24日土曜日

オレオレ証明書を使ってActive DirectoryのLDAPS認証を有効化する

Active Directory (以下、AD) は、デフォルトでLDAP及びLDAPS (LDAP over SSL) による通信を行うことができる。以下は実際にADのサーバにて開放しているポートを確認した結果となり、LDAPの389番ポートとLDAPSの636番ポートが開放されていることがわかる。

PS C:\> Get-NetTCPConnection -State Listen | Where-Object { $_.LocalPort -match "^389|^636" }

LocalAddress                        LocalPort RemoteAddress                       RemotePort State       AppliedSetting
------------                        --------- -------------                       ---------- -----       --------------
::                                  636       ::                                  0          Listen
::                                  389       ::                                  0          Listen
0.0.0.0                             636       0.0.0.0                             0          Listen
0.0.0.0                             389       0.0.0.0                             0          Listen

ただし、デフォルトの状態ではADではLDAPSは利用することができない。LDAPは利用できるが、セキュリティの観点からは通信が暗号化されるLDAPSの利用が強く推奨される。

今回は、Active Directoryに対してオレオレ証明書による証明書登録を行い、LDAPSの通信を利用できるよう構成するための手順を記載する。

環境

オレオレ証明書を作成するため、Linuxサーバのopensslコマンドを利用する。

  • 証明書作成用Linux : CentOS 8.1
  • AD : Windows Server 2016 Standard

証明書作成手順

1. Linuxサーバにて作業用ディレクトリの作成

Linuxサーバにログインし、以下の通り作業用ディレクトリを作成する。

# cd /etc/pki/tls/misc/
# mkdir ad_ldaps
# cd ad_ldaps/

上記作業用ディレクトリには、最終的に以下ファイルが配置される。登録対象に「●」を付けたファイルをADとLDAPクライアントにそれぞれ登録する。

ファイル名 登録対象 説明
private_ad.key - 署名用の秘密鍵
server.csr - サーバ証明書作成用のCSR
san.txt - サーバ証明書に登録するSAN (サブジェクト代替名)
public_ad.crt LDAPクライアントへ登録するためのサーバ証明書
private_ad.pfx ADへ登録するための秘密鍵を含むサーバ証明書 (pkcs12形式)

2. Linuxサーバにて秘密鍵の作成

opensslコマンドで、証明書作成に使用する秘密鍵を作成する。

# openssl genrsa 2048 > private_ad.key
Generating RSA private key, 2048 bit long modulus (2 primes)
........................................................+++++
.............................................+++++
e is 65537 (0x010001)

3. LinuxサーバにてCSRの作成

引き続きopensslコマンドを使用する。サーバ証明書作成をするため、CSR (証明書署名要求) を作成する。CSR作成には各種情報の入力を求められるため、以下のように設定を行う。

設定項目 設定値
Country Name (2 letter code) [JP] JPを設定
State or Province Name (full name) [Tokyo] 適当に設定
Locality Name (eg, city) [Default City] 適当に設定
Organization Name (eg, company) [Default Company Ltd] 適当に設定
Organizational Unit Name (eg, section) [] そのままエンター
Common Name (eg, your name or your server’s hostname) ADのFQDNを設定
Email Address [] そのままエンター
A challenge password [] そのままエンター
An optional company name [] そのままエンター

実際にCSR作成のコマンド実行結果を以下に記載する。

# openssl req -new -key private_ad.key > server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:JP
State or Province Name (full name) [Tokyo]:Tokyo
Locality Name (eg, city) [Default City]:Default City
Organization Name (eg, company) [Default Company Ltd]:Default Company Ltd
Organizational Unit Name (eg, section) []: ←★そのままエンター
Common Name (eg, your name or your server's hostname) []:hoge1.example.com ←★ADのFQDN
Email Address []: ←★そのままエンター

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ←★そのままエンター
An optional company name []: ←★そのままエンター

4. Linuxサーバにてサーバ証明書の作成

CSRに秘密鍵で署名を行い、サーバ証明書を作成する。サーバ証明書にSAN (サブジェクト代替名) の情報が必須となるため、以下のようにADのFQDN情報を記載したテキストファイルを作成しておく。ADが複数ある場合は、カンマ区切りで複数のサーバのFQDNを設定することができ、1つの証明書で複数台のADに登録できる証明書を作成できる
※Common Nameは複数のFQDNの記載はできないが、SANに記載があれば、きちんとLDAPSの認証は成功するようだ。

# cat san.txt
subjectAltName = DNS:hoge1.example.com, DNS:hoge2.example.com

opensslコマンド実行時に-extfile san.txtのオプションを付与して、SAN情報を含めた形でサーバ証明書を作成する。

# openssl x509 -days 3650 -req -signkey private_ad.key -in server.csr -out public_ad.crt -extfile san.txt

5. LinuxサーバにてAD登録用のpkcs12形式の証明書を作成

ADに登録するサーバ証明書は、証明書と秘密鍵をセットにしたpkcs12形式の証明書とする必要がある。秘密鍵情報を含むことから、作成時にパスワード設定を設定する。

# openssl pkcs12 -export -inkey private_ad.key -in public_ad.crt -out private_ad.pfx
Enter Export Password: ←★パスワードを入力
Verifying - Enter Export Password: ←★パスワードを再入力

最後に以下の証明書ファイルをダウンロードする。private_ad.pfxには秘密鍵が含まれるため、取り扱いには注意すること。

ファイル名 登録対象 説明
public_ad.crt LDAPクライアントへ登録するためのサーバ証明書
private_ad.pfx ADへ登録するための秘密鍵を含むサーバ証明書 (pkcs12形式)

証明書のインポート

1. ADに秘密鍵をインポート

ADのドメインコントローラとなっているサーバにて、「ファイル名を指定して実行」→「certlm.msc」を実行し、証明書の管理画面を表示させる。

「個人」を右クリックし、「すべてのタスク」→「インポート」を選択する。

「証明書のインポートウィザード」が表示されるため、以下の通り設定する。

設定項目 設定値
証明書のインポートウィザードの開始 そのまま次へ
インストールする証明書ファイル private_ad.pfxを選択。ファイル選択時に拡張子で*.pfxを選択しないとファイルが表示されないため注意
秘密キーの保護 private_ad.pfx作成時に設定したパスワードを入力
証明書ストア 「個人」を選択

問題なくインポートに成功すると、「正しくインポートされました」と表示される。

2. LDAPクライアント側のサーバに公開鍵をインポート

LDAPクライアントとするサーバにて、「ファイル名を指定して実行」→「certlm.msc」を実行し、証明書の管理画面を表示させる。

「信頼されたルート証明機関」を右クリックし、「すべてのタスク」→「インポート」を選択する。

「証明書のインポートウィザード」が表示されるため、以下の通り設定する。

設定項目 設定値
証明書のインポートウィザードの開始 そのまま次へ
インストールする証明書ファイル public_ad.crtを選択
証明書ストア 「信頼されたルート証明機関」を選択

なお、今回は割愛するが、ドメイン環境であれば、グループポリシーによる証明書登録を行うこともできる。グループポリシーの設定方法の詳細は、以下記事も参照いただきたい。

詳細は割愛するが、グループポリシーの場合は、以下にて設定を行うことができる。

「コンピューターの管理」
 →「ポリシー」
  →「Windowsの設定」
   →「セキュリティの設定」
    →「公開キーのポリシー」
     →「信頼されたルート証明機関」

3. 接続確認 (ldp.exeによる確認)

LDAPSの接続確認は、ldp.exeを使用する。なお、「リモートサーバー管理ツール」の「AD DSおよびAD LDSツール」がインストールされていない場合は使えない可能性があるため、その場合は任意のフリーソフトなどを使って確認すること。

「ファイル名を指定して実行」→「ldp」にてldp.exeを起動させ、「接続」→「接続」を選択し、以下の通り接続確認を行う。

  • サーバー : ADのFQDN
  • ポート : 636
  • SSL : チェック

問題なく接続されると、以下の通り「Established connection to [ADのFQDN]」と表示される。

ld = ldap_sslinit("hoge1.example.com", 636, 1);
Error 0 = ldap_set_option(hLdap, LDAP_OPT_PROTOCOL_VERSION, 3);
Error 0 = ldap_connect(hLdap, NULL);
Error 0 = ldap_get_option(hLdap,LDAP_OPT_SSL,(void*)&lv);
Host supports SSL, SSL cipher strength = 256 bits
Established connection to hoge1.example.com.

次に「接続」→「バインド」を選択し、ADを参照可能なユーザを選択する。ドメイン参加済み環境の場合は「現在のログオンユーザーとしてバインド」を選択しても問題ない。

ADのユーザ情報を表示させるため、「表示」→「ツリー」を選択する。ベースDNにADに登録されているOUなどを選択することで、登録されているユーザ情報の一覧を表示させることができる。

以上で、オレオレ証明書を使ってActive DirectoryでLDAPSによる認証を有効化する手順は完了となる。

参考

2021年7月13日火曜日

QNAP NASをZabbixを使ってSNMPポーリング監視する

QNAPのNASは、ストレージOSとしてQTSという独自OSが動作している。このOSにはZabbix Agentが提供されていないが、SNMPポーリング及びSNMP Trapによる監視を実装することができる。

今回、QNAP NASをZabbixを使ってSNMPポーリング監視するための設定手順を記載する。

環境

  • QNAP : TS-231P
  • QTS : 4.5.1.1540
  • Zabbix : 5.0.10

監視設定手順

1. QNAP NASにてSNMPを有効化

QNAP NASの設定は非常に簡単であり、「コントロールパネル」→「ネットワークとファイルサービス」→「SNMP」を選択し、以下を設定するだけでよい。

設定項目 設定値
SNMPサービスを有効にする チェック
トラップアドレス1 ZabbixのIPアドレスを設定
SNMPバージョン SNMP V1/V2
コミュニティ public (または任意で設定。Zabbix側の設定も合わせること)

2. ZabbixにてQNAP NASをホスト登録

ZabbixにQNAP NASをホスト登録する。SNMPによる監視を行うため、インタフェースにSNMPを追加する。

「SNMPコミュニティ」は、QNAP NASのコミュニティがpublicの場合は、特に設定変更は不要であり、{$SNMP_COMMUNITY}のままとすればよい。{$SNMP_COMMUNITY}はマクロであり、Zabbixの「管理」→「一般設定」→「マクロ」にてpublicにて設定されている。もし変更する場合は、ホストの設定で直接修正するか、マクロの設定を修正する。

3. Zabbixにてテンプレートをリンク

QNAP NASはSNMPによる監視を行う。Zabbix 5.0の場合は、以下のテンプレートを使うことで、CPU、メモリ、ディスク、ネットワークの必要なリソース情報の監視を実装できる。

監視項目 テンプレート
CPU Template Module HOST-RESOURCES-MIB SNMPv2
メモリ 同上
ディスク 同上
ネットワーク Template Module Interfaces SNMPv2

QNAP NASのホスト設定の「テンプレートをリンク」にて、上記2つのテンプレートをリンクする。

ディスカバリによって自動的に必要なアイテム、トリガーの作成が行われるが、手動でディスカバリをしたい場合は、「ディスカバリルール」タブで対象のディスカバリルールを選択し、「監視データ取得」を選択する。

4. SNMP Trap監視を有効化

SNMP Trap監視は、Zabbixに対して各種設定が必要となるため、以下別記事を参照すること。

5. 動作確認

ディスカバリがされると、以下の通り、CPU、メモリ、ディスクの各情報がグラフとして表示できるようになる。


2021年7月11日日曜日

Windows標準コマンド (PowerShell) を使ってsedっぽいことを実現する

コマンドラインを使って文字列操作を行う場合、Linuxではsedコマンドを使って実施するのが鉄板だが、WindowsではPowerShellのコマンドレットを組み合わせることでほぼ同様のことができる。

今回、いくつかsedでよく使う文字列処理のパターンに対して、PowerShellで実行する手順を検証してみたので、その結果を記載する。

文字列処理パターン

今回、以下表の8パターンの文字列処理をPowerShellで実現するコマンドを検証した。

No 文字列処理 コマンド (1行目 : sed、2行目 : PowerShell)
1 置換 sed -e 's/<検索文字列>/<置換文字列>/g' <入力ファイル>
gc <入力ファイル> | % { $_ -creplace "<検索文字列>", "<置換文字列>" }
2 空白行を削除 sed -e '/^$/d' <入力ファイル>
gc <入力ファイル> | ? { $_ -ne "" }
3 コメント(#開始行)を削除 sed -e '/^#/d' <入力ファイル>
gc <入力ファイル> | ? { $_ -notmatch "^#" }
4 改行を削除 tr -d '\n' < <入力ファイル>
gc <入力ファイル> -Raw | % { $_ -replace "`r`n", "" }
5 検索文字列の1行上に追記 sed -e '/<検索文字列>/i <追加文字列>' <入力ファイル>
gc <入力ファイル> -Raw | % { $_ -creplace "<検索文字列>", "<追加文字列>`r`n<検索文字列>" }
6 検索文字列の1行下に追記 sed -e '/<検索文字列>/a <追加文字列>' <入力ファイル>
gc <入力ファイル> -Raw | % { $_ -creplace "<検索文字列>", "<検索文字列>`r`n<追加文字列>" }
7 各行の先頭に文字列を追加 sed -e 's/^/<追加文字列>/g' <入力ファイル>
gc <入力ファイル> | % { "<追加文字列>" + $_ }
8 各行の末尾に文字列を追加 sed -e 's/$/<追加文字列>/g' <入力ファイル>
gc <入力ファイル> | % { $_ + "<追加文字列>" }

テスト用テキストファイル

実行結果を示すために、以下のテキストファイルを使用する。

PS C:\> Get-Content .\test.txt
Test
Test1

Test2

# Test3
Test4

Test5

また、コマンドの記載を簡略化するため、以下の省略法を使用する。

コマンドレット 省略記法
Get-Content gc
ForEach-Object (foreach) %
Where-Object (where) ?
Select-Object select

1. 置換

正規表現を使用しない場合の置換コマンド

置換はいくつか方法があるが、簡単なのは、Get-ContentコマンドレットのReplaceメソッドを使う方法となる。この方法では正規表現は利用できず、大文字・小文字の区別がされる状態で置換される。

PS C:\> (gc .\test.txt).Replace("Test1","Hoge")
Test
Hoge

Test2

# Test3
Test4

Test5

また、置換したテキストをファイルに出力したい場合は、以下の通りOut-Fileコマンドレットを使用する。

PS C:\> (gc .\test.txt).Replace("Test1","Hoge") | Out-File test-out.txt

正規表現を使用する場合の置換コマンド

正規表現使う場合は、以下の通り記載する。大文字・小文字の区別するよう-creplaceを使用しているが、もし大文字・小文字の区別が不要な場合は、-replaceを使用すればよい。

PS C:\> gc .\test.txt | % { $_ -creplace "^Test", "Hoge" }
Hoge
Hoge1

Hoge2

# Test3
Hoge4

Hoge5

2. 空白行を削除

空白行を削除する場合は、Where-Objectコマンドレットで「""」以外の行を出力させることで対応する。

PS C:\> gc .\test.txt | ? { $_ -ne "" }
Test
Test1
Test2
# Test3
Test4
Test5

3. コメント(#から始まる行)を削除

以下の通り実行すれば実現できる。

PS C:\> gc .\test.txt | ? { $_ -notmatch "^#" }
Test
Test1

Test2

Test4

Test5

コメントと空白行を同時に削除する場合は、-andを使って以下のように実行すればよい。

PS C:\> (gc .\test.txt) | ? { $_ -notmatch "^#"  -and $_ -ne "" }
Test
Test1
Test2
Test4
Test5

4. 改行を削除

Get-Content-Rawパラメータを付けると、改行コードなども含めて出力されるので、これを利用すして改行コードを置換して消すことで改行を削除して、すべてのテキストを1行で出力させることができる。

PS C:\> gc .\test.txt -Raw | % { $_ -replace "`r`n", "" }
TestTest1Test2# Test3Test4Test5

5. 検索文字列の1行上に追記

以下を実行する。なお、わかりやすくするため、検索文字列を$strに、追加文字列を$add_strに代入している。

PS C:\> $str="Test2"
PS C:\> $add_str="Test1.5"
PS C:\> gc .\test.txt -Raw | % { $_ -creplace "$str", "$add_str`r`n$str" }
Test
Test1

Test1.5
Test2

# Test3
Test4

Test5

6. 検索文字列の1行下に追記

以下を実行する。なお、わかりやすくするため、検索文字列を$strに、追加文字列を$add_strに代入している。

PS C:\> $str="Test2"
PS C:\> $add_str="Test1.5"
PS C:\> gc .\test.txt -Raw | % { $_ -creplace "$str", "$str`r`n$add_str" }
Test
Test1

Test2
Test1.5

# Test3
Test4

Test5

7. 各行の先頭に文字列を追加

以下を実行する。foreachで各行に対して先頭に文字列を連結する。

PS C:\> gc .\test.txt | % { "Hoge1_" + $_ }
Hoge1_Test
Hoge1_Test1
Hoge1_
Hoge1_Test2
Hoge1_
Hoge1_# Test3
Hoge1_Test4
Hoge1_
Hoge1_Test5

8. 各行の末尾に文字列を追加

以下を実行する。foreachで各行に対して末尾に文字列を連結する。

PS C:\> gc .\test.txt | % { $_ + "_Hoge1" }
Test_Hoge1
Test1_Hoge1
_Hoge1
Test2_Hoge1
_Hoge1
# Test3_Hoge1
Test4_Hoge1
_Hoge1
Test5_Hoge1

更新履歴

  • 2020/6/23 新規作成
  • 2021/7/11 「文字列処理パターン」の表にsedだけでなく、PowerShellのコマンド構文を記載

2021年7月6日火曜日

OSSのロードバランサ「ZEVENET Community Edition」にてTCP half-openのカスタムモニターを実装する

OSSのロードバランサである「ZEVENET」では、カスタムモニター (Farmguardian) を作成することができる。この作成方法は以下記事にした通りで、Linuxのncコマンドやnmapコマンドなどを利用したスクリプトを作成することで実装できる。

今回は、ZEVENETにてTCP half-openチェックと呼ばれる方法で負荷分散対象のサーバを監視するカスタムモニターを作成したので、実装方法を記載する。

環境

  • ESXi 6.7 Update 3
  • ZEVENET Community Edition 5.11

TCP half-openチェックとは

そもそも、TCP half-openチェックどのような監視手法かについて説明しよう。

ロードバランサで頻繁に使用されるモニターとして「TCP チェック」がある。TCPチェックでは、以下のTCPの3ウェイ・ハンドシェイクのステップを負荷分散対象のサーバに対して行い、問題なくコネクションの確立ができたのちに、FINパケットを送信してコネクションを切断する。

  1. 送信元→送信先へSYNパケット送信
  2. 送信先→送信元へSYN+ACKパケットを送信
  3. 送信元→送信先へACKパケット送信

しかし、TCPチェックには問題があり、TCPのコネクションを確立した後に切断処理をすることから、サーバ側のログにアクセス記録やエラーログが残ってしまう場合がある。

例えば、以下はPostfixにて構築したメールサーバに対するTCPチェックのログの例となる。ロードバランサ (IPアドレス : 192.168.33.25) からのconnectされたメッセージとdisconnectされたメッセージが確認できる。

Feb 18 06:34:50 64362e23f9d3 postfix/smtpd[158]: connect from unknown[192.168.33.25]
Feb 18 06:34:50 64362e23f9d3 postfix/smtpd[158]: lost connection after CONNECT from unknown[192.168.33.25]
Feb 18 06:34:50 64362e23f9d3 postfix/smtpd[158]: disconnect from unknown[192.168.33.25] commands=0/0
Feb 18 06:35:05 64362e23f9d3 postfix/smtpd[158]: connect from unknown[192.168.33.25]
Feb 18 06:35:05 64362e23f9d3 postfix/smtpd[158]: lost connection after CONNECT from unknown[192.168.33.25]
Feb 18 06:35:05 64362e23f9d3 postfix/smtpd[158]: disconnect from unknown[192.168.33.25] commands=0/0

上記ログは、無視すれば問題ないものであるが、不要なログが出力されることにより、ログの可読性の低下や、容量増加といった問題が発生する。

そこで、サーバ側にログを残さずTCPチェックを実現する方法として、「TCP half-openチェック」のカスタムモニターを実装することにした。TCP half-openチェックの動作について、再度3ウェイ・ハンドシェイクのステップを見ながら説明する。

  1. 送信元→送信先へSYNパケット送信
  2. 送信先→送信元へSYN+ACKパケットを送信
  3. 送信元→送信先へACKパケット送信

TCP half-openチェックでは、上記の2番目ステップのSYN+ACKパケットを受け取った時点でサーバのポートに問題がないものと判断する。3番目のステップでは、ACKパケットを送信するのではなくRSTパケットを送信することで、3ウェイ・ハンドシェイクを中断させ、コネクション確立前に通信を終了させる。

上記のように、送信元からSYN+ACKを受け取った状態 (half-open) で通信を終了させることで、サーバ側に不要なログが残ることを抑止できる。

ZENEVETでTCP half-openのカスタムモニターを作成する

1. カスタムモニター用のスクリプトを作成

TCP half-openチェックはnmap -sSを使うことで簡単に実行できる。以下はRHEL 7でnmapを実行した例となる。正常に接続できればSTATEopenで表示される。

▼接続成功例
# nmap -sS -p 25 192.168.33.23

Starting Nmap 6.40 ( http://nmap.org ) at 2021-02-20 10:28 JST
Nmap scan report for t3023cent.intrat.local (192.168.33.23)
Host is up (0.00036s latency).
PORT   STATE SERVICE
25/tcp open  smtp

接続に失敗する場合は、STATEclosedであったりfilteredになる。

▼接続失敗例
# nmap -sS -p 123 192.168.33.23

Starting Nmap 6.40 ( http://nmap.org ) at 2021-02-20 10:29 JST
Nmap scan report for t3023cent.intrat.local (192.168.33.23)
Host is up (0.00035s latency).
PORT    STATE  SERVICE
123/tcp closed ntp

Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds

ZEVENETにおいてもnmapコマンドは使用できるのだが、単独ポートでスキャンを実行するとfilteredになるという不具合が存在する。

# nmap -sS -p 25 192.168.33.23
Starting Nmap 7.70 ( https://nmap.org ) at 2021-02-20 10:34 JST
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 192.168.33.23
Host is up (-0.20s latency).

PORT   STATE    SERVICE
25/tcp filtered smtp
MAC Address: 00:0C:29:1F:E0:DE (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.44 seconds

スキャン対象のポートを単独ではなく、範囲指定を行うとなぜか成功し、openステータスとなる。

# nmap -sS -p 25-26 192.168.33.23
Starting Nmap 7.70 ( https://nmap.org ) at 2021-02-20 10:34 JST
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 192.168.33.23
Host is up (-0.15s latency).

PORT   STATE  SERVICE
25/tcp open   smtp
26/tcp closed rsftp
MAC Address: 00:0C:29:1F:E0:DE (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.44 seconds

上記をふまえ、あまり綺麗な回避策とはいえないが、nmapを監視対象と監視対象ポート+1のポート範囲を指定して実行するようカスタムモニタースクリプトを作成することにする。

結果、カスタムモニタースクリプトcheck_tcp_half_openは以下内容となった。本スクリプトは/usr/lib/nagios/pluginsのディレクトリに配置しておく。

# cat /usr/lib/nagios/plugins/check_tcp_half_open
------------------------------
#!/bin/bash

HOST=$1
PORT=$2
NextPORT=$((${PORT}+1))

nmap -n -sS -p ${PORT}-${NextPORT} ${HOST} | grep open | grep ${PORT}
------------------------------

最後にスクリプトに実行権限を付けておく。

# chmod +x /usr/lib/nagios/plugins/check_tcp_half_open

2. モニター (Farmguardians) を作成

管理GUIにログインし、「Monitoring」→「Farmguardians」にて「CREATE FARMGUARDIAN」を選択する。

Farmguardianの設定は以下の通りとする。Commandの「HOST」はチェック対象のホストのIPアドレス (またはホスト名)、「PORT」はチェック対象のポート番号を示す変数となる。Intervalは負荷分散対象にチェックを行う間隔となるので、要件に応じて設定すればよい。

設定項目 設定値 (TCP half-openチェック)
Name check_tcp_half_open
Command check_tcp_half_open HOST PORT
Interval 15 seconds

3. Farmの設定を修正

「LSLB」→「Farms」で修正対象のFarmの「Edit」ボタンを選択する。

「Health Checks for backend」を先ほど作成したモニターに設定変更する。なお、ZEVENETではなぜか本設定を変更すると「Submit」ボタンを押すことなく即座に設定反映されてしまうので、設定時は注意が必要となる (反映された旨が、自動的に右下にメッセージとして表示される)。

4. 動作確認

設定変更後、「Monitoring」→「Farm Stats」を確認し、負荷分散対象がUpステータスになっていることを確認する。

また、負荷分散対象のサーバのログを確認し、負荷分散装置からのモニターによるアクセスログが出力されていないことを確認する。

▼Postfixのログの例

15秒間隔で出力された接続・切断のログが表示されなくなった。

Feb 21 06:44:05 64362e23f9d3 postfix/smtpd[203]: connect from unknown[192.168.33.25]
Feb 21 06:44:05 64362e23f9d3 postfix/smtpd[203]: lost connection after CONNECT from unknown[192.168.33.25]
Feb 21 06:44:05 64362e23f9d3 postfix/smtpd[203]: disconnect from unknown[192.168.33.25] commands=0/0
Feb 21 06:44:20 64362e23f9d3 postfix/smtpd[203]: connect from unknown[192.168.33.25]
Feb 21 06:44:20 64362e23f9d3 postfix/smtpd[203]: lost connection after CONNECT from unknown[192.168.33.25]
Feb 21 06:44:20 64362e23f9d3 postfix/smtpd[203]: disconnect from unknown[192.168.33.25] commands=0/0

▼Squidのログの例

15秒間隔で出力されたerror:transaction-end-before-headersのログが表示されなくなった。

1613857802.748      0 192.168.33.25 NONE/000 0 NONE error:transaction-end-before-headers - HIER_NONE/- -
1613857817.752      0 192.168.33.25 NONE/000 0 NONE error:transaction-end-before-headers - HIER_NONE/- -
1613857832.756      0 192.168.33.25 NONE/000 0 NONE error:transaction-end-before-headers - HIER_NONE/- -

参考

人気の投稿