接続元のグローバルIPアドレスを返すperlスクリプト

  • 投稿日:
  • by
  • カテゴリ:

これまでDynamicDNS(Oracle)を使っていたので、自分の家のIPアドレスの変化はhttp://checkip.dyndns.org/にアクセスし、同サイトが返答してくるグローバルIPアドレスを得ていた。(もっと正確に記述すると、ddclientというpackageで、IPアドレスの変化から、dyndns.comにログインして、IPアドレスの更新までを自動でやってもらっていたのだ)

しかし、DynamicDNSの会費が年間$55も掛かるので、この6月で止めてしまった。そこで、dyndns.comから無断で使うなと文句が来たらやだなぁと思いつつ(何となく気分の問題ではあるのだが、笑)、checkip.dyndns.org に替わるサービスを、自前のさくらVPSのサーバに置くことにした。
※そもそも無料のサービスが有料になって、その上ににabuseクレーム受けたら、すごく悲しい気分になるのは必定だと思ったのがきっかけ。

さて、原型は、httpでアクセスされたとき、アクセス元の環境変数"%ENV"を吐き出すperlスクリプト。https://h-sol.jp/cgi-bin/printenv でアクセスできる。

#!/usr/bin/perl
print "Content-type: text/html\n\n";
while (($key, $val) = each %ENV) {
print "$key = $val<BR>\n";
}

実行結果は下記

makoto@fbsd:~ % curl -s https://h-sol.jp/cgi-bin/printenv
REMOTE_ADDR = 222.158.91.217<BR>
SERVER_PROTOCOL = HTTP/1.1<BR>
SCRIPT_FILENAME = /home/www/data/h-sol/cgi-bin/printenv<BR>
SERVER_ADDR = 153.127.50.48<BR>
REQUEST_SCHEME = https<BR>
REQUEST_METHOD = GET<BR>
HTTP_HOST = h-sol.jp<BR>
HTTP_USER_AGENT = curl/7.76.0<BR>
DOCUMENT_ROOT = /home/www/data/h-sol/<BR>
SERVER_SOFTWARE = Apache/2.4.38 (Debian)<BR>
SERVER_SIGNATURE = <address>Apache/2.4.38 (Debian) Server at h-sol.jp Port 443</address>
<BR>
HTTPS = on<BR>
SSL_TLS_SNI = h-sol.jp<BR>
SERVER_NAME = h-sol.jp<BR>
SERVER_ADMIN = www-admin@ik1-423-43544.vs.sakura.ne.jp<BR>
QUERY_STRING = <BR>
SERVER_PORT = 443<BR>
REQUEST_URI = /cgi-bin/printenv<BR>
PATH = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin<BR>
REMOTE_PORT = 63291<BR>
HTTP_ACCEPT = */*<BR>
GATEWAY_INTERFACE = CGI/1.1<BR>
CONTEXT_PREFIX = /cgi-bin/<BR>
CONTEXT_DOCUMENT_ROOT = /home/www/data/h-sol/cgi-bin/<BR>
SCRIPT_NAME = /cgi-bin/printenv<BR>
makoto@fbsd:~ %

cURLコマンドでアクセスしてるから、USER_AGENTとかは出ない。
さてここで、冒頭に出力される、"REMOTE_ADDR"(=接続元のGlobal IPアドレス)の値($val)を出力すれば、所望の動作ができそうだ。ということで、該当のperlスクリプト。

#!/usr/bin/perl
print "Content-type: text/html\n\n";
while (($key, $val) = each %ENV) {
if ($key =~ m/REMOTE_ADDR/) {
print "$val\n";
};
}

「$keyが"REMOTE_ADDR"にマッチしたら、$valを吐け」と。動作確認のため、https://h-sol.jp/cgi-bin/checkip にアクセスする。

makoto@fbsd:~ % curl -s https://h-sol.jp/cgi-bin/checkip
222.158.91.217
makoto@fbsd:~ %

ウマく動いているようだ。1分1回、/etc/crontabで回しても、鯖主おいらなので、誰からも文句は来ない。

なお、「爺ちゃん、/cgi-bin/ にperlスクリプト置くとは、大昔のインターネットですね!」というツッコミを受けるのは必至だ。

そこで、続きの記事を投稿しました。
初めは、#!/usr/bin/perlを使うまでもなく#!/bin/shで良いんじゃねというモチベーションだったけど、この2021年にperl使ってる奴が居るかという疑問から再考したのが真相。