こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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の設定の問題と思うのですが、目星がつかずに困っています。
何か原因に心当たりがありましたら教えてください。

投稿日時 - 2019-01-07 20:27:52

QNo.9575469

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(12)

ANo.12

あれこれ試す前に、ブラウザキャッシュの問題が関係していたか、どうかを
明確にして問題点をクリアにすべきです。
ブラウザのキャッシュをクリアしてから再アクセスして確認しましょう。

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

投稿日時 - 2019-01-21 23:10:55

ANo.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をコメント化するとどうなるかも)

投稿日時 - 2019-01-16 11:23:14

お礼

お礼が遅くなりすみません。
外部からCGI接続できるサーバもあるので、そちらと設定を比較したのですが、
includeされているファイルも含め設定に差異がありませんでした。

また、静的ページは接続できていると思っていたのですが、
ここのところ接続できなくなりました。
ご指摘いただいていた通り、ブラウザキャッシュが効いていたのかもしれません。

なので、やはりKDDIルータか自前ルータのどちらかが原因と思いますが、
接続できるサーバとできないサーバとの差異が見つけられません・・。

もう少し力添えいただけないでしょうか。

投稿日時 - 2019-01-21 22:30:23

ANo.10

成功する静的ページも 失敗するCGIも  http://www.xxx.com/ はまったく同じで
ファイル名だけ違うということであれば、IPv6の問題 ではなさそうです。

う~ん。
もしかして、サーバーのCGI設定で、アクセス元のIPアドレスを
DNSを使ってホスト名に逆引きするようにしているけど
サーバー側(宅側)でDNSをポート制限してしまっているとか、
サーバー自身のネットワーク設定のDNS設定に異常があるとか
(たとえば、宅側ルーターのLAN側か、ISPのDNSか 公開キャッシュDNSのIPアドレスを
 指定すべきなのに、誤って独自ドメインのネームサーバーのIPアドレスを指定しているとか)
広告ブロッカー等のDNSを使っていて特定のIPは逆引きできないようになっていて
それでクライアントのIPアドレスによっては、DNS応答待ちになって
結果TIMEOUTしているとか。

投稿日時 - 2019-01-13 17:11:22

お礼

お礼遅くなりました。何度も親身に回答いただきありがとうございます。

WEBサーバ側の設定は先日提示したlighttpd.confが全てですので、
サーバ側のCGIでのDNSに関する設定うんぬんはないかと思います。
また、ドメイン名を使用せず、GIPを直接指定した場合でも
結果は変わりませんでした。

少しずつ絞れてきた気がしますが、
逆に問題となりそうなところがなくなってきたような気もしており、
手の打ちどころが分かりません。

投稿日時 - 2019-01-15 21:18:32

ANo.9

WANからアクセスしているときの、静的ページとCGIは
URLとしては、プロトコル(http|https)や、ホスト名orIPアドレスや パスは
全く同じで、ファイル名だけが違うのでしょうか?

たとえば、CGI側のURLだけが IPv6を使ってしまうURLになっているが、
キャリア回線または、宅側がIPv6に非対応なので
ERR_CONNECTION_TIMED_OUT
になってしまうということは、ないですか?

投稿日時 - 2019-01-11 20:25:47

お礼

ホントに何度もありがとうございます。
静的ページは、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になっているかどうかは分からないのですが、
何で確認するものでしょうか?
ドメインサービスの設定?終端装置兼ルータ?
自分でも調べてみますが、教えていただけますと助かります。

投稿日時 - 2019-01-11 23:50:18

ANo.8

> WANからの接続は、au系のsimでの接続で確認しています。
> proxyやvpnは使用していないですが、何か関係ありそうでしょうか。

スマホのブラウザでのみ確認されてPCでは未確認ということでしょうか?
もしかして、CGIではヘッダに不具合があって
スマホのブラウザでは真っ白ってことは ないですか?

投稿日時 - 2019-01-11 15:30:05

お礼

何度もありがとうございます。
困っており、調査の糸口をいただけるだけで本当に助かります。

スマホのブラウザおよび、テザリングで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";

投稿日時 - 2019-01-11 17:04:24

ANo.7

ということは、CGI固有問題ではなさそうですね。

もしかしてなんですが、
LAN内から WANにアクセス出来るかの確認をするために、
どこかのProxyかVPNを経由させていて
そいつが.py拡張子へのアクセスをブロックしているとか。


もしくは、静的ページなら、WANからもアクセスできていると思っていたら
見えていたのはブラウザキャッシュで、実際にはアクセスできていないとか。
(CGIはブラウザキャッシュが効かない)
この場合だと、話が元に戻って、
FireWallとか二段構成の静的IPマスカレードのほうが怪しくなりますが。

投稿日時 - 2019-01-10 02:56:35

お礼

静的ページはブラウザのキャッシュということはないと思います。
サーバ側で記載変更した結果がWANからでも確認できましたので。

WANからの接続は、au系のsimでの接続で確認しています。
proxyやvpnは使用していないですが、何か関係ありそうでしょうか。

なお、.cgiでもCGIファイルを作成してみましたが、
LANからは参照可能、WANからは参照不可は変わらずでした。

投稿日時 - 2019-01-11 12:52:55

ANo.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なのかで
問題が切り分けできそうですが…

投稿日時 - 2019-01-09 18:44:35

お礼

テスト用にHello WorldなCGIを置いてみましたが、
やはりLANからは参照可能、WANからは参照不可でした。
CGIの内容は以下の通りです。

test.py
-------------------
#!/usr/bin/python
# -*- coding: utf-8 -*-

if __name__ == '__main__':
print "hello world";
--------------

投稿日時 - 2019-01-10 01:14:39

ANo.5

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

投稿日時 - 2019-01-09 12:32:46

お礼

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

投稿日時 - 2019-01-10 01:26:31

ANo.4

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

投稿日時 - 2019-01-09 12:08:59

お礼

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

投稿日時 - 2019-01-10 01:23:22

ANo.3

#1です
lighttpd.conf に deny または allow を含む設定があったらその前後3行程度みてみたいです

もしそんな設定があったらそこだけコメントアウトして再起動してみたらどうなりますか?

投稿日時 - 2019-01-08 11:20:20

補足

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"

投稿日時 - 2019-01-08 21:17:40

ANo.2

>何か原因に心当たりがありましたら教えてください。
ルーターの設定の問題を再確認するため下記の接続でアクセスしてみることをお薦めします。
PC1───────┬─KDDIルーター───インターネト────PC3
     自前ルーター
Webサーバー─┤
PC2───────┘
PC2からは正常な応答があると言うことですよね?
PC3からは応答なしですよね?
PC1からはテストしたでしょうか?
PC2以外は応答なしであればpythonのコードに問題があるかも知れません。
尚、PC1、PC2、PC3は全てpythonのコード作成に使っていないものを使います。1台のPCを繋ぎ変えてPC1、PC2、PC3の役割にすることは差し支えありません。
具体的には挙動を見ながらトライ&エラーの繰り返しで原因を追究しないと分かりません。
WebサーバーをPC1のネットワークへ接続する方法がお勧めです。

投稿日時 - 2019-01-08 08:50:25

お礼

ご連絡遅くなりました。
確認したところ、PC1からもCGIの参照ができました。
ということはKDDIのルータの設定が怪しいということですね。
が、KDDIのルータは一部ポートを除き、全ポートを自前ルータにフォワードする設定になっています。
一部ポートというのもデフォルトで廃棄設定になっているもので、
今回のCGIでの公開ポートではありません。

次に疑うべきは何でしょうか??

投稿日時 - 2019-01-09 11:16:36

ANo.1

CGIフォルダに静的ページを置いてアクセスしてみたらどうなります?

投稿日時 - 2019-01-07 20:32:41

お礼

回答ありがとうございます。
cgiはフォルダで分けておらず、拡張子の指定のみですので、
静的ページはLANからもWANからも参照可能です。

投稿日時 - 2019-01-08 01:07:10

あなたにオススメの質問