PerlでIPv4とIPv6のアドレスを取得してJavaScriptで表示

IPを返すだけのCGI(ipchk-simple.cgi)

IPv4とIPv6の共存している環境でグローバルIPを取るメモです。

単に環境変数の「REMOTE_ADDR」を返しているだけですが、IPv4でアクセスすればIPv4のIPが、IPv6も同様に取得できます。

ここに到達したあとでIPv4とIPv6を変更することはできないため、次のスクリプトで強制してアクセスします。

#!/usr/bin/perl

print "Content-type: text/plain\n\n";
print "$ENV{'REMOTE_ADDR'}";

exit;

このスクリプトは外部のレンタルサーバなどに設置しておきます。

次のスクリプトと別のサーバであればOKです。

curlでアクセスしてJavaScriptとして返すCGI(grobalipreturn_js.cgi)

curlでIPv4とIPv6を強制して先程のスクリプトにアクセスします。

「curl -4」とするとIPv4を強制し、「curl -6」だとIPv6が強制されます。

このスクリプトに「grobalipreturn_js.cgi?mode=4」とアクセスするとIPv4が、「grobalipreturn_js.cgi?mode=6」でアクセスするとIPv6のIPアドレスを返します。

#!/usr/bin/perl

# IPを返すだけのスクリプトURL
my $url = "https://sakue.com/ipchk-simple.cgi";

my %in = ();
my $buf = $ENV{'QUERY_STRING'};

foreach (split(/&/, $buf)) {
  ($key, $val) = split(/=/);
  $val =~ tr/+/ /;
  $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  $in{$key} .= $val;
}

my $result = "";
if($in{'mode'} eq "6") {
  $result = `curl -6 $url`;
}
else {
  $result = `curl -4 $url`;
}

$result =~ s/\r\n//;
$result =~ s/\r//;
$result =~ s/\n//;

print "Content-type: application/x-javascript\n\n";
print "document.write('$result')\n\n";

exit;

単に表示してみたい場合は以下のように「text/plain」で表示します。

print "Content-type: text/plain\n\n";
print "$result";

2つのスクリプトを同じサーバに置くとサーバのIPが返ってきてしまうので、それぞれ別のサーバに設置してブラウザからアクセスします。

JavaScriptで埋め込み

あとは表示したいhtmlファイルにJavaScriptを設置すればOKです。

設置したページにアクセスすると、現在の自分のIPアドレスが確認できます。

IPv4

末尾のパラメータを「mode=4」にするとIPv4アドレスが取れます。

<script type="text/Javascript" src="https://sakue.com/grobalipreturn_js.cgi?mode=4"></script>

IPv6

同様に「mode=6」にするとIPv6です。

<script type="text/Javascript" src="https://sakue.com/grobalipreturn_js.cgi?mode=6"></script>

htmlの例です

<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title></title>
  </head>
  <body>
    <p>IPv4:<script type="text/Javascript" src="https://sakue.com/grobalipreturn_js.cgi?mode=4"></script></p>
    <p>IPv6:<script type="text/Javascript" src="https://sakue.com/grobalipreturn_js.cgi?mode=6"></script></p>
  </body>
</html>

コメントフォーム

タイトルとURLをコピーしました