2018年10月30日火曜日

IPアドレス国確認のエンハンス

先日公開したIPアドレス国確認ですが、早速機能追加を行いました。
追加機能は以下のとおりです。
・検索結果に指定したIPアドレスのホスト名を表示

まあ大した機能ではないですが、別で確認するのも面倒なので纏めて表示したほうが便利かなと思って追加しました。

2018年10月26日金曜日

グローバルIPアドレスの国を確認するサイトを作りました!

グローバルIPアドレスからそのIPが割り当てられている国を確認するツールを作成しました!
仕様などはページ内で解説していますので、そちらをご確認下さい。

作成したサイトは以下のとおりです。
IPアドレス国確認

テストし切れていない部分もあるので、もし動作がおかしい等々あれば、お問合せからご連絡頂けると助かります。

2018年10月25日木曜日

特殊な用途のIPアドレス

IPv4は0.0.0.0~255.255.255.255の範囲までで表現されますが、この中で利用用途が特定されているIPアドレスが幾つかあります。

有名なものはプライベートIPアドレス、または先日紹介したシェアードIPアドレスなんてものもありますが、それ以外にも幾つか指定されています。
例えば169.254.0.0/16はリンクローカルアドレスと呼ばれていて、分かりやすいのはNICの設定がDHCPになっているのに、DHCPサーバからIPアドレスが取れないときに割り当てあられるアドレスですね。APIPA(Automatic Private IP Addressing)と呼ばれるやつです。

これら以外にも色々あって、RFC3330で定められています。また、最近のIPv4不足もあり、定められていた(もしくは予約されていた)ものの、グローバルIPに割り当てられる事になったIPアドレスもあります。

参考になりそうなサイト
特別なIPアドレスって知っていますか?

2018年10月24日水曜日

PHPで文字列を比較するときに==を利用するとうまくいかない

if文で文字列比較をしたのですが、ハマりました。
PHPだと==は予期せぬ動作をしそうなので、strcmp関数を利用したほうが良いようです。

一致で比較する場合は、以下のような使い方になります。
strcmp(比較する値1,比較する値2)==0

こちらのサイトを参考にさせて頂きました。
PHPで文字列を比較する方法と、型によりハマるポイント

2018年10月23日火曜日

yyyymmddをyyyy/mm/ddにする

日付としてデータをもたせて、出力フォーマットを指定して、とか考えましたが、面倒なので今回は文字列操作で対応しました。

こんな感じです。
substr_replace(substr_replace('20181010','/',6,0),'/',4,0)
//結果
2018/10/10

こちらのサイトを参考にさせて頂きました。
PHPで文字列の指定した位置に文字列を挿入する方法

2018年10月22日月曜日

数字をカンマ区切りにする

PHPには数字をカンマ区切りにするという関数が存在するようです。

こんな感じで利用できるそうです。

<?php
$num = 100000000;
$num = number_format($num);
print $num . "円";
?>

こちらのサイトを参考にさせて頂きました。

2018年10月21日日曜日

Postfix+Sendgridの組合せでメール配信環境を構築する

先日Gmailを利用してメールを配信できる環境を構築しました。
Postfix+Gmailの組合せでメール配信環境を構築する

この度、申請していたSendGrid利用の申請が承認されたので、SendGridを利用するように設定を変更してみます。

設定の仕方ですが、以下のサイトにまとまっています。
Postfix SendGrid

設定内容はGmailを利用する場合とほとんど同じですね。
で、早速メールを飛ばしてみました。

が、届かない!
確認したところ、メールを飛ばす処理でFromにGmailのアカウントを入れていたのが良くないようです。SendGridの申請時に指定したドメインのメールアドレスでないと届かないのですね。スパム利用対策として、正しい動作だと思います。

設定を変更して再度送付したところ、届きました!
ただ、本文の改行がなくなっています。
調べると以下の記載がありました。

よくある質問 ? メール改行トラブル編
考えられる原因
テキストメールのHTML変換機能(以下、HTML変換機能)が有効になっていることが原因として考えられます。この機能は、元のテキストメール(Content-typeがtext/plain)の本文をHTML変換してマルチパートメール(Content-typeがmultipart/alternative)の1パートとして追加します。その際、改行コードはHTMLの改行タグに変換されません。このため、メールクライアントでtext/htmlパートを確認すると、変換されたメールの改行が削除されているように見えます。
早速、対策で書いてあるHTML変換機能の無効化を実施しました。
それでも直らない!

SMTPでメールを送信する際に気をつけることはありますか?

というページでも改行のことに触れていますが、原因が不明。Gmailのときは普通に改行していたのに。。。

まあ、当面人にメールを送る運用は考えていないので、対応は保留にします。
原因が分かったら追記したいと思います。

2018年10月20日土曜日

グローバルIPアドレスを誰が管理しているのか?

グローバルIPアドレスはインターネットの世界で正常に通信を行うため、一意(重複するものがない状態)である必要があります。そのため、グローバルIPアドレスはしっかりと管理されており、その管理組織は階層構造となっています。

まず、頂点にいるのが、以下の組織です。
ICANN(Internet Corporation for Assigned Names and Numbers、アイキャン)

ICANNはIPアドレスの管理のほか、ドメインの管理、ルートネームサーバの運用などインターネットが正常に機能するための基本機能の運用を行っています。

その次に、各地域ごとに管理組織があります。
APNIC(アジア・オセアニア)
ARIN(北米)
RIPE NCC(欧州・中東)
LACNIC(中南米)
AFRINIC(アフリカ)

更にその次の階層として、国ごとの管理組織があります。
日本だとJPNICですね。

つまり、日本で利用されているグローバルIPアドレスは、以下の流れで払い出されているわけです。
ICANN→APNIC→JPNIC

更にJPNICからキャリアなどのIPアドレス管理指定事業者にアドレスが割り当てられ、そこから利用者に分配されます。
つまり、こうなります。
ICANN→APNIC→JPNIC→Pアドレス管理指定事業者→利用者

なお、各管理組織に割り当てられているIPアドレス情報は公開されており、FTPでリストをダンロードすることも可能です。
ftp://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest
ftp://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-latest
ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-latest
ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest
ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest

このリストですが、アドレス帯がCIDRではなく、開始IPアドレスとそこから幾つ割り当てているか、という書きっぷりなんですよね。ちょっと見にくいです。
フォーマットは以下のサイトに解説があります。
RIR statistics exchange format

こういった管理組織ですが、国連や政府機関がやっているの?と思いきや、ICANNを含めて民間団体なんですよね。公的な動きをする団体ではあるものの、改めてインターネットは民間のものであると感じますね。

2018年10月19日金曜日

シェアードIPアドレスとは

前回の記事では、プライベートIPアドレスについて簡単に解説しました。IPアドレスの世界にはプライベートIPアドレス以外にも用途が決まっているアドレス帯があります。それが、 シェアードIPアドレス( シェアードアドレス)です。

IPv4のアドレスが不足していく中で、家庭や企業内でプライベートIPアドレスを利用するのと同様に、ISP(回線事業者)ごとに分けたネットワークを構築するというアイディアが生まれました。そうすれば、家庭や企業で最低1つ必要になるグローバルIPアドレスを減らすことができますからね。

ただ、このISP内のIPアドレスはプライベートIPアドレスというわけには行きません。プライベートIPアドレスだと、家庭、企業内のIPアドレスと重複してしまう可能性があるからです。そのため、新たに払い出されたIPアドレス帯がこのシェアードIPアドレスです。
具体的には以下のアドレスになります。
100.64.0.0/10

もし家庭用ルータのIPアドレスが上記アドレス帯であれば、これはシェアードIPアドレスでインターネットから直接はアクセスできない、と判断できるわけです。

参考サイト
シェアードアドレス 日経XTECH

2018年10月18日木曜日

プライベートIPアドレスとは

IPアドレス(Internet Protocol Address)というのは、ネットワークに接続をされている機器同士が通信を行うための住所のようなものです。IPアドレスを持たない機器(パソコン、サーバ、ネットワーク機器)は通信を行うことができません。
※これは非常にざっくりとした説明で、OSI参照モデルの第3層だけの話ではあります。

インターネットに接続されている機器が全てIPアドレスを持てばそれはそれで良いのですが、例えば家や会社の中で使うパソコンなどは、インターネットにアクセスすることはあってもインターネットからアクセスされる必要はありません。(逆にセキュリティを考えると、インターネットからパソコンにアクセスできるのは危ないですよね。)また、全てのパソコン等々の機器に一意なIPアドレスを割り振ろうとすると、IPアドレスが足りなくなってしまいます。そんなわけで、閉ざされたネットワークで利用するIPアドレスというのが設定されています。これがプライベートIPアドレスです。

IPv4ではプライベートアドレスとして、以下の3つが用意されています。

・10.0.0.0/8
 利用できるアドレス:10.0.0.0~10.255.255.255
・172.16.0.0/12
 利用できるアドレス:172.16.0.0~172.31.255.255
・192.168.0.0/16
 利用できるアドレス:192.168.0.0~192.168.255.255

これ、結構間違えて使っている環境とかを時々見ます(192.16.1.0/24とかにしちゃったり)。気をつけましょう!

【参考になりそうなサイト】
プライベートネットワーク Wikipedia
IPアドレスとは?をわかりやすく解説します カゴヤのサーバー研究室

2018年10月17日水曜日

ファイルを1行づつ読み出して処理を行う

phpでファイルを1行づつ最後の行まで読み出す処理です。fopenはどこの行まで読み出すかを指定することも出来るみたいですね。

<?php
/* ファイルポインタをオープン */
$file = fopen("list.txt", "r");

/* ファイルを1行ずつ出力 */
if($file){
  while ($line = fgets($file)) {
    echo $line;
  }
}

/* ファイルポインタをクローズ */
fclose($file);
?>

こちらのサイトを参考にさせて頂きました。
ファイルから1行ずつ読み込む - fgets()

2018年10月16日火曜日

問合せフォーム

問合せフォームを作ってみました。

今はGooleフォームという、簡単に問合せフォームを作成することが出来るとても便利なものがあるのですが、今回は敢えて完全自作してみようと思い、一から組んでいます。
作成したサイトがこちらです。
お問合せ

極めて普通の問合せフォームではありますが、機能選択のプルダウンメニューを機能を増やすたびにメンテしないといけないのが、少し面倒ですね。
送信ボタンを押すと、内部的には私宛に問い合わせ内容を本文に記載したメールが私宛に飛ぶようになっています。

2018年10月15日月曜日

Postfix+Gmailの組合せでメール配信環境を構築する

メールを配信できる環境を作るため、Postfixの設定を行いました。本当はPostfix+SendGridの組合せにしようと考えていたのですが、SendGridの審査に多少時間がかかりそうなので、一旦Postfix+Gmailの組合せでメールで飛ばせるようにしておきます。

やり方ですが、以下のサイトを参考にさせて頂きました。
PostfixのメールをGMail経由で送る

上記サイトには記載がないのですが、最近のGoogleアカウントは「安全性の低いアプリの許可」がデフォルト無効になっており、パスワード認証でメールを配信することができません。そのため、本設定を有効にする必要があります。

2018年10月14日日曜日

プルダウンメニューで項目をグループ化する

プルダウンメニューで項目をグループ化するには、以下のようにoptgroup タグを利用します。

<form>
<select>
<optgroup label="英字">
<option value="a">a</option>
<option value="b">b</option>
<optgroup label="数字">
<option value="1">1</option>
<option value="2">2</option>
</optgroup>
</select>
</form>

phpで項目をグループ化する良い方法がないか考えたのですが、一旦保留にします。。。

こちらのサイトを参考にさせて頂きました。
プルダウンメニューをグループ分けする

2018年10月13日土曜日

2018年10月12日金曜日

文字列を特定の文字で区切って配列に入れる

区切り文字を指定して配列に入れたい場合は、explode関数を使うようです。
こんな感じです。

$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

こちらのサイトを参考にさせて頂きました。
explode

2018年10月11日木曜日

文字列を置換する

文字列内の特定の文字を置換するには、strtr関数を利用するそうです。
こんな感じです。

$str = 'This year is 2016 years.';

//部分文字列を検索して置換する
$result = strtr($str, '2016', '2017');

echo $result;

結果
This year is 2017 years.

こちらのサイトを参考にさせて頂きました。
【PHP入門】文字列の置換 | str_replace・str_ireplace・strtr

2018年10月10日水曜日

pre要素で折り返し表示させる

あまり良くないという記述を発見したものの、コマンドの実行結果を表示するのにpre要素を利用しています。現在作成中の機能では1行が長い出力結果が出る場合があるのですが、画面レイアウトが崩れました。。。

調べたところ、CSSで折り返しするように指定できるみたいです。
こんな感じです。

pre {
white-space: pre-wrap ;
}

こちらのサイトを参考にさせて頂きました。
pre要素で折り返し改行させる方法

2018年10月9日火曜日

dateで時間を取得するとUTC(協定世界時)になっちゃう問題

phpで結果をログに出す処理でdate関数を使ったところ、時刻がずれていることに気付きました。UTCで出てますね。

で、調べたところphp.iniでタイムゾーンを設定すれば良さそうです。
こんな感じです。
date.timezone = Asia/Tokyo

こちらのサイトを参考にさせて頂きました。
【xampp1.7.4】date関数で時刻を表示させると日本標準時(JST)より8時間遅れる原因

処理の中でも変更できるみたいですね。
今回はまとめて設定したかったのでphp.iniで対応してしまいましたが。

2018年10月8日月曜日

PHPでコマンドを呼び出す際に入力値をエスケープする

サニタイジングというと色々ややこしい話になりそうですが、やはり外部からの入力値に危ない文字列が含まれるリスクは考慮しておく必要があります。例えば入力値を変数としてコマンドを実行する場合、以下のような複数の対策を取る必要があります。
  1. 入力値チェック
  2. エスケープ
  3. コマンド実行ユーザ権限を必要最低限のものとする
入力値チェックは実装するとは思いますが、思いもよらない入力に対応できない場合(不具合ではありますが)もあります。その場合の対策として、エスケープを行いましょう!
PHPの場合は以下の関数を利用するようです。

escapeshellarg()

更に、万が一のことを考え、実行させるユーザの権限を最小限のものにしておく必要があります。

まあ、そもそもPHPからコマンドを呼び出すような実装をするなと言う話はありますが、自分が作りたいものにコマンド実行ありきのものが多いのです。でも、今後SQLとかを実行する際にも役立つと思うので、勉強がてら慎重に作っていこうと思います。

こちらのサイトを参考にさせて頂きました。
サニタイズ/入力値検証/エスケープの考え方

2018年10月7日日曜日

名前解決確認

名前解決のテストを行う機能を作成しました。こちらになります。
名前解決確認(nslookup/dig)

このページで名前解決確認を行うと、nslookupとdigの両方を実行してくれます。digの方が実際のDNSレコードのイメージで出力されるので見やすいと思うのですが、自分も含めて名前解決と言えばnslookupだよね、と考えている人も多いかと思い、両方出力するようにしました。

オプションはレコードと利用するDNSサーバだけにしています。コマンド自体は色々なオプションが用意はされているのですが、画面にオプションを増やすと分かりにくくなってしまうかと思い、今回はシンプルにしてみました。再帰しないとか、debugとかはニーズもあるかとは考えたのですが、一旦保留です。

nslookupとdigの出力結果の解説も作ろうかとは思ったのですが、まあ少し調べると色々出てきますし、そもそも名前解決を確認しようとする人はそのくらい分かるかなということで、今回は作成してません。一応、参考になりそうなサイトをご紹介しておきます。
nslookupの基本的な使い方(イントラネット編)
奥が深いDNSサーバーとdigコマンド

2018年10月6日土曜日

DNSレコードとは

DNS(Domain Name System)はホスト名や役割などをIPアドレスと紐付けて管理する、インターネットの重要な仕組みの1つです。この紐付けが具体的に記載されているものがDNSレコードです。DNSレコードはいくつも種類がありますが、ここでは主要なものを紹介します。

Aレコード ホストのIPアドレス(ipv4)
AAAAレコード ホストのIPアドレス(ipv6)
PTRレコード IPアドレスに対するホスト名、つまりAレコードの逆
CNAMEレコード ホスト名のエイリアス(別名)
TXTレコード ホストへのテキスト情報
NSレコード ドメインのDNSサーバ
MXレコード ドメインのメールサーバ
SOAレコード ドメインの情報

TXTレコードは色々な使い方をしますし、上記以外にもSRVレコードやCAAレコードなども時々登場します。奥深い世界ですね。

以下、参考リンクです。
DNSレコードタイプの一覧 Wikipedia
主なDNSレコードの種類 @IT

2018年10月5日金曜日

Ping疎通テスト

Ping疎通テストが出来るページを作成しました。

処理としてはサーバ上でpingを打って、その結果を拾っているだけです。色々やろうと思ったところはあるのですが、現在のスキルレベルを鑑み、シンプルな作りとなりました。

悪用はしないようにお願いします!
Ping疎通テスト

2018年10月4日木曜日

ファイルに追記する

PHPで処理を行うたびにログに記録するようにしたいと思い、ログファイルに追記する処理を探しました。いくつかやり方はあるようですが、こちらを採用しました。

<?php

// 書き込みモード(追記)でファイルを開く
$fp = fopen("fwrite.txt", "a");

// ファイルに書き込む
fwrite($fp, "add sample");

// ファイルを閉じる
fclose($fp);

?>

こちらのサイトを参考にさせて頂きました。
fopen関数から始める!ファイルの読み込み・書き込み方法【PHP入門】

2018年10月3日水曜日

文字列を検索する

特定の文字列が含まれているか、で条件分岐をしたい場合、以下のようにすれば良い。

if(strpos($subject,'bc') !== false){
  //'abcd'のなかに'bc'が含まれている場合
}

if(strpos($subject,'bc') === false){
  //'abcd'のなかに'bc'が含まれていない場合
}

preg_matchで正規表現を指定するよりも、処理が早いそうです。

こちらのサイトを参考にさせて頂きました。
【PHP】特定の文字列を含むかのチェック

2018年10月2日火曜日

FQDN、IPアドレスを正規表現で記載する

FQDNについては、こんな感じでできるようです。
^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$
^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-\.]{0,61}[a-zA-Z0-9])+\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])*$

こちらのサイトを参考にさせて頂きました。
[regex] DNSホスト名またはIPアドレスに一致する正規表現ですか?

IPアドレスについては、こんな感じでできるようです。
^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$

こちらのサイトを参考にさせて頂きました。
IPアドレスの正規表現について

(2019/07/17追記)
FQDNの正規表現を修正しました。まだ怪しい感じですが、多少改善されたかと。

2018年10月1日月曜日

pingコマンド、実行結果の見方について

本記事ではPing疎通テストの解説を行います。

1.Pingとは
pingとはPacket INternet Groperの略で、対向のサーバ、ネットワークと通信できるかを確認するコマンドです。pingはICMP(Internet Control Message Protocol)というIP層のプロトコルを利用します。

2.pingコマンド
pingコマンドはWindowsにもLinuxにも用意されています。基本的な使い方は同じですが、オプションが異なります。Suama Online Serviceの環境はLinux(CentOS)で動作していますので、Linux用のオプションを指定して実行しています。
実行するコマンドは以下のとおりです。
ping -c5 [対象ホスト]

-c5:これは実行する回数を5回に指定しています。
※Windowsはオプション無しだと4回しか実行しませんが、LinuxはCtl+Cで止めるまで無限に実行し続けます。
これ以外にも幾つかオプションが用意されています。詳細は以下のサイトをご参照下さい。
【Linux】pingコマンドの使い方

3.実行結果の見方について
次のコマンドを実行した場合、
ping -c5 www.example.com

次のような実行結果が返ります。
--------
PING www.example.com (93.184.216.34) 56(84) bytes of data.
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=1 ttl=53 time=107 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=2 ttl=53 time=107 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=3 ttl=53 time=107 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=4 ttl=53 time=107 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=5 ttl=53 time=107 ms

--- www.example.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 107.564/107.602/107.660/0.416 ms
--------

1行目は疎通確認対象情報です。IPアドレスの場合はアドレスのみ記載されますが、FQDNで指定した場合、名前解決の結果が表示されます。
2行目からが実行結果で、64 bytesはテストに利用したパケットデータサイズ、fromは疎通テスト先、icmp_seqは何番目のパケットか、となっています。ttlはネットワークパケットのTTL(Time To Live)で、最初は64でネットワーク機器を経由するたびに1減ります。そのため、ttlを確認するとそのパケットがどれだけのネットワーク機器を経由したかが分かります。ttlが0になるとそのパケットは転送されなくなります。timeは応答時間で、少ないほど遅延の少ない通信が行えていることが分かります。

ping statisticsはpingコマンド実行結果のサマリです。結果の1行目は結果サマリで、2行目が分析結果となっています。
2行目にはmin(最速)、max(最遅値)、ave(平均値)、mdev(偏差)が表示されます。偏差で通信の安定性を判断することができます。が、今回の場合はサンプルが少ないので、あまり参考にはなりませんね。

以下のサイトを参考にさせて頂きました。
pingコマンドについて詳しくまとめました 【Linuxコマンド集】

ローカルアドレス(プライベートアドレス)を正規表現で記載する

まあ、こういうことですよね。

(^127\.)|(^169\.254\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)

こちらのサイトを参考にさせて頂きました。
プライベートIPアドレスとその正規表現

正規表現のチェックはこちらのサイトが便利です!
PHP: preg_match() / JavaScript: match() 正規表現チェッカー ver3.1

こちらのサイトで確認する際はこんな風↓にデリミタ(区切り文字)を付ける必要がります。
/(^127\.)|(^169\.254\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)/u