メモ Edit

VPNできないときの対応 Edit

5555で接続する。

VPN Edit

ホテルのWiFiなどは非常に遅いことがよくある。そういう場合,Windowsやスマホの標準的なVPN (L2TP/IPsec)では接続できないことがよくある。クライアント側のエラーメッセージからは,遅いためなのか,FWで遮断されているからなのかは分からない。ただ,こういう場合でも,Softetherの標準プロトコルは耐性が高いようだ。

SoftEther Edit

サーバー側のfirewallに穴を空けて設置した方が無難だ。SoftEtherは穴なしでも運用できる強力な透過性が一つのウリだが(NATトラバーサル機能),意外と接続できない場所もありそうだ。例えばANAの羽田空港ラウンジ(国際線)のWiFiからは,穴を空けてないサーバーには接続できなかった(言い換えると、VPN over UDP with NAT-Tだと不可。2017年8月)。また,iOSやAndroidから接続するにも穴を空ける必要がある(L2TP/IPsecになるから)。とりわけ中国から接続する(後述)には穴を空けておいた方が確実だろう。もともとNATトラバーサル機能はFWに穴を空けられない事情がある場合にこそ本領を発揮する。自分が管理するVPSなら穴を空けるのは特に問題ないだろう。

  • 他にNAT Traversalで外部のSoftEther VPNサーバーに接続できなかった場所: ANA羽田国内線ラウンジ(2017年 8月),ANA伊丹ラウンジ(2017年 8月)、wework丸の内(2018年 7月)。
  • NAT Traversalで接続時にSoftetherクライアントから出る警告。
    NAT Traversal 接続 - 安定性低下の可能性があります
    VPN Client は VPN Server '...' に NAT トラバーサル (UDP ホールパンチング) モードで接続しました。
    NAT トラバーサルによって、VPN Client は NAT やファイアウォールの背後にある VPN Server に、それらの NAT やファイアウォールでのポートフォワーディングの設定を行うことなく接続することができます。
    しかし、NAT トラバーサルは UDP をベースとした通信を使用するため、VPN セッションが不安定になる原因となる場合があります。たとえば、安価な NAT ルータが VPN Server と VPN Client との間に存在する場合、NAT トラバーサル上の VPN トンネルは 5 分ごとに切断される場合があります。また、安価な ISP が大規模な NAT を使用している場合にも NAT トラバーサルは不安定になります。これはルータや ISP の品質の問題であり、SoftEther VPN の問題ではありません。
    これを解決するためには、NAT トラバーサルを使用するのではなく、直接 TCP/IP によって VPN Server のリスナーポートに VPN Client が接続することができるようにします。そのためには、VPN Server のリスナーポートがインターネットに対して公開されるように、NAT におけるポートフォワーディング設定を行ってください。NAT におけるポートフォワーディング設定の方法は、NAT の管理者に問い合わせるか、NAT 製品の説明書をお読みください。
    VPN Server が TCP ポートをインターネットに対して公開しているにも関わらずこのメッセージが表示される場合は、VPN Client の接続設定画面で「NAT-T 無効」をチェックしてください。

中国 Edit

中国政府はVPNブロックを2018年2月1日から有効にする(中国政府、通信事業者にVPNの利用禁止を要求 | TechCrunch Japan2017年7月11日)と報じられているので,中国に行く前に5555を空けておいた方が無難だ。FWに穴を空けてないと,クライアントはSoftEther本体の管理サーバーにまず接続するのだと思うが,これが遮断される可能性が非常に高く,NATトラバーサル機能が機能しなくなるのではないか。また,992は「プロキシサーバーは通過できない場合が多い」(3.3 VPN Server 管理 - SoftEther VPN プロジェクト)。443を使うには自分のhttpsをあきらめる必要がある。

なお,接続先の個別の設定でNAT-Tを無効にできる。

中国でVPNが塞がれた場合に特に考える必要があるのは、スマホはSoftether標準プロトコルでは接続できないこと。一番簡単な対抗策はSoftEtherサーバーにOpenVPNクライアントで接続することかな。これならiOSアプリやAndroidアプリもある。ただしOpenVPNは著名なのでこれも塞がれる可能性が高そう。

他には,WiFiルーターを使うか,Windows10をWiFiルーター代わり(モバイルホットスポット)にする手もある。なお,モバイルホットスポット機能を使う場合,iPhone(子)は親の環境(親でVPN中)を完全には引き継がない。詳細はPC/Windows

ホスト名 Edit

自分で決めたホスト名で接続できる(ダイナミック DNS)。一つ注意すべきことは,一度確保した名前を別のマシンで継続使用する(サーバーの移転やSoftEtherの再インストールなどに伴い)には「ダイナミック DNS 秘密鍵」を事前にメモしておく必要がある。

  • この秘密鍵は、現在使用している DDNS 名と対応付けられています。現在 VPN Server として使用している PC が破損するなどして、この秘密鍵が失われると、その時設定されていた DDNS 名は占有されたままの状態となり、他の VPN Serverで使用できなくなります。同じ名前を継続して使用したい場合は、秘密鍵を他の PC やインタネット上のストレージ、メモ用紙などに保管しておいてください。
    秘密鍵を新しい VPN Server に設定する際は、VPN Server の設定ファイルを編集します。"declare DDnsClient" ディレクティブ中にある "byte Key" に続く値を、保管しておいた秘密鍵の文字列で置き換えてください。
    なお、同時に複数の VPN Server で同じ秘密鍵を設定すると正常に動作しなくなりますので注意してください。

Amazon Lightsail Edit

Google Project Fiなど,米国IPがないと利用や申込ができないものがある。一般には公開proxyやVPN Gate 筑波大学による公開 VPN 中継サーバープロジェクトなどを使うのだろうけど,流行廃りがあるので頻繁に使っていない人はどれが最適か(安全で安定的か)分かりにくい。調べるだけ時間の無駄なので,米国のAmazon Lightsailに自前でSoftEtherを立てた。

偶にVPNサーバーに使うだけなら、普段はインスタンスを削除して維持費を低くすることもできる。スナップショットを保持すると課金されるが、インスタンスを維持するよりはかなり安くなる。偶にSoftEtherを使うだけなら、スナップショットなしに毎回ゼロからインスタンスを作っても1時間かからないだろう。

サブドメイン Edit

DNS Edit

  • Q: 「サブドメインはCNAME,Aのいずれで定義すればよのか?」「両者は何が違う?」
    • A: サブドメインは,個人のサーバーのようにIPアドレスがそもそも一つのときはCNAME,Aのいずれでも定義できるし,いずれで定義してもよい。Aで定義とはIPアドレスで定義する意味であり,IPが変わればAで定義した項目を全て直す必要がある。他方,CNAMEはIPではなく名前で定義する意味。当該サブドメイン名は何かの別名という位置づけ。(cnameは本名(Canonical NAME)の意味。)本名または別名のIPが変わっても別名の項目を直す必要はない。「サブドメインはCNAME,Aのいずれで定義すればよのか」,という疑問は,そもそもIPが一つしかない場合に典型的に生じる特殊なものなのだ。

短縮URL Edit

長いURLの代わりに短縮URLを使うとき,意味不明の文字列なので短くしたのになお記憶困難だったり,手打ちするには全然向かなかったりすることがある。リンクをクリックする用法のみ想定すればよいなら,意味不明の文字列でもよいが,それでは済まないこともある。自前サーバーがあればもっとスマートに短縮URLを用意できる。サブドメインとmod_rewriteを使えばよい。サブドメインを使わずにディレクトリで表現してもよいが,どちらがより他人に伝えやすいか,自分が覚えやすいか次第だ。

httpd Edit

異常対応 Edit

  • 現象: PHPスクリプトの中身がブラウザに表示されてしまう。
    • あり得る原因: PHPモジュール(libphp5.so,libphp7.so等)がウェブサーバーにロードされていない。例えばApache httpdとPHPのレポジトリが違うと起きうる。標準的なレポジトリなら自動で設定されるが,そうでないレポジトリを使うと,両者で想定しているディレクトリ構造が違うため齟齬が起き,ロードされない。2018年 4月 1日
  • 現象: Perlでモジュールを追加(cpan)してもCGIの500エラーを解消できない。httpdのエラーログを見ると、入れたはずのモジュールが入っていない。
    • 原因: モジュールがrootにしか入っていない。他のユーザー(apacheを含む)からは見えない。rootの~/.bashrcでperlの環境変数が追加されており,他のユーザーのパスの外にインストールされていた。下記記述を削除して,モジュールを再度インストールする。cpanの初回設定で「local::lib」を(間違って)選ぶとこうなる。CentOS 7.4。2018年 4月 3日
      PATH="/root/perl5/bin${PATH:+:${PA...
      PERL5LIB="/root/perl5/lib/perl5${P...
      PERL_LOCAL_LIB_ROOT="/root/perl5${...
      PERL_MB_OPT="--install_base \"/roo...
      PERL_MM_OPT="INSTALL_BASE=/root/pe...
      
  • CGIが500エラー。ログにはPermission denied。理由がさっぱり分からない。
    • SELinuxをdisabledかpermissiveに変えてみる。これが原因なら再起動も要さず即座に可否が変わる。

仕様 Edit

  • <VirtualHost>内のログ出力が優先される。存在する全ての<VirtualHost>内にログ出力命令があれば,<VirtualHost>外の場所(例えばhttpd.confやssl.confの中)で出力命令を書いても何も出てこない。ログファイル - Apache HTTP サーバ バージョン 2.4
  • さらに、<Virtualhost>内のCustomLog命令が「無条件で」優先される場合に注意。(1) Virtualhost外に、条件なし(一般用途)のCustomLogがあり、(2) Virtualhost内に(1)の部分集合をなす条件付き(特殊用途)のCustomLogがあるとき、意外にも(2)は条件なしで実行され、(1)は全く実行されなかった(Apache 2.2.15)。一般と特殊の関係にあるログを平行して出したいときは、Virtualhost内で両者を書く必要がある。

IPv6 Edit

ウェブをIPv6で公開するのは非常に簡単だった。(自宅からIPv6で外部にアクセスできるようにするという意味ではない。インターネット上に持っているウェブサーバーに、世界中の人がIPv6でアクセスできるようにするという意味。)DNSにAAAAレコードを追加するだけだった。Apache側の設定変更や再起動(reload,restart)すら不要だった。従来からhttpd.confやvhost.confにIPアドレスを書いてなかったからだが、そもそも書いてない個人サーバーの方が多数派では。AAAAレコード追加の数時間後には、いままでのホスト名のままで、IPv6によるアクセスに切り替わった。IPv6であることを特に意識する場面はない。同じ名前で運用しているので、IPv4のみの環境で使っている人から見ても何も変わらない。

ただし、アクセス制御は見直す必要がある。非公開ページがいきなり公開になる痛いミスは、普通は起きないが(普通はOrder Deny,Allow;Deny from allで書いているはず)、逆の、限定公開ページが全て非公開になってしまう(自宅からのみアクセス可能としていたのが、自宅からでもアクセスできなくなる等)のは不可避だ。一つ一つ、限定公開の設定を追加する必要がある。

痛いのはホスト名による

Allow from .ppp.ocn.ne.jp

の類が効かない。IPv6では(いまのところ)逆引きできない。

「自宅のIPアドレス」 Edit

外部から見える自分のIPアドレス(Apahceのログなどに残るもの)は、IPv4(の普通の環境)と違い、個々の端末(自分のパソコン)そのものになるので(パソコン一台一台にグローバルアドレスが割り当てられる)、そこから、「自宅のアドレス」に相当する部分を抜き出す。

Windowsのコマンドプロンプト画面でipconfigを実行し、「一時 IPv6 アドレス」(または「IPv6 アドレス」でも同じ)を見る。:で区切られた区分(フィールドという)を上から4区画分取り出す。末尾に「::/64」を付ける。それが自宅のアドレス表記になる。例えば、「一時 IPv6 アドレス」が

2001:db8:85a3:8d3:1319:8a2e:370:7348

なら、自宅を意味するアドレスは

2001:db8:85a3:8d3::/64

となる。これを

Allow from 2001:db8:85a3:8d3::/64

などの形でApacheに与える。

「一時 IPv6 アドレス」または「IPv6 アドレス」であり、「リンクローカル IPv6 アドレス」ではない。なお、プロバイダーから自宅に対して/64で来るプロバイダーもあれば、HGWまで/56で来る(そしてLAN側が/64になる)プロバイダーもあるようだ。いずれにせよ、IPv4が固定でないのと同じく、/64が固定であることも保証されないだろう。

なお、IPv4なら、外部から見えるアドレスは自宅のルーターの「WAN側」アドレスだったが、IPv6では「LAN側」のアドレスになる。これは上に書いたことと同義だが、IPv4との大きな変化であり新鮮だ。

  • ルーター画面の例(数値は架空)
    LAN側
    IPアドレス/ネットマスク192.168.0.1/24
    IPv6アドレス/プレフィックス長(グローバル)2001:db8:85a3:8d3:1319:8a2e:370:7348/64 (これが自宅ルーターのグローバルアドレス)
    IPv6アドレス/プレフィックス長(リンクローカル)ユーザーには不要。無視。
    WAN側
    IPアドレス/ネットマスク1.75.230.44 (IPv4の、外部から見えるグローバルアドレス)
    IPv6アドレス/プレフィックス長(リンクローカル)ユーザーには不要。無視。

Require hostがエラーを吐く Edit

2.4からの書式Requireを使いホスト名を指定すると、IPv6のアクセスに際して次のエラーが出ることがある。

AH01753: access check of '....ne.jp' to /.../index.php failed, reason: unable to get the remote host name

自宅のホスト名(b1111.oskea120.ap.so-net.ne.jpの類)を書くと、おそらくほぼ全てのケースで出る。この種のホスト名はIPv6のホスト名がなく(AAAAレコードが空)、IPv6で正引きすらできない。(このホスト名はプロバイダーが自動設定したもので、IPv4では多くの場合、逆引きも可能。)

とりあえず2.2書式を使うことは出来るが、非推奨だ。いつ廃止されてもおかしくない。2.4なら、2.4から使える<If >ディレクティブを使えば当面対処できる。

<If "%{REMOTE_ADDR} =~ /\./">
あるいは
<If "%{IPV6} != 'on'">
あるいは
<If "! -T %{IPV6}">

	Require host b1111.oskea120.ap.so-net.ne.jp
</If>

なぜIPv4? Edit

  • 「APNICは、これらの理由から「IPv6の普及を促進しているもの」を明確に断言することはできないとしており、逆にIPv6の普及スピードが鈍化している理由もよくわからないと結論づけています。」IPv6はなぜ普及しないのか? - GIGAZINE(2018年05月28日)

アクセスログのビューワー Edit

アクセスログを分析するツールは色々あるが、単に直近のログを、時系列のまま、可読性を高めた形でさっと目を通したいだけの方が多い。URLエンコードを解除したり、(逆引きしていないのであれば)逆引きしたり、表示項目は数項目だけにして、ブラウザでテーブルの形式で見る簡単なビューワー。CGI。

apachelogviwer.jpg

メモ Edit

  • ドット一つのホスト名。初めて気づいた。偶にあることなのかもしれないし、そうではないかもしれない。ログのホスト名(%h)に「.」一文字の記録があった。逆引きした結果.になったのだろうか?これが環境変数REMOTE_HOSTにもなる。

    . - - [07/May/2018:02:02:22 +0900] "GET /admin/index.php HTTP/1.1" 404 213 "-" "Python-urllib/3.4"

  • google-proxy-66-xx-xx-xx.google.comやrate-limited-proxy-72-xx-xx-xx.google.comは何?という質問を偶に目にする。Android版Chromeのproxyアクセスという回答が基本的に正しいようだが、他に、Google Search Consoleも同じものを使うようだ。これはモバイルで見た場合にどう見えるかなどを調べているので、user-agentにbotという語は入らない。2018年 4月11日

mod_rewrite Edit

.htaccessで Edit

例えば、http://hoge.com/work/におけるworkディレクトリ内の.htaccessで設定する場合、

RewriteRule ^/work/ /work2/
や
RewriteRule ^/work/(.*)$ /work2/$1

はworkしない。(.*の有無は関係ない。上記のような記述は、rewriteの最も基本的な用例として普通紹介されているが、それがworkしない。)次が正しい。

RewriteRule .* /work2/
や
RewriteRule ^(.*)$ /work2/$1
  • ディレクトリ内の.htaccessに書いた場合、Patternは「/」から始まらない。さらに、そのディレクトリ名を含まない。Cf. "In per-directory context (Directory and .htaccess), the Pattern is matched against only a partial path, for example a request of "/app1/index.html" may result in comparison against "app1/index.html" or "index.html" depending on where the RewriteRule is defined." mod_rewrite - Apache HTTP Server Version 2.4

Apache 2.4 Edit

  • Apacheウェブサーバー2.2のサポート期間が終了したので,2.4に更新した。当初,最新版(まだレポジトリにはない)をソースから入れたが,PHPのパッケージ(remi)とライブラリの互換性を取れなかった。(なお,ソースからRPMを作るのは結構時間がかかったが,手間だけの問題だし,次回から手数は減るはず。それでも自動化できないのは痛い。)Apacheの最新はあきらめて,IUSレポジトリを使うことにした。2018年 4月 1日
    php70-php-7.0.29-1.el6.remi.x86_64 (remi-safe)
                 要求: httpd-mmn = 20051115
                インストール: httpd-2.4.33-1.x86_64 (@/httpd-2.4.33-1.x86_64)
                    httpd-mmn = 20120211
    

PHP Edit

  • PHP 5.xでしか動かないアプリを使い続けたいことがある。複数のPHPバージョンを一つのApacheで同居させるのは予想以上に簡単だった。(エンジニアはかなり昔から開発環境の便宜のため実行してきたそうだ。)今回,PHP 7.0を主として使っている環境で,一部のディレクトリのみPHP 5.6でスクリプトを実行させることがかなり簡単にできた。どちらのバージョンを使うかはディレクトリ単位で.htaccessの設定のみで指示できるので非常に簡便だ。2018年 4月 3日
  • PHP 5.6のサポート期間の終了が近づいている(2019年1月)ので,更新した。2018年 4月 1日

自宅サーバーの新たな効用 Edit

NET/自宅LAN/VPN

メモ Edit

  • CentOS 6.9を使ってきたが,7.4に変更した。6のままApache 2.4を使うより全体を更新した方が齟齬が少ないだろうという判断。実際、あとで気付いたのだが、CentOS 6.9ではiusレポジトリのApache 2.4とremiのPHP70は共存しなかった。(PHP56も駄目だった。)2018年 4月 1日
  • CentOS 6だと、現行のChromeブラウザをインストールできないようだ。CentOSをデスクトップとして使うことはないが、headless Chromeを使うことが出来ないのは痛い。

添付ファイル: fileapachelogviwer.jpg [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-05-21 (月) 15:01:47 (127d)