今日の戯言 by maa
基本的にただの独り言です。有益な情報を求めてはいけませんw
基本的にただの独り言です。有益な情報を求めてはいけませんw
4月から学環の主担当教員になったので入学式の舞台に登壇しないといけなくなった。ずっと以前は全教員が登壇していたのだが、いつからか忘れたが近年は学長、副学長、学部長、学科主任だけが登壇することになったので、ここ何年も入学式自体は他人事のような行事になっていた。学環は学部長相当の学環長以外は主担当教員と副担当教員で構成されているので、いわゆる学科主任(入学式で「○○学科1年次生、○○名全員起立」という役割がある)がおらず、式で「全員起立」という役をやらされることになった。緞帳が開く前の舞台はなにやら怪しげな衣装を身に着けた学長~学部長が座っていた。
土曜日は1年生の履修ガイダンスで朝から5号館で仕事だった。学環の仕事は4月からなのに、いきなり教務委員として履修ガイダンスをやるはめになってしまってなんだかなな感じなのだが、ようは履修要覧と履修登録の手引きに書いてあることがすべてなので、適当に要約したパワポを用意して無難に終わった。コンピュータ基礎Iでもパワポを扱うので、あまり下手なプレゼンはできないこともあって、アニメーションつけたりするのに結構時間を費やしてしまった。
「はじめてのプログラミング」の授業用に Web コンテンツを用意しているのだが、学内アクセス専用にしたいために学内ローカルアドレス(http://maa.u.icc.ac.jp/pb/)で公開していたところ、学生からアクセスできないといわれた。どうやら学生が使う学内 Wi-Fi の LAN から研究室の LAN には直接アクセスできないように VLAN が設定されているようだ。こうなると proxypass の設定で大学 Web ページ下に見せているグローバルアドレス(https://www.icc.ac.jp/maa/pb/)でアクセスしてもらうしかない。何とかならないものかと研究室の Web サーバ apache2 をあれこれやってみた記録である。
上位サーバの proxypass 下でアクセスされると、クライアント IP アドレス(http の環境変数REMOTE_ADDR)が上位サーバの IP アドレスで記録されてしまうので、実際のクライアント IP アドレスがわからない。そこで、mod_remoteip をロードして /etc/apache2/conf-available/remoteip.conf を設定した(#a2enconf remoteip を忘れずに)。
RemoteIPHeader X-Forwarded-For RemoteIPInternalProxy 127.0.0.1 RemoteIPInternalProxy 172.16.0.0/12 RemoteIPInternalProxy 192.168.0.0/16
127.0.0.1 はなんか多くの AI クローラーが騙ってくるので、それを弾く(本来のクライアントグローバルアドレスに書き換える)ために付け加えた。172* と 192* は学内で使われているローカルアドレスである。これで環境変数 REMOTE_ADDR には本来のクライアント IP アドレスが記録される。
これが結構難儀した。<If> ディレクティブを使って 172.16.0.0/12 以外に認証をかけようとしたのだが、REMOTE_ADDR との文字列比較に 172.16.0.0/12 とネットワークアドレスで書けないので、純粋な文字列パターンで 172.16~172.31 に恐らく正規表現でマッチさせなければならない。そこであれこれ調べたところ、正規表現での比較には「=~」で正規表現にマッチするもの、「!~」正規表現にマッチしないものが書けるということ。また、apache2 での正規表現は perl の書き方で書くということだった。で付け加えたところは以下の <If> から </If> のところ。
<Directory "/var/www/pb"> AllowOverride None Options ExecCGI <If "%{REMOTE_ADDR} !~ /^172\.(1[6-9]|2[0-9]|3[0-1])\..*/"> AuthType Basic AuthName "pb" AuthBasicProvider file AuthUserFile "/etc/apache2/xxxxxxxxx" Require user userxx1 userxx2 </If> <Files "*.txt*"> Require all denied </Files> </Directory>
動作チェック済みだが、マッチングパターンに漏れはないだろうか。仮に漏れがあっても情報漏洩とかするやつではないのでそこまで気に病むことでもないのだが、正規表現は強力だけどややこしい...
追記:"|" による or は3つ並べられないみたい(エラーは出ないが)だったので、"()" によりグループ化するように修正した。ようは "A | B | C" とはかけないので "(A | B) | C" のようにした。 ←動作チェックしてダメだったからこのような修正をしたのだが、or で3つ並べてもよいみたい。なんか他のところで引っかかってたのか... 結局もっともシンプルな表現で良いようだ。