このブログを検索

2021/10/26

paloaltoでDNATするときの「元のパケット」のゾーン

 paloaltoでDNATするとき、「元のパケット」の宛先ゾーンをNATで変換した後のアドレスのゾーンにしないように注意。


大体外からやってくる通信をLANのアドレスに変換すると思う。

ゾーンは大体、untrust → trust という通信になる。


しかし、NATポリシーを書くときには「どの通信をNAT対象とするか」という設定が必要であり、それはuntrustゾーンに来るuntrustゾーンのセグメントのIPアドレス宛であるから、送信元も宛先も untrust になるのである。


まあ、考えてみれば当然なのだが昔はまったことがあり久しぶりに設定したら同じようにはまった。


2021/10/10

「おうちWifi」はどこでも使えるのか

Softbank Airというサービスを使ったことがある。

家でインターネットを使うための装置であるが、通常は自宅に回線を引いてルーターを設置して使うが、「Air」はルーターが無線接続なのである。

ルーターの内側(LAN側)、ユーザーがルータと接続するところは無線で利用している人が多いと思うが、ルータのWAN側も無線にしてしまおうというサービスである。

「工事不要、置くだけで使えます」

みたいなキャッチコピーで宣伝されていた。


私の場合、ある事情で住まいをすぐに引っ越す予定もあったため、都合がよかったので利用した。


おうちWifiは、いわゆる「モバイルWifiルータ」のようなものだと思ったのだが、実は違う。

装置的には同じなのだが、「おうちWifi」は引っ越す場合手続きが必要になる。

モバイルWifiルータであればどこでも使える。だから「モバイル」なのである。


しかしおうちWifiは無線なのに、引っ越すときに手続きをしなければならない。

これは推測なのだが、おうちWifiについてはユーザがどこにどれだけいるかを管理していて、ユーザ数によって帯域を調整したりしているのではないか。

つまり、「工事不要」といってもSoftbankの網内ではなんらかの「工事」のようなものが施されているはずだ。

そうでなければ引っ越してどこで使おうが届け出る必要はないはずだから。


Softbank Airを使ってみての感想はあまりよくなかった。遅かった。

今はどんどんワイヤレス化が進んでいていつかはほとんどワイヤレスになるのではあろうが、まだ過渡期で、ワイヤレス通信で不満を感じることは多い。

あと、すぐ引っ越して解約する予定だったのにルータを買い取り契約にしてしまっていて、解約した後も使わなくなった機器料金をしばらく払い続けるということになり、買い取りにした覚えはないとか、説明が足りないとか文句を言った挙句ソフトバンクのサービスは二度と使わないと決め、すべて解約した。

paloaltoのconfigを見ていて

paloaltoというFWアプライアンス装置のconfigを見ていた。

paloaltoはブラウザで設定を表示、変更できるのだが、

configをエクスポートするとxml形式になる。

実機があれば、というか実機にアクセスできる権限があればブラウザで直接見ればよいのだが、わけあって実機にアクセスできないためxml形式のconfigファイルを見る必要があったのだ。

この手の装置のconfigをテキストでもらってテキストなりexcelなりで開くのはよくあることなのだが、paloaltoの場合少し苦労した。

xmlファイルというのは、htmlファイルと同じような感じで、<>で囲まれたタグに挟まれてデータが記述されている。

タグは何があるかわからず、階層化されている場合もある。

excelでxmlファイルを開くと一応解析のようなことをしてそれらしき表形式にしてくれるのだが、paloaltoのコンフィグファイルはまともな形にならなかった。

なので、xmlではなく単なるテキストファイルとして読み込んでみた。

<tag>data1</tag> 

のような形式でconfigの設定内容が並んでいる。

ポリシーの部分は以下のようになっている。


<rulebase>

 <security>

 (セキュリティルール)

 </security>

 <nat>

 (NATルール)

 </nat>

</rulebase>


そしてセキュリティルールとNATルールが数百行書かれているわけだが、

その各ルールを見ていくと、設定されている項目とされていない項目がある。

excelでうまく読み込めないので、自分で項目をそろえていった。

例えば<tag>, <to>, <from>, <source>, など。


特に困ったのがNATルールである。

paloaltoはセキュリティルールとNATルールが別になっている。

NATには送信元NAT、宛先NAT、static変換、inteface NATなど様々な方法が組み合わされるので、xmlファイルの項目のバラツキが大きい。

大体いくつかのパターンにはなるのだが、数百行あり順番も意味を持つため慎重に見ていかねばならない。

最初は同じタグの項目がexcelの同じ列になるようにそろえていったのだが、想定外のことが一つあった。

paloaltoのconfigファイルの項目は、一定の順序になっていないのだ。


例えば、

<tag><src><dst><to><from><source-translation><destination-translation>

などの項目があるのだが、送信元のみNATするなら<destination-transloation>はない。

<tag>というのは注釈のようなものだからある行とない行がある。


最初は項目がないところはずらしていけば揃えられると思っていたのだが、

行によって<source-translation>と<destination-translation>の順番が逆だったりする。


fortigateのconfigを見たこともあるのだが、fortigateはxml形式ではないが<>で項目が区切られており、設定により項目があったりなかったりはするのだがその出現順番は同じであった。

だが、paloaltoは一定でないのだ。


本当はpythonなどで読み込んでタグごとの項目をいったん変数に格納して決まった順番で並びなおして出力する、などをしたかったのだが、すべきなのだろうが、結構複雑になりそうなのでそれはしなかった。

そして地道にexcelでセルを移動して項目をそろえていった。


しばらくやっているうちに、気づいた。

そもそもxmlファイルというのはexcelのような表形式を想定しておらず、その項目がなんであるかはタグによって決定されるのであり、また、タグによらずに決定してはならないのである。


それは、今私がしているようにExcelの表形式にするには不便な仕様なのであるが、データを作成し記述することを考えた時に、項目の順番を意識せずに正しいタグさえつければ順番はどうでもかまわない、読み込むときにタグを指定すれば<src><dst><from><to>であっても<to><src><from><dst>であってもかまわないのだ。


私は若いころは固定長フィールドのファイルを使っていて、データの扱いに関する意識が古いところがある。最近はもう固定長フィールドなんかほとんど使わない。

しかし、ドキュメントはだいたいExcelで作られる。ほとんどがExcelである。

パソコンでExcelを使うことが「デジタル化」であるとか「IT」であるとかいうのは間違っている。

Excelの表形式のファイルを皆で共有して更新しあっているなんていうのは、紙に印刷したものにハンコを押すようなやり方とあまり変わらない。



2021/09/26

iPhoneのkindleに購入した本が表示されない場合

 私は電子書籍をあまり読まないのだが、

先日iPhoneを初期化してkindleを開いたら買ったはずの本がライブラリに表示されなくなった。

いったんログアウトしたり、同期ボタンを押したりしても変わらない。

私はiPhoneの言語設定を英語にしているのだが、その場合kindleの配信がうまくいかないことがある、みたいなことが以前あったので、言語設定を日本語にしてみたが変わらない。

ブラウザでkindle端末を表示させるとiPhoneが表示されているがこれはiPhoneを初期化する前に登録されたものである。

いったん登録を解除してみる。

しかし、kindleを再起動してもログアウトログインしなおしても、ライブラリは更新されない。


同じ状況の人がいないか探してみると、「Amazon.comのアカウントを見てしまっている」という人がいた。

私はamazon.comもamazon.co.jpも同じアカウントで登録している。

kindleログイン時は.comか .co.jpかなんて選択はないのでどちらにログインしているかわからない。

そこで、あえてamazon.comの方のパスワードを変えて、.comの方にログインできないようにした。

そして再度iPhoneのkindleアプリでログアウトログインしてみた。


パスワードは保存されているものは使わず手入力する。

すると「パスワードが間違っている」となった。

あれ?


自分のアカウントやパスワードを記録しているメモを見ると、

amazon(.co.jpの方)のパスワードが自分の思っているものと違っていた。


正しいパスワードを入力すると、ライブラリに購入した本が表示された。

やはり、kindleログイン時にamazon「.com」のアカウントでログインしていたようだ。


しかし、これはバグだよね。

もしくは.comと .co.jpでアカウントが統一されてないのがダメだよね。


ちなみにamazonの「コンテンツと端末の管理」でkindle端末の登録解除をした場合、

再度その端末でログインすると再度端末が表示されるようになる。


解除しようとすると「解除するとこの端末でコンテンツを購入できなくなります」などという物騒なメッセージが表示されるが、これはウソである。



2021/09/23

古いASAにASDMでアクセスできないのはTLSバージョンのせい

私はCisco ASA5505を持っている。

ヤフオクで入手した中古品だ。


ASAはASDMというJavaで動く管理用のGUIツールを使って設定する。

CLIでも設定できるが見やすかったり設定しやすかったりするのでだいたいASDMを使う。


久しぶりに引っ張り出してASDMでアクセスしたら、こんなエラーになった。


ログインダイアログ右下にあるJavaコンソール(コーヒーカップのアイコン)を開いてアクセスすると、以下のようなエラーが記録されている。

javax.net.ssl.SSLHandshakeException: The server selected protocol version TLS10 is not accepted by client preferences [TLS12]


Javaのバージョンは 1.8.0_301-b09
ASAは9.2(4)33

コントロールパネルの「プログラム」にあるJavaコントロールパネルを起動し、
詳細タブを見ると、「高度なセキュリティ設定」のところの「TLS1.0を使用する」のチェックがはずれている。


ASAにconsoleかsshでログインしてみると

# show ssl
Accept connections using SSLv2, SSLv3 or TLSv1 and negotiate to SSLv3 or TLSv1
Start connections using TLSv1 and negotiate to TLSv1
Enabled cipher order: dhe-aes256-sha1 dhe-aes128-sha1 aes256-sha1 aes128-sha1
Disabled ciphers: 3des-sha1 des-sha1 rc4-md5 rc4-sha1 null-sha1
SSL trust-points:
  outside VPNLB interface: ASDM_Launcher_Access_TrustPoint_0
  outside interface: ASDM_Launcher_Access_TrustPoint_0
Certificate authentication is not enabled


TLS1しかサポートしていない。

ASAはTLS1、JavaはTLS1.1以上だったため、接続できないのだ。

接続できるようにするには、ASAがTLS1.1以上を使うか、JavaがTLS1.0を使うようにすればよい。

が、結論から言うとどっちもできなかった。
ASAには ssl server-versionというコマンドがあるのだがtlsv1より上を設定できない。

そしてJavaコンソールでTLS1.0をチェックしても、上記のエラーは変わらない。
ここの設定を変えてもTLS1.2で接続しようとするようなのだ。

家にJavaがインストールされていない古いパソコンがあったので、
そこに 1.7.0_80-b15 を入れてみた。

Javaコンソールを開くと「TLS1.0を使用する」がチェックされており、1.1と1.2はチェックされていない。

この状態だとASDMで接続できた。


OSをあげれば、と思ったが、
5505は販売終了製品で、9.2(4)33が2018年にリリースされた後新しいバージョンはリリースされていない。

JavaコンソールでTLS1.0をチェックしてもダメな理由がわからず、
どこか別の設定を変えればいけるのかもしれないが使用が推奨されない古いプロトコルを使うことをあまり深追いするのもアレなので。

2021/07/29

tera termマクロでshow tech-support取得するときの問題

 cisco機器の show tech-supportをいくつも取るというケースがよくある。

そのとき tera termのマクロを作って自動化しようとしたが、

いろいろとうまくいかないことがある。


今回対応したのは以下の2点である。


1.ログの自動取得ができない。

2.意図しないところで中断してしまう。


1. ログの自動取得ができない

tera termマクロではログ取得のコマンドがあるが、tera term自体の設定でログを自動取得する設定にしている場合、ひと手間かけないと設定によるログ取得が優先されてコマンドによるログ取得ができない。

多分そうだろうな、とは思っていたのだが、自動取得されたログを使えばいいのでそのままにしていたのだが、やっぱりログファイル名を「hostname_show_tech-support」とかにしたくて調べたら簡単にできた。

logを取得するコマンドは logopenである。

logfilenameという変数にログファイル名が設定されているとき、

logopen logfilename 0 0

とすればよい。二つのゼロの引数は、binary flagとappend flagである。

0 0 の場合asciiモードで上書きである。


そして、このコマンドを実行したときにすでにログが取得されている場合、

つまりtera termの設定でログの自動取得が有効になっている場合、

このコマンドは実行されないようである。


tera termの設定を変更して自動ログ取得を無効にすることはしたくない。

この場合、loginfoというコマンドを使うと、現在のログ取得状態がわかる。

loginfo logname

このように実行するとlognameに現在取得中のログファイル名が格納され、

 resultにログ取得時のフラグが格納される。

そしてログが取得されていない場合は resultに -1 が格納される。


だから、自動取得している場合に任意の名前でログを取得しなおしたければ、

loginfoコマンドを実行してresultが -1 でなければ、logcloseしてからlogopenすればよいのである。



2. 意図しないところで中断してしまう

これは常識なのかもしれないが...

私はいつもtera termマクロでコマンドを実行するとき、以下のようにしている。

sendln 'show version'

wait '#'


これでほとんどの場合はうまくいくのだが、show tech-supportでこうすると、

途中で終わってしまう。

なぜなら show tech-supportの結果の中に # が含まれているからだ。

show tech-supportでなくても、コマンド実行結果の途中に # が含まれるコマンドを実行すると、そこで wait '#'が機能してしまい、次の処理へ進んでしまう。


私はこの対策として、10秒待ってから任意の文字列をsendlnし、

その文字列をwaitするということをしていた。


これで大体の場合、うまくいった。

しかし、最近その方法がうまくいかないケースがあった。

show tech-supportの取得中に数十秒程度待つ状態がおこる機種があって、

10秒待って任意の文字列を送る、というのが機能しなかったのだ。


じゃあ60秒待てばよいかというと、そうしたら他の機種で余計な待ち時間が発生することになる。


そこで以下のように対応した。

まず、接続する装置はホスト名で指定することにする。

そのために、hostsファイルにホスト名とIPアドレスの対応を記載する。


macroではプロンプトを表示してホスト名を入力するようにする。

そして、入力したホスト名+"#"を変数に格納し、その変数をwaitする。

hostname = 'router01'

my_prompt = hostname

strconcat my_prompt '#'


sendln 'show tech-support'

wait my_prompt





2021/07/08

TOEIC

以下は私が今まで受験したTOEICの結果である。()内はListeningとReadingの得点


1997 57th 695 (370, 325)

1998 64th 800 (385, 415)

2001 84th 800 (425, 375)

2002 91st 805 (420, 385)

2013 178th 835 (445, 390)

2019 243rd 745 (375, 370)

2021 270th 895 (440, 455)


初回から2013年までは得点はあまり上がりもしないが下がりもしなかった。

2019年に受けた時は、しばらく受けてなかったけどちょっと受けてみるか、

と軽い気持ちで臨んだら前回から90点もさがり、歴代最低から2番目の得点となってしまった。


テスト内容が多少変わったのと、最近はTOEIC対策の参考書やサイト、アプリなどが増えてきて、受験生のレベルもあがっている。

今回改めて確認して気づいたのだが、得点があがっていた2013年までの結果も、percentile rankを見ると少しずつ下がっていた。


今回は前回の結果を払拭すべく1か月半ほどけっこう対策をして臨み、

なんとかそこそこの結果をだせた。あと5点で900点だった。

900点なんか夢の数字だったのだが...


TOEIC800点くらいを取ると、英語が得意な人に分類されるようになり、

英語のドキュメントやメールを読んだり書いたりするのを頼まれるようになったりしたが、

その時感じたのは、日本人の英語力の低さ、苦手意識、「英語アレルギー」とでもいうべきものは相当なものがあるということだった。


英語は中学生、高校、大学と必須の科目であるのに、社会人になった私の周囲には本当に基本的なことも理解できない人がたくさんいた。


私には、彼らは外国語を理解することはあまり本質的な重要な事ではないと考えているように見えた。


「日本に住んで日本人同士でコミュニケーションできれば英語は必要ない」

「誰かに翻訳や通訳を頼めばよい」

「本質を理解していれば英語がわからなくてもなんとなく話は通じる」

「あの人は英語は得意だけど専門知識はない(アタマが悪い)、私は英語が苦手だが専門知識はある(英語ができないだけでアタマは良い)」

「英語を使う環境にいれば誰でも英語はわかるようになる(自分だって外国で暮らせば英語なんかしゃべれるようになる)」

「将来自動翻訳機や翻訳サイトが発達して外国語を勉強する必要などなくなる」


というような考えがあるために英語を勉強しようとしない、使おうとしない。


私が初めてTOEICを受験した1997年は、インターネットがようやく一般人に普及し、それまでは実験的だったり紙に書いてあったものをそのままネットに移していたようなコンテンツがだんだんインターネットならではの内容となり、つまり、情報が情報として実用的になってきたくらいの状況だった。

まだiPhoneはなく、私は確か携帯電話も持っていなかった。

パソコンは自宅に持っていてインターネットは見ていたが、

ニュースを見る、メールの送受信をする程度だった気がする。


今みたいにSNSもないし(似たようなものはあったかもしれないが少なくとも私は使っていなかった)、

なんでもかんでもgoogle検索、という時代でもなかった。


今確認したが2ちゃんねるが1999年、facebookもミクシィも2000年代になってから、

twitterはその後だ。

Amazonは1995年ごろ始まっていて大きなニュースにもなっていたが、私は「本なんか本屋で買えばいいじゃん」と思っていて全く使っていなかった。

私のホームページ(ブラウザを開くと最初に表示されるページ)はYahoo!JAPANであった。


それから24年経った。


確かに翻訳サイトの精度は向上した。

自動翻訳機やアプリも出てきた。


しかし、英語を自分で読まなければならない機会、読んだ方がいい機会はあまり減っていないどころか、むしろ増えたようにさえ思う。


海外の出来事はすぐに日本語に翻訳されて報道される。

しかし今や、ニュースソースはだれもが直接参照することができる。

アメリカ大統領がtwitterで発言し、それを誰もがリアルタイムに読める時代である。


それなのにわざわざ誰かが翻訳するのを待つ必要があるのか。

現代はもはや「ソースを直接読んだ方がいい」というより、「なぜわざわざ翻訳するのか」

という時代なのである。


さて、本題はここからである。

茂木健一郎という人が、twitterでTOEICに対して否定的な発言をしていた。

私は「またか」と思った。

たしか2013年に受験した日、当時この人をfollowしていた私は、彼が「今日もTOEICなどという無駄な試験を受けに行く人がいるのか」みたいなことをツイートしているのを、自分のiPhoneで見たのだ。


当事者だから、そのことはよく覚えていた。

私もTOEICの特殊性は理解している。

実質日本や韓国辺り限定の試験であるとか、難易度としては非常に低いとか、

英語のネイティブスピーカーは存在すら知らないとか、

留学するような人はTOEFLというもっと高度な試験を受けるのだとか。

TOEFLも1回受けたことがあって、その時には確かにTOEICなんか子供だましだみたいに感じた。


しかし、その後も受験し続けた。

周囲でもTOEICのスコアは重要な指標とされていた。


先ほど述べたように、日本人の英語に対する拒否感は強烈なのである。

シェークスピアだとか論文だとかを読むなんて到底できないレベルなのである。


そういう人たちにとっては、TOEICの点数を励みに英語力を向上させて、少しずつ高度な英文に触れるようになっていくことに意味があるのである。


いまにして思うとTOEIC800点程度で「英語が得意な人」だと思っていたのは恥ずかしいことだったが、TOEICをきっかけに私は英語に興味を持ち、少なくとも苦手意識を持つことはなかった。完全にわからない発言や文章に対しても、理解しようという態度で接することができた。


TOEICが日本人が学校で受ける試験と決定的に違うところはそのスピードと量である。

TOEICは、じっくり考えることが許されない試験である。

頭を使ってはいけないのである。頭を使うと時間が足りなくなる。聞き逃す。

そういう風に作られている。


そして英語を理解するにはそれが必要である。

一言一句を吟味して辞書を引いてどの語を使うべきか迷う、そういうことも大切なことではあるが、外国人である我々が馬鹿正直にそうやって英語に対していたらいつまでたっても使えるようにならない。


TOEICによって、「英語を英語として理解する」という非常に重要な態度が身につく。

スピーキングやライティング以前の問題である。


茂木さんは数年前、twitterでお笑い芸人が政治的な発言をしないみたいなことを発言して、ワイドナショーで松本人志の前でそれを謝罪(そんなに堅苦しいものではないが)したことがある。


そんなに深い考えや固い信念を持って発言する人ではないのだ。


さらにもっと前に、確かyoutubeでだったと思うが、

何人かでMacとWindowsの話をしていてWindowsを全面的に否定する発言をして

その場にいた西和彦を憤慨させたのを見たこともある。


彼は自分は天才で凡人には理解できない独特の考えを持っていると思っているフシがある。

だから誰かが気分を害するとか反発を受けるということを考えずに、あるいは、それを見込んで、好き勝手なことを言う人なのだ。



2021/07/05

pythonでexcelファイルの正規表現置換をする

 excelの内容を正規表現で置換したかった。

ある列に、数字をカンマで区切った内容を入れてあるのだが、

最後がカンマで終わっている場合、カンマを取りたい。


たとえば、


123, 124, 222, 234

333, 444, 555, 666,

111, 222, 333


みたいな場合、2行目の666, のカンマをとって

333, 444, 555, 666

としたい。


pythonの正規表現は使ったことがあり、

最初は

resut = pattern.match(",$",s1)

という風にしたのだが、なぜかマッチしない。

findallを使ったらマッチした。


置換はもっとスマートな方法があるかもしれないが、

最後の一文字を落とす、という風にした。


###########################
import glob
import os
import openpyxl
import re
import sys


pattern = re.compile('.*,')


bookname = sys.argv[1]

newbook = sys.argv[2]

wb = openpyxl.load_workbook(bookname,data_only=True)

ws = wb[u"Sheet1"]

#print(ws.cell(row=1, column=1).value)


for row in range(1000):
	c1 = ws.cell(row=row+1, column=9)
	if c1.value is None:
		pass
	else:
		s1 = str(c1.value)
		result = re.findall(r",$",s1)
		if result:
			print(str(s1[:len(s1)-1]))
			s2 = str(s1[:len(s1)-1])
			c1.value = s2

wb.save(newbook)
wb.close
##################################

列は9列目(「I列」)を固定で指定。

ファイル名と保存ファイル名は引数で指定

python rep.py filename1 filenmae2

2021/06/06

postfixとdovecotの証明書更新

 先日適当にやってなんとか使えるようになっていたメールサーバの証明書が有効期限がすぎて、

iphoneでしつこく警告が表示されるようになったので証明書を更新したのだが、

その際にちょっと苦労したのでメモ。


まず、前提条件

・CAとメールサーバは同じサーバ。同じcn

・postfixとdovecotで使用する証明書は同じ


今回はcaの秘密鍵や証明書がどこにあるのが最新だかわからなくなってしまったので、

全部最初から作り直した。


やること。

1. caの秘密鍵生成

2. caの証明書作成(csrを発行して署名)

3. サーバの秘密鍵生成

4. サーバ証明書作成(csrを発行して署名)


postfixとdovecotの設定ファイルに証明書と秘密鍵の場所を設定する。


# grep smtpd_tls /etc/postfix/main.cf

smtpd_tls_cert_file = /etc/pki/tls/certs/server.crt

smtpd_tls_key_file = /etc/pki/tls/private/server.key


# grep tls /etc/dovecot/dovecot.conf

ssl_cert = </etc/pki/tls/certs/server.crt

ssl_key = </etc/pki/tls/private/server.key

ssl_ca = </etc/pki/tls/certs/ca.crt


# grep tls /etc/dovecot/conf.d/10-ssl.conf

ssl_cert = </etc/pki/tls/certs/server.crt

ssl_key = </etc/pki/tls/private/server.key


postfixやdovecotの設定パラメータやその書き方はよく変わる。

古い設定もしばらくは有効らしいがきっとそのうち使えなくなるので

なるべく最新にする。


ログを見ていると最新じゃないとかこの設定はいらないとか出ている。


サーバ秘密鍵は暗号化してしまうとダメときいたので暗号化しないようにした。





caで署名するときに秘密鍵や証明書を指定しないと設定ファイルの値を使うので、

設定ファイルを直すか、明示的に指定すること。

もしたまたま秘密鍵や証明書が存在していると、意図しないものを使ってしまうことになり、あとで正しい証明書として認識されないので注意。


わからなくなったら全部消してやり直すべし。


/var/log/maillog を見ていれば何が悪いかはだいたいわかる。



ca証明書をクライアントにインストールする。

私の場合iphoneでしか使わない。

iphoneの場合、pem形式のファイルをメールに添付して送ると開いたときにプロファイルとして保存されるので、それをインストールする。



2021/05/13

公開鍵暗号方式における暗号化とデジタル署名の双方向性に関する考察

公開鍵暗号方式において、暗号化は、公開鍵を用いて行われ、受信者は秘密鍵を用いて暗号化されたデータを復号する。

 

このとき公開鍵と秘密鍵はペアであり、データを暗号化して送信する者をA、データを受信して復号する者をBとすると、公開鍵はBが作成して公開した鍵であり、秘密鍵はBが作成して自分で保持している鍵である。

 

公開鍵を公開しないと暗号化することができないし、

秘密鍵を公開してしまうと誰でも復号化できてしまう。

 

公開鍵暗号方式では署名と検証ということも行われる。

 

署名と検証においては送信者が秘密鍵を用いて署名し、

受信者が公開鍵を用いて検証する。

 

この話を聞くと、

『要するに暗号化は公開鍵で暗号化して、署名は秘密鍵で暗号化するってことだね?』

と言いたくなってしまうのだが、そうではない。

 

とりあえず、「署名は秘密鍵で暗号化するということではない」と覚えておけば、

会話して笑われたり怒られたりすることはない。

 

が、そこで『じゃあいったい署名ってどんな処理なの?そしてそれを検証するってどういう処理なの?』

 

と考えてほしい。

 

というか、私はそれを考えて軽く調べてみたのだがよくわからないのである

 

公開鍵暗号方式は、ある程度大きな数の素因数分解が困難であることを利用している。

ある程度大きな桁数の素数を掛けることは容易であるが、

結果からもとの二つの素数を求めることはコンピュータを使っても事実上不可能である。

 

 

d1をもとのデータ、d2を暗号化したデータ、k1を公開鍵、Eを暗号化する演算とすると、


d1 E k1 = d2

 

k2を秘密鍵、Dを復号する演算とすると

 

d2 D k2 = d1

 

となればよい。

 

 このとき、Eが単なる掛け算であったら、k1は公開されているので、

d1を求めるにはd2 k1で割ればよいことになってしまう。

 

だから、Ek2を使わないと復号できないような演算でなければならない。

 

それはどういう方法だろうか?

 


 

RSA暗号のwikipediaを見る


鍵のペア(公開鍵と秘密鍵)を作成して公開鍵を公開する。

まず、適当な正整数 e を選択する。

また、大きな2つの素数の組み{p,q}を生成し、

それらの積 n=pq を求めて、

組み{e,n}を平文の暗号化に使用する鍵(公開鍵)とする。

2つの素数{p,q} は秘密に保管し、

暗号文の復号に使用する鍵(秘密鍵)の生成にも使用する

d=e^-1 mod Φ

ここで

Φ=lcm(p-1,q-1)

lcmは最小公倍数

暗号化(平文 m から暗号文 c を作成する):

c=m^e mod n

復号(暗号文 c から元の平文 m を得る):

m=c^d mod n

暗号化(乗)は公開鍵 {e,n} があれば容易に計算でき、

復号(乗)も容易に計算できる。

しかし、秘密鍵 d を知らずに解読(法 n の下で e 乗根を計算)するのは、

の素因数を知らないと難しい(大きい合成数の素因数分解も難しい)」

と考えられている。

つまり、「秘密鍵を用いずに暗号文から平文を得ることは難しい」と信じられている。

これがRSA暗号の安全性の根拠である。



 

鍵生成

 

をセキュリティパラメータとする。

p,q(ただしp≠q)をk/2ビットの素数とし、

n=pqとする。

eΦ(n)未満の正の整数で、

Φ(n)と互いに素な数とし、

dを、Φ(n)を法としたeの逆数 ( deΞ1 (mod Φ(n)) )とする。

ただしここでΦはオイラーのφ関数で、

この場合は

Φ(n)=(p-1)(q-1)

である。

dは、e,Φ(n)が既知の時には拡張されたユークリッドの互除法を使えば容易に求まる。

deΦ(n)で割った整数商をxとした場合、

de+(-x)Φ(n)=1

が成り立ち、

かつ

eの取り方から

gcd(e,Φ(n)) = 1

であるのでこれを解けばよい、

dを秘密鍵とし

n, eを公開鍵とする

pqが漏れるとdが計算で求まるため、pqは安全に破棄すること

 

暗号化

 

aを平文空間Znの元とする。

b=a^e mod n を計算し、bを出力する。

 

復号化

bを暗号文とする。

a' = b^d mod n を計算し、a'を出力する。

 

ここでa'=aとなり、復号できる。

  

ちなみに公開鍵暗号方式は最初RSA暗号方式なしに考案されて、

それを実現するためにRSA暗号方式が考えられたらしい。

 

 

さて。

 

では署名と検証である。

 

だいたい、以下のように説明されている。

 

送信者がデータのハッシュ値を計算して秘密鍵で暗号化し添付(これが署名)

受信者が暗号化されたハッシュ値を公開鍵で復号

受信者が自分でデータのハッシュ値を計算して、復号したハッシュ値と等しいかどうかを確認

 

wikipediaに書いてある通り、暗号化も復号化もおこなっている演算はある数について

ある数の累乗を求めそれをある数で割った余りを計算している。


同じ計算を違うパラメータでおこなうことによって暗号化になり復号化になるのである。


デジタル署名においては先に秘密鍵による演算がなされてその結果に対して公開鍵による演算がなされる。


これを、『秘密鍵により暗号化し公開鍵により復号化する』と言ってはいけないのだ。

そう言うと怒る人がいる。


怒る理由は、私が調べて理解したところでは以下の2点である。


1. それはRSA暗号方式にしかあてはまらない

2. 署名で「暗号化」するのはデータではなくデータのハッシュである




以下はRSA暗号方式を使うこと前提にした話である。



私が調べて理解した知識によれば、「秘密鍵でも暗号化できる」。


ただし、デジタル署名で暗号化するのはデータそのものではなくデータのハッシュである。


秘密鍵で暗号化されたデータのハッシュを公開鍵で復号化し、

自分でデータのハッシュを計算してその結果を復号化したハッシュと比較する、

これが「署名の検証」である。



では、データのハッシュを公開鍵で暗号化して秘密鍵の保持者に送信したら「署名」になるか?


ならない。


なぜなら公開鍵は公開されているので誰でもそれを使ってハッシュを暗号化することはできるからだ。





では、ハッシュではなくデータそのものを秘密鍵で暗号化して公開鍵で復号化させたらどうか?



暗号化というのは、「鍵を生成した人」ではなく、「鍵を生成した人に暗号化したデータを送信する人」が行う。


では、逆の場合は?「鍵を生成した人」が、誰かに暗号化したデータを送りたいときにはどうすればいいのか?


その場合は、データを送りたい相手に鍵ペアを生成してもらうのか。




秘密鍵でハッシュを暗号化し復号できるなら、秘密鍵でデータそのものも暗号化できるはずだが、そういう話は聞かない。


それをしないひとつの理由として、秘密鍵は公開鍵より鍵長が長くて演算に時間がかかる、ということが説明されていたが、


時間がかかるからやらない、ということなら不可能ではないということだ。


(未完)





2021/05/07

postfixとdovecotのSSL化@CentOS8

iphoneのメール設定の現状確認

outgoing server
 SMTP: 
       Use SSL: on
       Authentication: Password
       Server Port: 587

Advanced - Incoming Settings
  Use SSL: off
  Authentication: Password
  IMAP Path Prefix: /
  Server Port: 143

この状態で送受信できている。

postfixはssl対応できている。

Incoming Settingsで、 Use SSLをonにすると、

Server Portが 993になるが、設定検証でnot respondingとなる。

dovecotがssl対応していない

一応、postfixの設定確認

/etc/postfix/main.cf
smtp_tls_security_level = may
→これでtlsが有効になっている
※smtpd_enforce_tls=yes は古い設定

tlsの付く設定は

smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtp_tls_CApath = /etc/pki/tls/certs
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
smtpd_tls_security_level = may

証明書関連ファイルの確認

postfix.pem
postfix.key
ca-bundle.crt
 -> /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt

これらの証明書は存在していて、タイムスタンプがどうやらcentos8をインストールした日のようだ。

最初から入っていた?

とりあえず動いてるっぽい。

dovecotの設定

/etc/dovecot/dovecot.conf

protocols=imap pop3

で、imaps pop3sが有効になっていない?

protocols=imap3 pop3s

に変更してdovecot再起動すると

 5月 07 10:13:53 god dovecot[1269884]: doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:28: 
 ssl_cert_file has been replaced by ssl_cert = <file
 5月 07 10:13:53 god dovecot[1269884]: doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:29: 
 ssl_key_file has been replaced by ssl_key = <file
 5月 07 10:13:53 god dovecot[1269884]: master: Dovecot v2.3.8 (9df20d2db) starting up for imap, pop3
 5月 07 10:13:53 god dovecot[1269887]: config: Warning: NOTE: 
 You can get a new clean config file with: doveconf -Pn > dovecot-new.conf
 5月 07 10:13:53 god dovecot[1269887]: config: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:26: 
 'imaps' protocol can no longer be specified (use protocol>
 5月 07 10:13:53 god dovecot[1269887]: config: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:26: 
 'pop3s' protocol can no longer be specified (use protocol>
 5月 07 10:13:53 god dovecot[1269887]: config: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:28: 
 ssl_cert_file has been replaced by ssl_cert = <file
 5月 07 10:13:53 god dovecot[1269887]: config: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:29: 
 ssl_key_file has been replaced by ssl_key = <file

古い設定方法だったようだ。

imaps pop3sは imap pop3に戻す

/etc/dovecot/conf.d/10-ssl.conf

に設定する

ssl = no

を変更

ssl = yes

下記設定はデフォルトなのだが、見るとやっぱり証明書がある。

ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
ssl_key = </etc/pki/dovecot/private/dovecot.pem

firewalldでimaps pop3sを開ける

# firewall-cmd --add-service={pop3s,imaps} --permanent
success

# firewall-cmd --reload
success

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client dns http imap imaps pop3 pop3s samba smtp smtp-submission smtps
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

dovecot再起動すると

May  7 10:27:57 god dovecot[1270364]: imap-login: Error: Failed to initialize SSL server context: 
Can't load DH parameters: error:1408518A:SSL routines:ssl3_ctx_ctrl:dh key too small: 

セキュリティ的に厳しくなった的なことらしい。

https://doteya.at.webry.info/201907/article_5.html
5月 07 10:34:05 god dovecot[1270813]: doveconf: Warning: 
Obsolete setting in /etc/dovecot/conf.d/10-ssl.conf:50: ssl_>
 5月 07 10:34:05 god dovecot[1270813]: master: Dovecot v2.3.8 (9df20d2db) 
 starting up for imap, pop3
 5月 07 10:34:05 god dovecot[1270816]: config: Warning: 
 NOTE: You can get a new clean config file with: doveconf -Pn >>
 5月 07 10:34:05 god dovecot[1270816]: config: Warning: 
 Obsolete setting in /etc/dovecot/dovecot.conf:28: ssl_cert_fil>
 5月 07 10:34:05 god dovecot[1270816]: config: Warning: 
 Obsolete setting in /etc/dovecot/dovecot.conf:29: ssl_key_file>
 5月 07 10:34:05 god dovecot[1270816]: config: Warning: 
 Obsolete setting in /etc/dovecot/conf.d/10-ssl.conf:50: ssl_dh>
 5月 07 10:34:06 god dovecot[1270816]: config: Warning: 
 please set ssl_dh=

ssl_dh= を設定してください、だそうだ。

下記設定を書いて、dh.pemを作成する。

# DH parameters length to use.
# 2021/05/07
#ssl_dh_parameters_length = 1024
ssl_dh_parameters_length = 2048
ssl_dh=</etc/dovecot/dh.pem


# openssl dhparam 2048 -out /etc/dovecot/dh.pem
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
..............................
(略)

take a long timeと表示されるが1分もかからない

dovecot再起動すると

May  7 10:37:28 god dovecot[1271026]: doveconf: Fatal: 
Error in configuration file /etc/dovecot/conf.d/10-ssl.conf 
line 51: ssl_dh: Can't open file /etc/dovecot/dh.pem: No such file or directory

見てみると確かにdh.pemがない。

もう一回やるがやっぱりできない。

ディレクトリを変えてカレントディレクトリに作ったりしても、できない。

調べると、opensslのコマンドオプションの書き方がバージョンにより変わったらしい。

https://iww.hateblo.jp/entry/20191109/dhparam
# openssl dhparam -out /etc/dovecot/dh.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.............+.................
(略)

# ls -l
合計 32
drwxr-xr-x. 2 root root 4096  5月  7 10:35 conf.d
-rw-r--r--. 1 root root  424  5月  7 10:47 dh.pem
-rw-r--r--. 1 root root 4507  5月  7 10:18 dovecot.conf

dh.pemができた!

dovecotを再起動する。

# systemctl status dovecot
● dovecot.service - Dovecot IMAP/POP3 email server
   Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-05-07 10:48:33 JST; 10s ago
     Docs: man:dovecot(1)
           http://wiki2.dovecot.org/
  Process: 1271015 ExecStop=/usr/bin/doveadm stop (code=exited, status=0/SUCCESS)
  Process: 1271512 ExecStartPre=/usr/libexec/dovecot/prestartscript (code=exited, status=0/SUCCESS)
 Main PID: 1271518 (dovecot)
    Tasks: 4 (limit: 4993)
   Memory: 5.2M
   CGroup: /system.slice/dovecot.service
           tq1271518 /usr/sbin/dovecot -F
           tq1271521 dovecot/anvil
           tq1271522 dovecot/log
           mq1271523 dovecot/config

 5月 07 10:48:33 god systemd[1]: Started Dovecot IMAP/POP3 email server.
 5月 07 10:48:33 god dovecot[1271518]: doveconf: Warning: NOTE: 
 You can get a new clean config file with: doveconf -Pn > dovecot-new.conf
 5月 07 10:48:33 god dovecot[1271518]: doveconf: Warning: 
 Obsolete setting in /etc/dovecot/dovecot.conf:28: 
 ssl_cert_file has been replaced by ssl_cert = <file
 5月 07 10:48:33 god dovecot[1271518]: doveconf: Warning: 
 Obsolete setting in /etc/dovecot/dovecot.conf:29: 
 ssl_key_file has been replaced by ssl_key = <file
 5月 07 10:48:33 god dovecot[1271518]: doveconf: Warning: 
 Obsolete setting in /etc/dovecot/conf.d/10-ssl.conf:50: 
 ssl_dh_parameters_length is no longer needed
 5月 07 10:48:33 god dovecot[1271518]: master: Dovecot v2.3.8 (9df20d2db) 
 starting up for imap, pop3
 5月 07 10:48:33 god dovecot[1271522]: config: Warning: NOTE: 
 You can get a new clean config file with: doveconf -Pn > dovecot-new.conf
 5月 07 10:48:33 god dovecot[1271522]: config: Warning: 
 Obsolete setting in /etc/dovecot/dovecot.conf:28: 
 ssl_cert_file has been replaced by ssl_cert = <file
 5月 07 10:48:33 god dovecot[1271522]: config: Warning: 
 Obsolete setting in /etc/dovecot/dovecot.conf:29: 
 ssl_key_file has been replaced by ssl_key = <file
 5月 07 10:48:33 god dovecot[1271522]: config: Warning: 
 Obsolete setting in /etc/dovecot/conf.d/10-ssl.conf:50: 
 ssl_dh_parameters_length is no longer needed

ssl_dh_parameter_lengthは必要ないようだ。

warningとかはまだ出てるけど、とりあえず動いたっぽい。

iphoneのメールアカウント設定で incoming serverのsslを有効にする。

verifyでサーバ証明書の警告がでた。

continueをタップする。

メールを送ってみる。

受信できた!

これで送受信ともにssl化できた!

2021/05/01

LPIC303

LPIC303に受かった。 

LPICはレベル2が一番難しい、みたいなことを聞いていたが、どうだろうか。 

試験は一つでいいし、試験範囲もそれほど広くないが、 勉強するのはけっこう大変だった。 

なかなか覚えられない。 得点はlevel1からlevel3になるにつれてだんだん低くなった。 

LPICは合格点が低いので、今回はたぶん大丈夫だろうと思ったが、 予想以上に得点が低く、喜びがあまりなかった。 

でも、今回この試験を受けるにあたっていろいろ覚えたし、 いい経験になった。 

おもしろかった。

私は本業はネットワークなのだが、LPICの勉強をするのはCiscoの資格試験の勉強より楽しい。

本業じゃないからだろうか。

もちろん、Linuxならなんでもわかるなんて、とても言えない。 

受ける前は、LPIC-3を持ってる人をすごいなあと思っていたが.....

まだまだ、知らないことだらけ。

2021/04/30

SELinux有効化後 cgiが動かなくなった

自分のサーバで掲示板のようなcgiを動かしているのだが、SELinux有効化後に投稿したらInternal Server Errorになった。 特に何も変更していないので、すぐに「SELinuxのせいだ!」と思い、/var/log/messagesを見る。
Apr 30 05:16:08 god setroubleshoot[243206]: 
SELinux is preventing post.cgi from write access on the file temp.txt.
#012
#012*****  Plugin catchall (100. confidence) suggests   **************************
#012
#012If you believe that post.cgi should be allowed write access on the temp.txt file by default.
#012Then you should report this as a bug.
#012You can generate a local policy module to allow this access.
#012Do
#012allow this access for now by executing:
#012# ausearch -c 'post.cgi' --raw | audit2allow -M my-postcgi
#012# semodule -X 300 -i my-postcgi.pp
#012
cgiがファイルに書き込むことが許可されていない。 そして、それを許可するようにする方法も書かれている。 ausearchで問題が起きているcgiファイルを探して、パイプで audit2allowに渡してmoduleを作成し、 semoduleでそれをinsallする、ということのようだ。
# ausearch -c 'post.cgi' --raw | audit2allow -M my-postcgi
******************** 重要 ***********************
このポリシーパッケージを有効にするには、以下を実行して下さい:

semodule -i my-postcgi.pp

言われたとおりに

# semodule -i my-postcgi.pp

messagesには

semodule -X 300 -i my-postcgi.pp

と書いてあるが、-Xというのはpriorityを指定するオプションのようだ。

が、-Xなしで実行し、同様のcgiがもう一個あったのでそれも同様にすると、掲示板に投稿できるようになった。

そもそもなんでこのcgiがSELinuxで止められたかであるが、それにはちょっと心当たりがあって、 このcgiを作った時にファイルに書き込みができないということが起きて、権限の問題だろうということで、 よくわからないのでとにかくなんでもありの権限や所有者設定にしたのを覚えている。 おそらくそういう適当な権限設定のファイルを扱ったのでSELinuxが止めたのだと思う。

多分、cgi実行ユーザとファイル所有者が違う、とかいうことじゃないかと思うが、今回はめんどくさいのでこのまま許可してしまう。

2021/04/29

SELinux始めました

 SELinuxなんか無効にするのが当たり前となって10年くらいたった。(自分の中で)

さくらのVPSも、conohaのVPSも、SELinuxはデフォルトで無効じゃないか?

自分で無効にした覚えがないから。


初めてCentOSをさわった頃、たしか4か5の頃、なんかおかしいなと思ってSELinuxを無効にしたらうまくいった、ということがあって、そのうち最初から無効にするようになった。

私がLinuxを使うのはほとんどが実験や検証的な場合だったのでそれでよかった。


だが、セキュリティについていろいろとうるさくなってきた昨今、

「めんどくさいからオフる」

という思考回路を改めた方がいいのでは?と感じている。


そこで、とりあえず自分が使っているcentos8のSELinuxを有効にしてみた。


参考

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security-enhanced_linux/sect-security-enhanced_linux-working_with_selinux-enabling_and_disabling_selinux


いまSELinuxが有効かどうかは

getenforce

でわかる。

disabled

になっている。

Enforcingだと有効、Permissiveだとポリシーをチェックするが動作は止めない、disabledだとポリシーもチェックしない無効な状態である。

enforcing/permissiveの切り替えは setenforceコマンドでできるが、

disabledにする、disabledから再度有効にするには、

/etc/selinux/config

を書き換える必要がある。

有効にするなら

SELINUX=enforcing

上記のRedHatの情報を見ると、SELinuxが無効の状態から有効にするときにはいったんpermissiveにして再起動し、ログをチェックして問題がないことを確認してからenforcingにする、と書いてあった。


また、必要なSELinuxのパッケージをインストールしておく必要がある。

(私の場合は事前になんでもかんでも突っ込んでいた)


その通りにやってみると、私の場合sshdに関する以下のようなログが記録された。

Apr 29 03:03:12 god setroubleshoot[1550]: 
SELinux is preventing /usr/sbin/sshd from name_bind access 
on the tcp_socket port xxxxx. 
For complete SELinux messages run: 
sealert -l 78b09f6f-3440-421f-976d-55edb0af1088

port xxxxx の xxxxx は実際には数字が記録されていて、この数字はsshで使用するポートをデフォルトの22から変更したポート番号である。

「SELinuxが有効だとsshのポート変えられないのか!じゃあ無効にしよう!」

ではなく、

SELinuxの設定でもsshで使用するポートを変更あるいは追加すればよいのだ。

semanage port --list

で現在の設定が表示される。

sshでgrepすると

# semanage port --list | grep ssh
ssh_port_t     tcp      22

追加するには

# semanage port --add --type ssh_port_t --proto tcp xxxxx

dnssecはじめました(2)

参考

https://www.nic.ad.jp/ja/dns/dnssec/dnssec-startup-guide.html

centos8で

/home/dnssec

というフォルダを作り、そこへ移動

ZSK (Zone Signing Key) の生成

# dnssec-keygen -a RSASHA256 -b 1024 -n ZONE monqy.net
Generating key pair............................+++++ ............................+++++ 
Kmonqy.net.+008+47608

KSK (Key Signing Key) の生成

# dnssec-keygen -a RSASHA256 -b 2048 -n ZONE -f KSK monqy.net
Generating key pair..........................................................+++++ ...........+++++ 
Kmonqy.net.+008+36227
zoneファイルのあるフォルダへ移動
# cd /var/named

zoneファイルに署名

# dnssec-signzone -S -K /home/dnnssec/ monqy.net.zone
Fetching ZSK 31795/RSASHA256 from key repository.
Fetching KSK 3160/RSASHA256 from key repository.
Verifying the zone using the following algorithms: RSASHA256.
Zone fully signed:
Algorithm: RSASHA256: KSKs: 1 active, 0 stand-by, 0 revoked
                      ZSKs: 1 active, 0 stand-by, 0 revoked
monqy.net.zone.signed

zoneファイルの後ろに ".signed"がついたファイル "monqy.net.signed" ができる。

前回のエントリではゾーンファイル名に.zoneを付けていたが、 今回はドメイン名をそのままゾーンファイル名にした。 (なんか.zoneがついてるとうまくいかなかった気がしたが気のせいかもしれない)

これはテキストファイルで中身を見ることができるが、 RRSIG, NSEC, DNSKEYなどが追加されているのがわかる。

そして /etc/named.conf のゾーンファイル名を、 署名付きのものに変更して、namedを再起動する。

zone "monqy.net" {
        type master;
        file "monqy.net.signed";
};
で、dig
# dig @localhost monqy.net DNSKEY +dnssec +multi

とやると、なにやらずらずらと引ける。

この後、DSレコードを上位サーバに登録する必要があるらしい。

参考にしたサイトだと「DSレコードをJPNICに登録します」とあるが、 これは例がJPNICの管理しているIPアドレスの逆引きゾーンだからで、 私がやっている .net のドメインだとどこになるのか?

後で調べます。

2021/04/28

dnssecはじめました(1)

 dnssecについて勉強しているが実感がわかないので実際に設定してみようと思った。

vpsを2台持っているので、まずはそれぞれにbindをインストールする。


1台はcentos8、もう一台はUbuntu 18.04.5 LTS

bindについて調べていたら、centos8が今年で終わるということを知った。


まあなんかしらの後継が出るのだろうから、それはさておき


centosとubuntuでbindのインストール・設定方法が違うのでまずそれを書く。


まずcentos8

# rpm -q bind bind-chroot bind-utils
パッケージ bind はインストールされていません。
パッケージ bind-chroot はインストールされていません。
bind-utils-9.11.20-5.el8_3.1.x86_64

# dnf install bind bind-chroot bind-utils

(略)

基本設定

# cat /etc/named.conf

options {
        listen-on port 53 {
                                127.0.0.1;
                                xx.xx.xx.xx;
        };
//      listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        allow-query     {
                        localhost;
                        yy.yy.yy.yy;
        };

recursion yes;

        dnssec-enable yes;
        dnssec-validation yes;

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";

        /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
        include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};




zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

zone "monqy.net" {
        type master;
        file "monqy.net.zone";
};

dnssec-enable yes; dnssec-validation yes; がデフォルトで書いてある。

デフォルトからの変更箇所

まずlistenするipアドレス。xx.xx.xx.xxは自身のIPアドレス。

        listen-on port 53 {
                                127.0.0.1;
                                xx.xx.xx.xx;
        };

queryを許可するアドレス。とりあえず確認のため、localhostともう一台のbindを動かすサーバーのIPアドレスyy.yy.yy.yyだけを許可する。

        allow-query     {
                        localhost;
                        yy.yy.yy.yy;
        };

zoneファイルの情報。こっちをmasterにする。

zone "monqy.net" {
        type master;
        file "monqy.net.zone";
};

zoneファイル。ns01.monqy.netが自身のfqdnである。 参考にした情報だと、fqdnのAレコードとホスト名のみのAレコードが両方あったのでとりあえずマネする。

# cat /var/named/monqy.net.zone
$TTL 3600
@       IN      SOA     ns01.monqy.net. root.monqy.net. (
        2021042801      ;Serial
        3600            ;Refresh
        300             ;Retry
        360000          ;Expire
        86400   )       ;Negative

                        IN      NS      ns01.monqy.net
ns01.monqy.net          IN      A       xx.xx.xx.xx
ns01                    IN      A       xx.xx.xx.xx
www2                    IN      A       xx.xx.xx.xx
www3                    IN      A       yy.yy.yy.yy

named-checkconfと named-checkconf -zをやって設定に問題がないことを確認。

# named-checkconf
(問題がなければ何もでない)


# named-checkconf -z
zone localhost.localdomain/IN: loaded serial 0
zone localhost/IN: loaded serial 0
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
zone 0.in-addr.arpa/IN: loaded serial 0
zone monqy.net/IN: loaded serial 2021042801

firewallについては省略。 queryを許可したyy.yy.yy.yyからdigで名前解決できることを確認する。

~$ dig @xx.xx.xx.xx www2.monqy.net

(略)
;; ANSWER SECTION:
www2.monqy.net.         3600    IN      A       xx.xx.xx.xx
(略)

今度はubuntu。パッケージ名(だっけ?)がcentosと違う。

sudo apt-get install bind9

ubuntuの方は、named.confの中にincludeが書いてあって、設定ファイルが分かれている。

/etc/bind/named.conf.options
/etc/bind/named.conf.local
/var/cache/bind/monqy.net.zone ※作る

/etc/bind/named.options は、listen-onとallow-queryを書く。

$ sudo cat /etc/bind/named.conf.options
[sudo] password for clebriz:
options {
        directory "/var/cache/bind";

        listen-on port 53 { localhost; yy.yy.yy.yy; };
        allow-query { localhost; xx.xx.xx.xx; };

        dnssec-validation auto;

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};

/etc/bind/named.conf.local は、zone情報を書く。自身をslaveとして、masterのIPアドレスを書く。

ゾーンファイルはmasterからコピーされることになると思う。masterと同じ名前でいいと思うが、一応変えておく。

$ sudo cat /etc/bind/named.conf.local
zone "monqy.net" IN {
        type slave;
        file "monqy.net.slave.zone";
        masters { xx.xx.xx.xx; };
};

/var/cache/bind/monqy.net.slave.zone がゾーンファイル。

これはmasterからコピーされるので中身はなくてもいいのか?でも動作確認のため書いておく。

(後でゾーンファイルの中身を見ようとcatとかすると文字化けして表示できない。これは直接見ちゃいけないファイルなのか?)

bindを起動する。

sudo systemctl enable bind9
sudo systemctl start bind9
sudo systemctl status bind9

statusを見てみると... 動いてはいるのだが、パーミッションがなくてzoneファイルを更新できないというメッセージが。

sudo systemctl status bind9
(略)
zone monqy.net/IN: transfer: could not set file modification time of 'monqy.net.slave.zone': permission denied
(略)

chownでownerとグループを bindに変える。

$ sudo chown bind:bind /var/cache/bind/monqy.net.slave.zone
$ ls /var/cache/bind/ -l
total 16
-rw-r--r-- 1 bind bind 821 Apr 28 02:35 managed-keys.bind
-rw-r--r-- 1 bind bind 512 Apr 28 02:35 managed-keys.bind.jnl
-rw-r--r-- 1 bind bind 525 Apr 28 02:33 monqy.net.slave.zone

dnssec-validation auto; という設定があるが、dnssec-enable yes; は、ない。


$ sudo cat /etc/bind/named.conf

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";


$ sudo cat /etc/bind/named.conf.local
zone "monqy.net" IN {
        type slave;
        file "monqy.net.slave.zone";
        masters { xx.xx.xx.xx; };
};


$ sudo cat /etc/bind/named.conf.options
options {
        directory "/var/cache/bind";

        listen-on port 53 { localhost; yy.yy.yy.yy; };
        allow-query { localhost; xx.xx.xx.xx; };

        dnssec-validation auto;

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};

dnssec-enable yes; を書くだけじゃダメだよね。鍵を作ったり署名したりしないと... (続く)

2021/04/22

Dell PowerEdge R620 のセットアップにまつわる騒動

ヤフオクで中古のDellサーバ PowerEdge R620を購入した。

目的はCMLを使うことである。

今は自宅のWindowsPCで動かしているが、ややスペック不足なのと、

外部から常にアクセスできるようにしておきたいと思った。


スペックは

メモリ32GB

ディスクは900GBが2個

CPUはXeonの8coreのが2個


ディスプレイ出力がVGAなのでVGA-HDMI変換アダプタを買った。

単なる形状変換ではなく、8000円ほどした。

HDMIインターフェースからVGAに出力するケーブルは2000円弱で売っていて、

最初はそれを買ってしまった。

買ってから箱に「VGA -> HDMI の変換はできない」と書いてあることに気づいた。

そんなバカなと思いつつ開封してつないでみたが、

つなぎながら、『でもわざわざ箱に書いてあるくらいだからダメなのかな』と思い始め、

やはりダメだった。

(このVGA-HDMI接続がトラブルの発端であった...)


変換アダプタとVGAケーブルを買ってHDMIのモニタにつないで起動する。

しばらく何も表示されない。1分や2分ではなかった気がする。


Dellのロゴが表示される。BIOS Setupとかに入れる画面だ。

OSは消去済みとは聞いていたが、とりあえずそのまま起動させてみる。


ロゴが消えるとまたしばらく真っ暗になる。

やはり数分待つと、system initialization(うろ覚え)

みたいな文字が表示される。


それが消えて、どうなったか忘れたが、

OSがないとかどうとか何も表示されなかった気がする。


いったん再起動してBIOSセットアップを起動して、

メモリが32GB認識されていること、

ディスクが2個認識されていることなどを確認。


外付けDVDドライブをUSBポートに接続し、

BIOS設定でブートデバイスのトップをDVDドライブにする。

ESXiのインストールディスクをDVDに焼いてセットし再起動する。


再起動は時間がかかったがESXiのインストーラが起動しインストールが始まった。

が、ディスクを選ぶところで何も出てこない。


ESXiが7.0.0だったので、古いRAIDコントローラを認識しないとかいう問題かと思い、

(そういう経験があった)

centosのインストーラを起動してみたが、同様にディスクを認識しない。


そうこうしているうちに、再起動しても画面が真っ暗な状態で何もでなくなってしまった。

Dellのロゴも出ないし、initializationがどうのこうのも出ない。


キーボードで ctl+alt+delを押すとリブートする。

リブートしていることは筐体前面にある小さなLCDに「system is rebooting....」とか表示されるのでわかる。

即リブートするので、システムがハングアップしているという感じではない。


筐体前面のディスプレイの横にボタンがあり、

iDRACというポートのIPアドレスが設定できることがわかったので設定してアクセスしてみた。


ブラウザでアクセスでき、ユーザ認証があるがデフォルト設定で入れた。

その管理画面で見る限りは特に異常はなさそうだ。


いったん電源を落とし、コンセントも抜いて、

メモリを外して付け直した。


8GBのメモリが4枚入っている。

メモリ装着スロットが24スロットもある。

そのうちの4つを、とびとびに使用している。

未使用のスロットにはフィラーのようなものがついている。


CPUは確かに2個ついている。


NICのポートが4つある。

そんなにいらないが...


WEBで軽く調べた結果、どうもPOSTで失敗しているようだ。

(実はそうではなかったのだが)


メモリか、ディスクか、CPUか、マザーボードか....

故障しそうなのはディスクかメモリだが、

挙動からしてもっと根幹がイカれている感じがする。


POSTしてるなら「POSTしてます」みたいなメッセージを出せよ、そもそも。

で、失敗したら「何のPOSTで失敗しました」と出せよ。


そういうのも出せないところで失敗しているのか...

でも、最初になんとか起動していた時は何も出なかった。


3万円だからな...

安いなとは思ったのだが...


4枚ついているメモリを1枚だけ残し、2台ついているHDDを外して起動したが、

挙動は変わらず。

外したデバイスが原因ではないということだ。

(もしかしたらそれらも故障しているかもしれないが、それが原因で起動できないのではない。)


残るは、メモリ1、CPU1、CPU2、マザーボード、電源、RAIDコントローラ、NIC、か。


NICがだめでも起動はするだろう....

ディスクが選べなくても起動はしたからRAIDコントローラも違うかな...


ディスクはiDRACで見ると物理的には認識していたのだが、

iDRACで設定を消そうとしたりしていたら物理的にも見えなくなってしまった。


iDRACで接続できるので動いていることは動いていると思っていたが、

iDRACは電源オフの状態でも電源ケーブルが接続されていればアクセスできて、

要はリモートから電源のオフだけでなくオンもできるという機能であった。


電源オフでもアクセスできるのだから、

iDRACに接続できてもあまり意味がない。


あとできることは...

・マザーボードの外観チェック(コンデンサが破裂してないかとか)

・まだ外してないメモリを外して残り3枚のメモリ1枚ずつで起動してみる

・マザーボードの電池を交換してみる

・NVRAMクリアしてみる

・CPUを1個ずつにして起動してみる


すぐにはできないが...

・メモリを別のPCにさしてみる

・CPUを別のPCにさしてみる

・マザーボード交換

・電源ユニット交換


ヤフオクなんかじゃなくてotto認定中古品とかを買えばよかったかなと思う。

同等品は10万円くらいする。



翌朝。


カバーを開けて破裂や液漏れしているコンデンサはないか見てみる。

内部は非常にきれいで、ホコリや汚れもほとんどなく、部品が壊れている形跡はない。

メモリスロットの番号を見て、A1が一番端ではないことに気づいた。

この前1枚だけさして起動したのはB1だった。

A1だけにさして試すがやはり画面に何も表示されない。


シャーシのカバーを開けて起動して確認していた。

「カバーを開けたまま5分以上運用するな」と書いてあったので、

『ということは開けたままでも動くんだな』と思って。


前面LCDに「intrusion detected」というメッセージが出るので

もしかしてカバーをつけないと起動しないのかと思いカバーをするが同じ。


再びカバーを外して起動する。

すると、シャーシの真ん中あたりにある小さなLEDが点滅しているのに気付いた。


調べるとRAIDコントローラだった。

これか!とほとんど確信して外して起動してみるが、同じ。

外すときにロックしているプラスチックの部品が折れてしまった。

付け直して起動する。


CPUを1個外してみようかと思いドライバーでカバーを止めている2本のねじをゆるめて

カバーを外してみる。グリスもついているし、どうしてもCPUだとは思えず、

カバーを戻す。


また電源を入れてiDRACを見る。


「仮想コンソール」みたいな機能があって表示するとファイルがダウンロードされてしまうので見ていなかったのだが、調べると何かの設定を「html」にするとブラウザで開けるとのことだった。

htmlにしてコンソールを表示してみると....


普通に起動している!


OSがないというメッセージが出ている。


試しに再起動したら、Dellのロゴも表示されるし随時メッセージも表示される!


何も問題なく起動している!!!


ディスプレイに表示されていないだけだった!!!!!


なんだろう?


サーバのVGA機能がおかしいのか、VGA-HDMI変換アダプタがおかしいのか。

一時は表示されていたから、それはないと思っていたのだが.....


メモリ、RAIDコントローラ、ディスク等全部つけて起動する。

BIOSセットアップ画面に入って状態を見る。


全部問題ない。


起動させると「virtualディスクがないけど設定しますか」

みたいなメッセージが出てyesとか答えるとユーティリティが起動する。


よくわからなかったがほとんどデフォルト設定のまま、

RAID 0でディスクを作り「初期化する」だけを有効にする。


作成後、ユーティリティを終了する方法がわからず、

ctrl+alt+deleteで再起動する。


iDRACで(仮想)ディスクができたことを確認



ESXiのインストールも無事に完了し、

CMLの仮想マシンも動いた。


CML起動後の初期画面でなぜかEnterが効かないのだが....

まあこれは大した問題じゃないでしょ。



というわけで、PowerEdgeはiDRACが使えれば、

ディスプレイもキーボードもつけずにセットアップできるということがわかった!!


VGAからモニタに映せない理由は不明だが、もうどうでもいい....


2021/04/14

ケルベロス認証を完全に理解する

ケルベロス認証という名前は何度も聞いたことがある。

Windowsサーバーの認証で使用されていると聞いている。


Windowsサーバーの認証というのは、

Windowsサーバーにログインする際の認証ではなく、

Windowsサーバーが管理しているユーザーの認証のことである。


ケルベロス認証はよく聞く言葉ではあるが、

認証といえばケルベロスというほどメジャーでもない。




認証といえば、無線のpsk,

WPAパーソナル、WPAエンタープライズ

RADIUSサーバー

oauth

などがある。



私が把握している認証方式にRADIUS認証がある。


radiusではサプリカントとクライアントとサーバがいて、


サプリカントがクライアントにアクセスすると、

クライアントがサーバと通信して認証要求を出して許可を得る。




ケルベロスとradiusは何が違うのだろうか?

そしてなぜwindowsではケルベロス認証を使用しているのか?


まずケルベロスという名前にヒントがあるだろうと考えられる。

というか、認証方式の特徴をあらわすのにちょうどいいからケルベロスと呼んだのだろう。


ケルベロスというのは、頭が3つある番犬である。


おそらく、認証する際に3つのことなる役割を持つ機能があって、

その3つの役割とユーザが交渉というか検査というか、なんらかのやり取りをするだろうと予想できる。



Key Distribution Center (KDC) データベース

Authentication Server (AS) 認証サーバー

Ticket Granting Server (TGS) チケット発行サーバー

Ticket Granting Ticket (TGT) チケット


3つのアタマとは、KDC, AS, TGSをさすのだろう。


チケットというのが、ほかの認証では出てこない考えである。


チケットは何のために発行されどのように認証に使用されるのか?



---

1. ASに対してユーザー認証情報を送信

2. KDCによってユーザー情報とサーバー利用資格をチェック

3. 問題なければASからTGTチケットを払いだす

4. TGTチケットをTGSに送信し、利用したいサーバー用のチケットを要求

5. TGSから利用したいサーバー用のチケットを発行

6. 利用したいサーバーに対して、TGSから発行されたチケットを送信

7. チケットに問題がなければサーバーが利用可能となる

---


https://cybersecurity-jp.com/column/38350 より


1.は問題ない。

どんな認証方式でもこれは行われるだろう。


2.も必須だ。


3.がケルベロス特有である。チケットを払い出す。なんだこれは?

払い出すのはどこに対して?ユーザー?TGS?



4.の、送信する主体は誰だろう?

ユーザー?チケットをTGSに送信する。


5.TGSがチケットを発行したらそのチケットは誰に与えられる?


6.これも誰がどこへがわからない。



infraexpertを参照



1.ユーザがAG/TGSに対して認証要求を送信

2.AG/TGSが要求を許可すると、

3.AG/TGSがTGTをユーザへ送信

4.ユーザがチケットを保管する。

5.TGTを使用してアクセスしたいサーバ用のチケットを要求

6.AS/TGSがチケットの内容を確認

7.AS/TGSがユーザがアクセスしたいサーバ用のチケットを送信

8.ユーザがアクセスしたいサーバ用のチケットを入手

9.ユーザがアクセスしたいサーバにチケットを提出

10.ユーザがアクセスしたいサーバはチケットを確認してアクセスを許可する。




上記を参考にさっきのシーケンスを書き直す


---

1. ユーザが認証サーバに対して認証情報を送信する。

2. 認証サーバのASがKDCによってユーザー情報とサーバー利用資格をチェックする。

3. 問題なければ認証サーバの[TGS]がTGTチケットをユーザに払いだす。

4. ユーザはTGTチケットを認証サーバに送信し、利用したいサーバー用のチケットを要求する。

5. 認証サーバのTGSが、ユーザが利用したいサーバー用のチケットを発行してユーザに送信する。

6. ユーザが利用したいサーバーに対して、TGSから発行されたチケットを送信する。

7. チケットに問題がなければサーバーが利用可能となる

---



ユーザが認証を要求し許可をもらうのは頭が3つある番犬である。


ユーザにとって認証してもらう相手は一人というか一頭であるが、その相手に頭が3つあって、

役割がわかれているのである。



そして役割をわけているのはチケットを発行するためなのがわかる。

チケットを発行する理由は、いったんチケットを発行したらそのチケットが有効である間は

再度認証を受ける必要がないということである。


これが他の認証と違うところである。


また、これをする必要があるのは、複数のアクセス対象に対して認証が必要だからである。


たとえるなら、ディズニーランドで入場時にフリーパスを買えば、個々のアトラクション利用時に入場券を買う必要がない、みたいなことだろうか。

2021/04/13

さくらのVPSをubuntuにする

 ubuntuにする。

初期ログインをrootでしようとしたら入れない。

ubuntuで入る。


ubuntuってrootになれないんだっけ。

なんかするときは sudo しないといけない。

めんどくさいな...


まずユーザを作り、su権限を付ける。

sshのポート番号を変える。

さくらのVPSのパケットフィルタを無効にする。


apache2をインストールする。


firewallはデフォルトで無効。

有効にする。


80とsshのポートを開ける。

pingはデフォルトで返すのか。

拒否するにはちょっとめんどくさそうなのでそのまま。


2021/04/11

Implementing Cisco Enterprise Network Core Technologies (350-401 ENCOR)



 CCNPを更新した。


コロナウイルス流行の影響で、更新期限が半年延長された。

最初は本来の期限までに更新しようと思っていたが、

新試験になって参考書や問題集がなかなか出ず、受験に踏み切れずにいて結局延長した期限の2か月くらい前に更新することになった。

この試験は新しいCCNP試験(の一部)であるとともに、いままでCCIE筆記試験と呼ばれていた試験の後継でもある。

前回は、CCNP更新しようかCCIE筆記にしようか迷っていたが試験制度が変わってCCNP更新とCCIE筆記試験が同じ試験になった。

CCNPはこのENCORプラス1科目をとれば認定されるようになった。

参考書はciscopressから出ている英語の本しかないのでそれを買った。

紙の本を買ったが、電子版も買った。(少し割引される)


試験範囲は非常に広く、ルーティング・スイッチングはもちろん、無線、仮想化、自動化、セキュリティ、QoS、マルチキャスト、なんでもかんでもある。


本を読んでいるだけでは到底頭に入ってこないので、CMLを買い、ヤフオクで中古のシスコ機器も何台か買った。


CMLというのはVIRLと呼ばれていたシスコ機器を仮想環境で操作できるものだ。

DynamipsとかGNSとか使ってきたが、CMLになってとても使いやすくなった。

BGP等複数台のルータの構成を検証するにはなくてはならないものだ。


勉強期間は実質3か月くらいで、そんなにしっかり勉強したわけではない。

試験に関する情報が少なく、難しくなったという噂を聞いていたが、まあ大したことないだろうと思っていた。


1回落ちて、2回目でようやく受かった。


1回目は試験終了後結果表示がされなかった。

以前にもSWITCH試験か何かでそういうことがあった。


2回目の受験後、やはり結果が表示されず愕然として受付にもどって結果レポートをもらうと、試験前にとった顔写真がでかでかと印刷された下に「Pass」と書いてあった。


試験は英語で受験した。

時間が50分かな?延長されたのだが、目いっぱい使った。10分程度残していた。



2021/04/08

LISP 実際に設定した

 


CMLで。


xTR1

interface LISP0
!
interface GigabitEthernet0/0
 ip address 192.168.1.254 255.255.255.0
!
interface GigabitEthernet0/1
 ip address 10.0.1.1 255.255.255.0
!
router lisp
 database-mapping 192.168.1.0/24 IPv4-interface GigabitEthernet0/1 priority 1 weight 100
 ipv4 itr map-resolver 10.0.3.3
 ipv4 itr
 ipv4 etr map-server 10.0.3.3 key password
 ipv4 etr
 exit
!
router ospf 1
 network 10.0.1.0 0.0.0.255 area 0


xTR2

interface LISP0
!
interface GigabitEthernet0/0
 ip address 192.168.2.254 255.255.255.0
!
interface GigabitEthernet0/1
 ip address 10.0.2.2 255.255.255.0
!
router lisp
 database-mapping 192.168.2.0/24 IPv4-interface GigabitEthernet0/1 priority 1 weight 100
 ipv4 itr map-resolver 10.0.3.3
 ipv4 itr
 ipv4 etr map-server 10.0.3.3 key password
 ipv4 etr
 exit
!
router ospf 1
 network 10.0.2.0 0.0.0.255 area 0


MS/MR

interface GigabitEthernet0/0
 ip address 10.0.3.3 255.255.255.0
!
router lisp
 locator-set RLOC01
  IPv4-interface GigabitEthernet0/0 priority 1 weight 100
  exit
 !
 site SITE1
  authentication-key password
  eid-prefix 192.168.1.0/24
  exit
 !
 site SITE2
  authentication-key password
  eid-prefix 192.168.2.0/24
  exit
 !
 ipv4 map-server
 ipv4 map-resolver
 exit
!
router ospf 1
 network 10.0.3.0 0.0.0.255 area 0


確認
 
MSMR#show lisp site
LISP Site Registration Information
* = Some locators are down or unreachable
# = Some registrations are sourced by reliable transport

Site Name      Last      Up     Who Last             Inst     EID Prefix
               Register         Registered           ID       
SITE1          00:23:26  yes#   10.0.1.1                      192.168.1.0/24
SITE2          00:21:03  yes#   10.0.2.2                      192.168.2.0/24




xTR1#show ip lisp map-cache 
LISP IPv4 Mapping Cache for EID-table default (IID 0), 3 entries

0.0.0.0/0, uptime: 00:29:04, expires: never, via static send map-request
  Negative cache entry, action: send-map-request
192.168.2.0/24, uptime: 00:20:41, expires: 23:39:18, via map-reply, complete
  Locator   Uptime    State      Pri/Wgt
  10.0.2.2  00:20:41  up           1/100
192.168.10.0/24, uptime: 00:13:20, expires: 00:01:40, via map-reply, self, forward-native
  Negative cache entry, action: forward-native
xTR1#
xTR1#


xTR2#show ip lisp map-cache 
LISP IPv4 Mapping Cache for EID-table default (IID 0), 2 entries

0.0.0.0/0, uptime: 00:22:13, expires: never, via static send map-request
  Negative cache entry, action: send-map-request
192.168.1.0/24, uptime: 00:21:02, expires: 23:38:57, via map-reply, complete
  Locator   Uptime    State      Pri/Wgt
  10.0.1.1  00:21:02  up           1/100
---- 

192.168.1.111 のPCから ping 192.168.2.222 を実行したときの
Map requestはカプセル化されていた。

IP src(外): 10.0.1.1 ※ ITRの外側IPアドレス
IP dst(外): 10.0.3.3 ※ MRのIPアドレス
IP src(内): 192.168.2.222
IP dst(内): 192.168.2.222

ITR-RLOC Address: 10.0.1.1
Map-Request RecordのPrefix: 192.168.2.222
Map-Reply RecordのPrefix: 192.168.1.0/24




 














Map-Replyは、

IP src: 10.0.2.2
IP dst: 10.0.1.1
Mapping Record - EID Prefix: 192.168.2.0
Mappping Record - Locator Record - Local RLOC: 10.0.2.2



そしてicmp echo requestは

IP src(外): 10.0.1.1 ※ ITRの外側IPアドレス
IP dst(外): 10.0.2.2 ※ ETRの外側IPアドレス
IP src(内): 192.168.1.111
IP dst(内): 192.168.2.222

となっていた。

Map-RegisterとMap-Notifyは、etrを設定したときに送受信されるようだ。
もしくはdatabase mappingを設定したときか。

10.0.1.1 -> 10.0.3.3 に送信される。

この構成ではITR/ETR、MS/MRが同じなのでわからないが、

Map-Requestは
ITR -> MR

Map-Registerは
ETR -> MS

である。

Map-Requestは、「マッピングの解決要求」である。
『マッピングしてください』ではない。



2021/04/07

LISPについて整理

EID1からEID2宛の通信が行われるとする。

まず、EID1→EID2への送信


(前提)
①ETR(RT2)がMap RegisterをMSに送信
②MSがマッピングを登録

(EID1からEID2への送信)
③EID1がパケットを送信
④ITR(RT1)がMRにMap Requestを送信
⑤MRがMSにMap Requestを転送
⑥MSがETR(RT2)にMap Requestを転送
⑦ETR(RT2)がITR(RT1)にMap Replyを送信
⑧ITR(RT1)がパケットをカプセル化して⑨ETR(RT2)に転送
⑩ETR(RT2)がカプセル化を解除して⑪EID2に転送



EID2からEID1への戻りの通信

(前提)
①ETR(RT1)がMap RegisterをMSに送信
②MSがマッピングを登録

(EID2からEID1への通信)
③EID2がパケットを送信
④ITR(RT2)がMRにMap Requestを送信
⑤MRがMSにMap Requestを転送
⑥MSがETR(RT1)にMap Requestを転送
⑦ETR(RT1)がITR(RT2)にMap Replyを送信
⑧ITR(RT2)がパケットをカプセル化して⑨ETR(RT1)に転送
⑩ETR(RT1)がカプセル化を解除して⑪EID1に転送

青の矢印が制御通信、緑がデータ通信、オレンジがマッピング通信(これも制御通信)


戻りの通信については、

RT1(ITR)からMap Requetを受信することによって送信元MappingがRT2(ETR)にわかるので、RT2からMSへのMap Requestは送信されずに即encap&パケット転送が行われるのではないかと思う。


これは実際に確認した通信ではなく聞いた話を整理したものである。

整理してわかったのは、IngressとEgressが、通常の通信と逆であるということである。

通常は拠点のルータはLANからWAN向けの通信がEgress, WANからLAN向けの通信がIngressとなるが、LISPにおいては方向が逆になる。

2021/04/05

GRE tunnel

 

  
RT2


interface Loopback0
 ip address 22.22.22.22 255.255.255.255
end
!
interface Tunnel1
 ip address 7.7.7.1 255.255.255.252
 tunnel source 10.10.0.1
 tunnel destination 10.20.0.1
end


ip route 10.20.0.0 255.255.255.0 10.10.0.2
ip route 33.33.33.33 255.255.255.255 Tunnel1
RT3


interface Loopback0
 ip address 33.33.33.33 255.255.255.255
!
interface Tunnel1
 ip address 7.7.7.2 255.255.255.252
 tunnel source 10.20.0.1
 tunnel destination 10.10.0.1
end

ip route 10.10.0.0 255.255.255.0 10.20.0.2
ip route 22.22.22.22 255.255.255.255 Tunnel1




2021/04/03

time-rangeでSaturday Sunday 0:00 to 23:59 とすると

 衝撃の事実....

ciscoルータやswitchで、time-rangeという設定がある。

これを使うと、例えば週末だけ特定の通信を拒否するとか許可するとかの設定ができる。


time-rangeというコマンドなのだが


たとえば、


time-range TEST
periodic Monday 9:00 to 18:00

とすると、月曜日の9時から18時になる。

そして、拡張aclで、そのtime-rangeを指定することができる。

access-list 1 permit 192.168.1.0 0.0.0.255
access-list 100 permit ip host 192.168.1.1 host 100.0.0.1 time-range TEST

timerangeでは、曜日のほかに、daily, weekdays, weekendなどが指定できる。 ここまでは、「へー、そんな機能があるんだ」で済む話だ。 

問題はこれからだ。 


この機能を使って、週末だけ特定の通信を拒否することにした。 

weekendという設定があるのでそれを使えばよいとは思ったが、 

 「土曜日の0:00~日曜日の23:59」という風に定義した方が間違いないと思い、

time-range Shumatsu
periodic Saturday Sunday 0:00 to 23:59

という設定を入れた。「weekendとかいらないじゃん」


後日、後輩から、「先輩、time-rangeでweekendなんて使えるんですね」 と言われて、

そんな設定したおぼえはないとshow runをして愕然とした。

time-range Shumatsu
periodic weekend 0:00 to 23:59


Saturday Sunday とすると、weekendに置き換わるのだ.....



2021/03/29

BGPのベストパス選択の実際





R1はR2, R3, R5とneighborになっている。
R1でshow ip bgpを実行すると

R1#sho ip bgp
     Network          Next Hop            Metric LocPrf Weight Path
 *>  192.168.102.0    192.168.101.2            0         32768 64513 i ※1
 *                    192.168.101.18          80             0 64517 i ※2
 * i                  192.168.101.14          80     80      0 64516 i ※3

192.168.102.0/24 のprefixはBGPテーブルに3つあるが、
ベストパスは※1である。

この時、192.168.101.2のルータ(図でいうRT5)がダウンしたら、 ベストパスはどれになるか?

現在のベストパスはweightが設定されている。
weightはciscoルータがBGPのベストパスを選択するときに比較する最初の条件である。

この経路以外はWeightは設定されていない。

Weightの次に比較するのはlocal preference である。

残りの2経路のLocPrfを見ると、一つは空欄、もう一つは80である。

この時、どちらの経路が採用されるか?

そもそも、※2のlocPrfはなぜ空欄なのか?
それは、※2の経路はeBGPのネイバーから受信したprefixだからである。
逆に言うと、BGPテーブルを表示したときにLocPrfが空欄のprefixは、
eBGPから受信したものだとわかる。

eBGPから受信した経路にはlocPrfは「無い」のである。

では、ベストパスの2番目の比較が行われるときに、※2と※3の比較はどうなるのか?
locPrfがない経路より、80が設定されている※3の方が強いのか?

これは考えてもわからない。

こういう場合、LocPrfがないeBGPネイバーから受信したprefixはLocPrfがデフォルト値の100であるとして比較をおこなうことになっている。


だから、RT5がダウンしたらベストパスは ※2になる。



実際にやってみた。

R1#sho ip bgp

     Network          Next Hop            Metric LocPrf Weight Path
 *>  192.168.102.0    192.168.101.2            0         32768 64513 i
 *                    192.168.101.18          80             0 64517 i
 * i                  192.168.101.14          80     80      0 64516 i


※RT5を落とす

*Mar 29 04:29:31.095: %BGP-3-NOTIFICATION: sent to neighbor 192.168.101.2 4/0 (hold time expired) 0 bytes
*Mar 29 04:29:31.095: %BGP-5-NBR_RESET: Neighbor 192.168.101.2 reset (BGP Notification sent)
*Mar 29 04:29:31.095: %BGP-5-ADJCHANGE: neighbor 192.168.101.2 Down BGP Notification sent
*Mar 29 04:29:31.095: %BGP_SESSION-5-ADJCHANGE: neighbor 192.168.101.2 IPv4 Unicast topology base removed from session  BGP Notification sent

R1#sh ip bgp summary

Neighbor        V           AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.168.101.2   4        64513       0       0        1    0    0 00:00:07 Idle
192.168.101.14  4        64512      10      11        3    0    0 00:05:09        1
192.168.101.18  4        64517      10      11        3    0    0 00:05:09        1



※新しいベストパスが選択される

R1#sh ip bgp
     Network          Next Hop            Metric LocPrf Weight Path
 *>  192.168.102.0    192.168.101.18          80             0 64517 i
 * i                  192.168.101.14          80     80      0 64516 i