TCPラッパーhosts.allowで作業用PCのIPv6アドレスを許可する~動的に反映させる方法で省力化

awk

VPSサーバーのIPv6を有効にした

作業環境のネット接続でIPv6を積極的に使う事にしたので、VPSサーバー(Linux)側もIPv6を有効にしました。

遠隔作業はSSH(SCP)を使って操作&ファイル転送しており、VPS側ではtcp-wrappers(hosts.allowとhosts.denyの組み合わせ)でSSH接続を規制する事にしました。

SSH接続を制限する簡単な方法として、hosts.denyでALL拒否にしておき、hosts.allowで許可するアドレスを指定するのが簡単で一般的です。

全てのsshアクセスを拒否

sshd: ALLCode language: HTTP (http)

OCNからのipv4アクセスは許可、ipv6アクセスは特定アドレスだけ許可するイメージ

sshd: .ppp.ocn.ne.jp
sshd: [2405:6587:6c60:0:d1a8:4f13:ecc:bff4]Code language: CSS (css)

こういう方法が簡単に考えられますが、問題の作業用Windows PCのIPv6アドレスは動的に割り当てを貰うものなので、PCを起動する度に変更されてしまいます。

そこで、外部ファイル(ユーザーディレクトリ)のファイルをインクルードする方法を調べてみたところ、単純にファイルのパスを記すだけでOKという事がわかりました。

具体的には、動的にしたいhosts.allowを下記の様に変更しました。

sshd: .ppp.ocn.ne.jp
sshd: /home/myworks/IPv6Address.txtCode language: HTTP (http)

作業はWindowsパソコンで行うので、ipconfig /allでIPv6アドレスを調べて、SSHでipv4接続して下記ファイルをその都度書き換える事にしました。

sshd: [2405:6587:6c60:0:d1a8:4f13:ecc:bff4]Code language: CSS (css)

書き換えたらhosts.allowが更新されるので、SCPでipv6接続して高速なファイル転送を行える事が確認出来ました。目下のところIPv4に比べて3倍位速いです。

IPv6アドレスを調べてファイルを書き換えるという一手間が必要ですが、セキュリティに手間を惜しんではいけないので、ここだけは崩さない様にしようと思っています。何より単純で簡単です。

追記:IPv6ダイナミックDNSを使用して動的に更新する

やっぱり面倒くさいので、自動的(動的)に作業PCのIPv6アドレスを許可する仕組みにする事にしました。VPNサーバー側ではbashとcronを使って更新する単純な仕組みにしました。

必要なもの

  1. OPEN IPv6 ダイナミック DNS for フレッツ・光ネクスト
  2. NTPクライアント(Windows標準)

所謂ダイナミックDNS(DDNS)を使用してみる事にしました。ソフトイーサ株式会社のベータサービス(無償利用可能)です。メールアドレスがあれば無料で使用させていただくことが出来ますが、ベータサービスなので何時使えなくなるかは分からないです。過去にVPNサービスを利用させていただいた事があり、この会社なら恐らく大丈夫だと思いますが一応お約束です。

IPv6接続出来ているPCで同サイトにアクセスし、作成画面から新規ホストを登録します。既にIPv6アドレスは自動的にフォームに入力されていると思うので、希望するホスト名と、メールアドレスを入力して登録します。

ここからが重要ですが、更新専用のホスト名、更新専用アドレス、ホストキーを発行して貰えるので大切に保存しておきます。(紛失したらメールアドレスで再発行可能だそうです)

作業用PC(Windowsパソコン)

作業用PC(クライアント)には、専用のアプリをインストールする必要はありません。幾つかの方法でDDNSを更新することが出来ます。

  1. HTTP URLにアクセスする
  2. 専用更新 IPv6 アドレスまたはホスト名へのPing等の送信
  3. Web フォームからの手動更新

1が手軽かな?と思ったのですが、キチンと説明を読むと2が一番手軽だとわかりました。なぜならNTPに対応してくれているので、作業用PCのNTP同期先を専用更新ホストに設定して置けば常に更新してくれるだろうという狙いです。

Windowsの時刻設定から、インターネット時刻に「update-xxxxxxxxxx.i.open.ad.jp」みたいなアドレスを設定して同期してみます。無事に時刻同期できました。向こう側(ソフトイーサ側)で上手くやってくれるのでお任せします。

NTPサーバー(時刻同期)をいじりたく無い人は、HTTP URL先にアクセスするだけなので、そっちの方が確実かも知れません。ブラウザにブックマーク(お気に入り)を登録しておけば、ワンクリックでDDNSを更新出来ますからね。

VPSサーバー

とりあえずVPSサーバー(Linux)側で名前が引けるかDNSルックアップをしてみます。IPv6のアドレスがキチンと返って来て、ソフトイーサ側に登録出来たアドレスと同じであることを確認します。

<code>$ host hogehoge.i.open.ad.jp
 hogehoge.i.open.ad.jp has IPv6 address 2405:6587:6c60:0:xxxx:yyyy:zzzz:aaaa</code>Code language: HTML, XML (xml)

ここからはちょっとした小細工が必要でしたが、今回は手軽にawk(オーク)を使用します。欲しい部分(IPv6アドレス)だけを取り出したいので、簡単にスペース区切りから切り出してくれるawkは実に便利です。

<code>$ host hogehoge.i.open.ad.jp | awk '{print $5}'
 2405:6587:6c60:0:xxxx:yyyy:zzzz:aaaa</code>Code language: HTML, XML (xml)

こんな感じでスペース区切りの5つ目が抽出できました。

しかし、hosts.allowには、下記の様に・・

<code>[2405:6587:6c60:0:xxxx:yyyy:zzzz:aaaa]</code>Code language: HTML, XML (xml)

としなくてはならないことは先に判明しているので、echoコマンドと組み合わせて小カッコを出力します。一行で出力させる為にシェルスクリプトにして、定期的に実行する事にしました。10分毎で良いかなと思っていますが実際に使ってみてcronを調整すれば良いでしょう。あまり頻繁に更新するのも良くないと思います。

#!/bin/bash
IPv6=$(/usr/bin/host hogehoge.i.open.ad.jp | awk '{print $5}') 
echo [${IPv6}] > MyIPv6Address.txtCode language: JavaScript (javascript)

特別難しいことはしていませんが、一応先々の自分の為にも今回考えついた動きを記録しておきます。おそらくかなりシンプルな方法だと思います。

IPv6という名前の変数にhostコマンドで取得したIPv6アドレスを一旦記憶し、echoコマンドで[+IPv6Address+]とくっつけて出力しています。もちろん出力(リダイレクト)先はhosts.allowで定義した/home/MyWorks/IPv6Address.txtです。実行するシェルファイルを同じ階層に置いているのでパスは省略してファイル名のみにしています。階層が違う場合はフルパスでリダイレクト先を指定する必要があります。

MyIPAddress.shに実行権を与えて実行すると、MyIPAddress.txtの中身が書き換わることを確認しました。中身を適当に編集して書き換わるか検証してみると良いでしょう。

あとはcronに登録して、定期的に実行させて、作業用PCのIPv6アドレスをVPSサーバー側で調べてもらえば、手放しで制限のかかったVPSにアクセス可能になります。

最後に

サーバー側に仕組みを入れるまではちょっと面倒くさいですが、今後繰り返しIPv6アドレスで接続して作業する事を考えると動的に更新する様にしてしまえば楽です。セキュリティ的にもかなり安心になります。その場限りならこんな事はする必要は無いと思いますが、何度も使う処理はひと手間かけて自動化して先々の省力化を行う価値があります。

コメント

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