• 締切済み

LANで実行できるCGIが外部からだとできない原因

raspberry piで自分用のwebサーバを立てています。 環境は以下の通り。 HW: raspberry pi 2B OS: raspbian 8.0 (Jessie) webサーバ: lighttpd 1.4.35 CGI: python 2.7 NWはKDDIの光で、KDDIの終端装置兼ルーターと自前のルータの2段階でIPマスカレードしてます。 WAN---(GIP)KDDI終端装置(192.168.1.1)-----(192.168.1.2)自前ルータ(192.168.11.1)----(192.168.11.21)ラズパイ 静的ページにはLAN/WANのクライアントともに接続できます。 pythonのCGIは、LANから接続できるものの、WANからは応答なしになります。 ブラウザは待機状態(?)の白いままで、エラーコードも帰ってきません。 サーバ側のerror.logにも特に何も出てません。 ポートは静的ページもCGIも同じなので、静的ページが参照できていることからNWの問題ではないと考えています。 なお、CGIではラズパイ上のsqlite3のDBファイルにアクセスしています。 sqlite3かlighttpdの設定の問題と思うのですが、目星がつかずに困っています。 何か原因に心当たりがありましたら教えてください。

みんなの回答

回答No.12

あれこれ試す前に、ブラウザキャッシュの問題が関係していたか、どうかを 明確にして問題点をクリアにすべきです。 ブラウザのキャッシュをクリアしてから再アクセスして確認しましょう。 なお、宅内に複数のサーバーがあって、設定が同じなのに アクセスできたり出来なかったりというのは もしかして、サーバーのIPアドレスを入れ替えながらテストされていませんか? その場合、ルーターやスイッチングハブでMACアドレスが キャッシュされているのが原因ということもありえます。 サーバーのIPアドレスを変更した場合は、ルータやスイッチングハブを再起動してみましょう。

回答No.11

> WEBサーバ側の設定は先日提示したlighttpd.confが全てですので、 いや、 include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port include_shell "/usr/share/lighttpd/create-mime.assign.pl" include_shell "/usr/share/lighttpd/include-conf-enabled.pl" とあるので、その先も見てみないとわかりませんよ。 とくに  include-conf-enabled.plから呼ばれるconf-enabled/*.conf など。 たとえば、fastcgi.conf内で ログ設定をホスト名にしていたら、 静的ページは逆引きなしなのに、CGIだけは逆引きありになって pi-holeとかdnsmasqとかのキャッシュDNSの設定不具合も加わると グローバルIPからのCGIアクセスのみTIMEOUTするという 可能性は ありえます。 (必ずこれが原因ということではなくて、疑うとしたらこの点も見ておいたほうがよい  というだけですが) 単純に、ラズパイで auからのIPアドレスが nslookupできるかで試してもよいかも。 (ついでに、lighttpd.confのuse-ipv6.plをコメント化するとどうなるかも)

palayo
質問者

お礼

お礼が遅くなりすみません。 外部からCGI接続できるサーバもあるので、そちらと設定を比較したのですが、 includeされているファイルも含め設定に差異がありませんでした。 また、静的ページは接続できていると思っていたのですが、 ここのところ接続できなくなりました。 ご指摘いただいていた通り、ブラウザキャッシュが効いていたのかもしれません。 なので、やはりKDDIルータか自前ルータのどちらかが原因と思いますが、 接続できるサーバとできないサーバとの差異が見つけられません・・。 もう少し力添えいただけないでしょうか。

回答No.10

成功する静的ページも 失敗するCGIも  http://www.xxx.com/ はまったく同じで ファイル名だけ違うということであれば、IPv6の問題 ではなさそうです。 う~ん。 もしかして、サーバーのCGI設定で、アクセス元のIPアドレスを DNSを使ってホスト名に逆引きするようにしているけど サーバー側(宅側)でDNSをポート制限してしまっているとか、 サーバー自身のネットワーク設定のDNS設定に異常があるとか (たとえば、宅側ルーターのLAN側か、ISPのDNSか 公開キャッシュDNSのIPアドレスを  指定すべきなのに、誤って独自ドメインのネームサーバーのIPアドレスを指定しているとか) 広告ブロッカー等のDNSを使っていて特定のIPは逆引きできないようになっていて それでクライアントのIPアドレスによっては、DNS応答待ちになって 結果TIMEOUTしているとか。

palayo
質問者

お礼

お礼遅くなりました。何度も親身に回答いただきありがとうございます。 WEBサーバ側の設定は先日提示したlighttpd.confが全てですので、 サーバ側のCGIでのDNSに関する設定うんぬんはないかと思います。 また、ドメイン名を使用せず、GIPを直接指定した場合でも 結果は変わりませんでした。 少しずつ絞れてきた気がしますが、 逆に問題となりそうなところがなくなってきたような気もしており、 手の打ちどころが分かりません。

回答No.9

WANからアクセスしているときの、静的ページとCGIは URLとしては、プロトコル(http|https)や、ホスト名orIPアドレスや パスは 全く同じで、ファイル名だけが違うのでしょうか? たとえば、CGI側のURLだけが IPv6を使ってしまうURLになっているが、 キャリア回線または、宅側がIPv6に非対応なので ERR_CONNECTION_TIMED_OUT になってしまうということは、ないですか?

palayo
質問者

お礼

ホントに何度もありがとうございます。 静的ページは、http://www.xxx.com/index.html CGIページは、http://www.xxx.com/test.py などです。 サーバ上では、どちらも/var/www/html/の配下に置いてあります。 www.xxx.comは、ドメインサービスのDNSにてAレコードを KDDI光の終端装置のGIP(IPv4)に設定しています。 IPv6についてはよくわかっていないので、 IPv6を使うURLになっているかどうかは分からないのですが、 何で確認するものでしょうか? ドメインサービスの設定?終端装置兼ルータ? 自分でも調べてみますが、教えていただけますと助かります。

回答No.8

> WANからの接続は、au系のsimでの接続で確認しています。 > proxyやvpnは使用していないですが、何か関係ありそうでしょうか。 スマホのブラウザでのみ確認されてPCでは未確認ということでしょうか? もしかして、CGIではヘッダに不具合があって スマホのブラウザでは真っ白ってことは ないですか?

palayo
質問者

お礼

何度もありがとうございます。 困っており、調査の糸口をいただけるだけで本当に助かります。 スマホのブラウザおよび、テザリングでwindows10のPCからも確認しています。 スマホではERR_CONNECTION_TIMED_OUTとなり、 PCではERR_CONNECTION_REFUSEDとなりました。 LANではCGIを参照できるので、ヘッダの誤りではないと思うのですが・・。 念のため、test.pyにContent-Type指定も入れてみましたが、結果は変わりませんでした。 --------------- #!/usr/bin/python # -*- coding: utf-8 -*- if __name__ == '__main__': print "Content-Type: text/html"; print ""; print "hello world";

回答No.7

ということは、CGI固有問題ではなさそうですね。 もしかしてなんですが、 LAN内から WANにアクセス出来るかの確認をするために、 どこかのProxyかVPNを経由させていて そいつが.py拡張子へのアクセスをブロックしているとか。 もしくは、静的ページなら、WANからもアクセスできていると思っていたら 見えていたのはブラウザキャッシュで、実際にはアクセスできていないとか。 (CGIはブラウザキャッシュが効かない) この場合だと、話が元に戻って、 FireWallとか二段構成の静的IPマスカレードのほうが怪しくなりますが。

palayo
質問者

お礼

静的ページはブラウザのキャッシュということはないと思います。 サーバ側で記載変更した結果がWANからでも確認できましたので。 WANからの接続は、au系のsimでの接続で確認しています。 proxyやvpnは使用していないですが、何か関係ありそうでしょうか。 なお、.cgiでもCGIファイルを作成してみましたが、 LANからは参照可能、WANからは参照不可は変わらずでした。

回答No.6

静的コンテンツはWAN LANのどちらからでもアクセスできて CGIだと、LANのみしか動作しないということでしたら、 FireWallや 静的IPマスカレードが原因である可能性は低いと思われます。 もしかして、CGIで 静的IPマスカレードしていないポートかプライベートIPを使うように指定した srcとかhref のあるコンテンツ(HTML)を返しているとか、 locationとか redirectとかでプライベートIPを指定してないでしょうか? もしくは、CGIが、WAN側からアクセスしたときだけ、 認証要求する仕様になっていて、WANからだとそこでループしてしまっているとか。 そういうCGIの特徴はないでしょうか? もしくは、LANからはURLとしてプライベートIPアドレスを指定してるけど、 WANからだと ドメイン名(FQDN)で指定している 、といった差があるなら Webサーバーでのバーチャルドメイン設定に問題があって アクセスURLの違いでCGIが動かないという可能性も。 簡単なCGIを設置してテストしてみれば、 CGI固有の問題なのか 、どんなCGIでもNGなのかで 問題が切り分けできそうですが…

palayo
質問者

お礼

テスト用にHello WorldなCGIを置いてみましたが、 やはりLANからは参照可能、WANからは参照不可でした。 CGIの内容は以下の通りです。 test.py ------------------- #!/usr/bin/python # -*- coding: utf-8 -*- if __name__ == '__main__': print "hello world"; --------------

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.5

>次に疑うべきは何でしょうか?? 「KDDIの終端装置兼ルーター」とのことですがONU専用にしてルーター機能を停止させることが出来れば自前ルーターでPPPoE認証をする方法で試されては如何ですか。

palayo
質問者

お礼

KDDIの終端装置兼ルーターはNECのATERM-AECA19という製品ですが、 ONU専用するような機能はないようでした。

noname#263248
noname#263248
回答No.4

ラズパイにファイヤーウォールが設定されているなら一度止めてみてください どうでしょうか

palayo
質問者

お礼

調べてみたところ、raspbianにはデフォルトではファイアウォールはインストールされていないようです。 raspbianでファイアウォールを使用する場合には、 ufwというファイアウォールを使用するのが一般的なようですが、 こちらではインストールしていません。

noname#263248
noname#263248
回答No.3

#1です lighttpd.conf に deny または allow を含む設定があったらその前後3行程度みてみたいです もしそんな設定があったらそこだけコメントアウトして再起動してみたらどうなりますか?

palayo
質問者

補足

lighttpd.confの内容です。ほぼデフォルトで、アクセス制限に関する設定は特にないようです。 server.modules = ( "mod_access", "mod_alias", "mod_compress", "mod_redirect", # "mod_rewrite", "mod_cgi", "mod_fastcgi", ) server.document-root = "/var/www/html" server.upload-dirs = ( "/var/cache/lighttpd/uploads" ) server.errorlog = "/var/log/lighttpd/error.log" server.pid-file = "/var/run/lighttpd.pid" server.username = "www-data" server.groupname = "www-data" server.port = 80 index-file.names = ( "index.php", "index.html", "index.lighttpd.html" ) url.access-deny = ( "~", ".inc" ) #static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" ) static-file.exclude-extensions = ( ".php", ".pl", ".fcgi",".py" ) cgi.assign = ( ".py"=> "/usr/bin/python" ) compress.cache-dir = "/var/cache/lighttpd/compress/" compress.filetype = ( "application/javascript", "text/css", "text/html", "text/plain" ) # default listening port for IPv6 falls back to the IPv4 port include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port include_shell "/usr/share/lighttpd/create-mime.assign.pl" include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

関連するQ&A