こちらの記事で書いたように OpenStreetMap のタイルサーバーを運用しています。
先日、なんの気なしに、このタイルサーバーを使っているWebサイトを見に行くと、地図が表示されていません。 タイルサーバー側で特に変更もしていないので、何か不具合でも起こったかな?と思って調べてみたら、いろいろとはまったので、解決するまでの顛末をメモっときます。
問題の切り分け
まずはタイルサーバー自体に問題ないか調べました。sshで接続して、プロセスやサーバー上のログ等を見ても特に問題点は見当たりません。
でも、さきほどのWebサイトを見るとやっぱり地図は表示されません。念のため、同じLAN内のPCからローカルIPアドレスで接続すると、問題なく表示されます。
あれ?どういうことだ?
こうなるということは、サーバーの問題ではなく、外部からのアクセス(DNSかルータ)が怪しい。 ということで、もうちょっと調べると、ルータが原因でした。
ルータの設定内容の確認
最初に結論を書いておくと、
- LAN内のWebサーバーを公開(今回は80以外のポートでした)
- 不正アクセス検知のパケット破棄を有効
とした時に問題が起きました。
どうも、この設定だと、外部からのアクセスができなくなるようです。 実際、不正アクセス検知のパケット破棄を無効にすると、外部からもアクセス可能になりました。
そういえば、少し前にルータから不正アクセス検知があったと通知が来ていて、その際になにも考えずに、『パケット破棄』を有効にしたことを思い出しました。 これが原因だったんですね。
なお、設定していた内容は次の通りです。
Web サーバーの公開方法
Webサーバーの公開設定はこちらの記事にあるようにしています。具体的には次の通りです。
IPマスカレード設定
NATディスクプリタのインターフェースへの適用
受信方向のIPフィルタ設定
NATディスクプリタでIPマスカレードを設定し、LAN内のWebサーバーに転送しています。同時に、受信方向のIPフィルタを定義して、ルータを通過させています。 IPフィルタは、NATディスクプリタを設定すると、自動で定義してくれるやつをそのまま使っています。
不正アクセス検知とパケットの破棄
パケット破棄は、ルータの管理画面の『詳細設定』より、『セキュリティ』->『不正アクセス検知』と進み、『設定』ボタンを押して表示される画面で指定することができます。
画面上部の『検知したパケットの破棄』を選択すると、すべての場合でパケット破棄を指定することができます。
設定後はこんな感じになります(すべての場合でパケットを破棄にしました)。
詳細な原因
さて、画面上の機能の説明からすると、直感的にはこれは不思議な挙動です。 ということで、よくわからなかったこともあり、ヤマハのサポートさんに聞いてみたところ、いろいろと懇切丁寧に教えていただけました。
それは、上記の不正アクセス検知とパケット破棄の設定の一つとして、WinnyとShareのパケットを破棄する設定があるのですが、それを設定したことにより、タイルサーバーの通信も破棄していた、というものでした。
どういうことか理解するために、Winnyのパケット破棄がどのように行われているか調べてみます。
ちなみに、あとからルータのヘルプページを見てみると、不正アクセス検知のパケット破棄を有効にするとIPフィルタが変更されるとちゃんと書いてました。最初からこれに気づいていれば、もうちょっと解決が早かったかもしれません。
Winnyのパケット破棄について
Winnyのパケット破棄を設定した際には、静的フィルタで外部への通信をすべて遮断します。 そのうえで、動的フィルタにて内側->外側の通信を許可するようにしているようです。
静的フィルタの設定はこんな感じです(ルータの管理画面から『IPフィルタ』の『送信方向のフィルタ』を選択すると見ることができます)。
通信開始で使われる ACK を持った外部へのパケットを破棄していることがわかります。一方、通信開始時一番最初の SYN は通しています。
動的フィルタは、tcpを対象に外向き方向に設定しています。最初に内側から外側に通信が開始されて、それが静的フィルタで通過されると、次からは動的フィルタが先に適用されて、通信が許可される、という流れだそうです。Winnyの検知はこの動的フィルタの動作のタイミングで行われるようです。
(参考:IPフィルタについて)
動作確認
この動作を確認するためにログを見てみました。
まず、送信時のIPフィルタ設定(上記の 200098)を変更して、 reject-nolog から reject に変更しログに記録させます。
次に、syslog がデフォルト設定のままだと、破棄されたパケットを見ることができないので、ルータの管理画面より『管理』->『保守』->『コマンドの実行』を開いて、
syslog notice on
と実行し、 notice レベルのログを吐くようにします(コンソールでもできます)。
これで、タイルサーバーにアクセスすると
2019/03/20 11:24:17: Configuration saved in "CONFIG0" by HTTPD 2019/03/20 11:24:24: [INSPECT] PP[01][out][動的フィルタID] UDP 192.168.xxx.xxx:aaaaa > 送信先アドレス・ポート (2019/03/20 11:23:54) 2019/03/20 11:24:26: PP[01] Rejected at OUT(200098) filter: TCP 192.168.yyy.yyy:bbbbb > 送信先アドレス・ポート 2019/03/20 11:24:28: PP[01] Rejected at OUT(200098) filter: TCP 192.168.zzz.zzz:cccccc > 送信先アドレス・ポート 2019/03/20 11:24:29: PP[01] Rejected at OUT(200098) filter: TCP 192.168.zzz.zzz:cccccc > 送信先アドレス・ポート
のように、静的フィルタ(ID番号 200098)により、パケットが破棄されていることがわかります。
なお、この際、動的フィルタがあるんだから、通信できないのだろうか?と考えたのですが、よく考えると、この設定の場合、
- 内から外へ通信を開始る際に、パケットを通過させる
ということなので、最初に外から来たタイルサーバーへのアクセス(に対応する応答のパケット)はこのIPフィルタで落とされてしまうんじゃないかと思ってます(合ってんのかな?)。
なお、ログの内容については、下記などを参考にしてください。
(参考:ログ設定など)
(参考:ログの見方)
回避策
ということで、一応原因がわかりましたので、回避策を取ります。とえらそうに書いてますが、これも、ヤマハのサポートさんに教えていただきました。重ね重ねありがとうございます。
やることは、送信時のフィルタ設定で、当該タイルサーバーから外に戻るパケットを明示的に許可してあげればよい、というものです。
実際の設定方法は、
のように、パケットを破棄するフィルタ設定の手前に、タイルサーバーからの通信(IPアドレス、ポート番号を指定)を通すためのフィルタを追加してやります。
テスト
ということで、この状態でテストすると、無事表示されました。 一方、ルータの設定で不正アクセス検知のパケット破棄も生きたままになっています。
いや、なかなか難しいですね。