EdgeRouter XをOpenVPNサーバーにする

EdgeRouterXを入手しました。
VPNを設定します。
L2TP/IPsecでもいいんですが、他のプラットフォームでも使ってるのでOpenVPNにしたい。

ubntにサイトにはsite-to-siteとかER-X同士のserver-clientしか書いてなかったが、
考えてみればserver-clientのclient側は他の端末でも良いはず。

…と作業して1回目は「繋がるのに通信できない」状態で諦め。
改めて作業したらあっさりつながった。

ER-Xはeth0からPPPoEでWANへ。
eth1~eth4は内部的にswitch0に接続、switch0はproxyarpをonに。

LANは192.168.64.0/24、OpenVPN側を192.168.65.0/24にする内容で


# sshでER-Xにログイン
sudo su
cd /usr/lib/ssl/misc
# CA作成
./CA.sh -newca

# server用の鍵作成
./CA.sh -newreq
./CA.sh -sign

cp demoCA/cacert.pem demoCA/private/cakey.pem /config/auth/
mv newcert.pem /config/auth/server.pem
mv newkey.pem /config/auth/server.key
openssl rsa -in /config/auth/server.key -out /config/auth/server-nopass.key

openssl dhparam -out /config/auth/dhp.pem -2 1024

# client用の鍵作成。hostnameがserverや他のclientとかぶらないようにする
./CA.sh -newreq
./CA.sh -sign
mv newcert.pem client1.pem
mv newkey.pem client1.key
openssl rsa -in client1.key -out client1-nopass.key
# ↑クライアント2つ目以降はここを繰り返し

# clientに client1(-nopass).key,client1.pem,cacert.pem をコピー

# EdgeRouterXの設定
----
configure

edit interfaces openvpn vtun0
set mode server
set server subnet 192.168.65.0/24
set tls ca-cert-file /config/auth/cacert.pem
set tls cert-file /config/auth/server.pem
set tls key-file /config/auth/server-nopass.key
set tls dh-file /config/auth/dhp.pem

# ルーティング情報のpush
set server push-route 192.168.64.0/24

# 下記は無くても繋がるけどいつも入れてる
## openvpn-optionをダブルクオートで囲んだり
## --comp-lzoみたいにハイフン付けたりするのは何か違いがあるのか?(調べなきゃ)
set openvpn-option comp-lzo
set openvpn-option persist-key
set openvpn-option persist-tun
# LAN側のDNSをpushする
set server name-server 192.168.31.240

# OpenVPN向けのFirewall設定
top

edit firewall name WAN_LOCAL rule 1
set description OpenVPN
set action accept
set destination port 1194
set log disable
set protocol udp

# 保存
commit
save
exit
----

# clientにovpnファイルを作る
----
client
dev tun
proto udp
remote erx.example.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
verb 3
ca cacert.pem
cert client1.pem
key client1-nopass.key
----

これでとりあえず繋がった。
ta.keyとかtls-cipherの設定を追加してより強固にしたいが、また後日。

更新しなくなったWordPressサイトを静的にしておく

WordPressはPHPで動的にサイトを出してます。
当然サーバーのCPUパワーを食うので、更新しなくなったサイトは静的に変換して置いておきたい。
StaticPress等のプラグインを入れて出力させるのが常套手段なのですが、現段階の最新版Wordpress4.7.2に入れたらエラーが出たりして(使っているテーマ、環境にもよると思います)。

ならば無理矢理クロールして取ってしまえ!ということでwget
$ wget -nc -x -r http://example.com

出来上がったファイルは拡張子がhtmlじゃないものも多いので、
設置先サーバーのほうでMIME-typeをいじります。

今回はnginx上に置いたので

server {
    server_name example.com;
    location / {
        default_type text/html;
    }
}


これだけ。
たぶんApacheでもDefaultType text/htmlとか書いておけば拡張子ナシでもhtmlとして出してくれるでしょう(未確認)

あとはアクセスしてみて、微妙にリンク先が無かったりするものは個別に手直し。
Wordpressに限らず動的サイトを静的にするのに使えるなぁ。

CentOS+Postfix環境でDKIM導入

CentOS5, CentOS6でpostfix使ってるところにDKIMを入れたのでメモ。

EPELを有効にしてyum -y install opendkimで入る。あっさり。

PostfixをDKIM認証に対応(CentOS) – Angel21 HP Blog
人様のblogを頼りに一通り設定する。
# mkdir /etc/opendkim/keys/example.com
# opendkim-genkey -D /etc/opendkim/keys/example.com -d example.com -s 20170208
# chown opendkim:opendkim /etc/opendkim/keys/example.com/*

namedへTXTレコード追加
20170208._domainkey IN TXT "v=DKIM1; k=rsa; p=Mf(略)B"
_adsp._domainkey IN TXT "dkim=unknown"
_dmarc IN TXT "v=DMARC1;p=none;rua=mailto:dmarc@example.com;ruf=mailto:dmarc@example.com;rf=afrf;pct=100"

/etc/opendkim.conf
Mode sv
#KeyFile
KeyTable
SigningTable
ExternalIgnoreList
InternalHosts

秘密鍵指定
/etc/opendkim/KeyTable
20170208._domainkey.example.com example.com:default:/etc/opendkim/keys/example.com/20170208.private
ドメイン指定
/etc/opendkim/SigningTable
*@example.com 20170208._domainkey.example.com

追加でポイント

●namedで _ アンダースコアが使えない
named-checkzoneしてみると bad owner と言われてアンダースコアから始まる名前が使えない。
_dmarcを書くときに困るので、対象ゾーンにcheck-names ignoe;を追記して通るようにする。
zone "example.com" IN {
type master;
file "example.com.hosts";
check-names ignore;
};

●opendkimの鍵ファイルがセキュアじゃないと言われる
実際に送信してみるとエラーで送れてない。
maillogを見ると
key data is not secure: opendkim is in group 0 which has multiple users (e.g., "sync")
とエラーが出てる。にしてもgroup 0ってなぁ…

ググっても日本語資料皆無なので英語フォーラム見たら、軒並み回答なし。
しかしヒントっぽいのがあったので

opendkim.conf

/etc/opendkim.confの末尾に RequireSafeKeys false を追加。これで動いた。

WordPressサイトの全SSL化…一部リンクがSSLにならない

とあるwordpressを使ってるサイトを常時SSL化することになりました。
VPSだったのでSSL証明書の取得からインストールまでLet’s Encryptですんなり行きました。

Let’s Encrypt 総合ポータル

次にWordpressの設定でホームURLを http から https に変更します。
そして全文検索してhttpのリンクをhttpsにします。
このへんはSearch and Replace for WordPress Database Scriptを使用。

WordPress移行時にURLをSQLで直接一括置換はダメ! 「Search and Replace for WordPress Databases Script」を使おう | infoScoop開発者ブログ

あとはテーマのファイルをgrepしてhttp箇所を //からの表記に直したり…

しかしメニューのリンクとか一部プラグインの出力がSSLにならない。
ソースを見るとget_page_link()とかで呼んでるわけです。
じゃぁ中身の設定に従うはずだよなぁ…と wp-includes/link-templates.php を読み、
データベースを疑い…わからん。

しかし結局Really Simple SSLというプラグインを入れたらあっさり解決。
なんだ、どこにこの違いがあったのだ…

WordPressを一瞬でHTTPS化するプラグイン「Really Simple SSL」の使い方

今後常時SSLサイトが増えるだろうし、もうちょっと根本的に原因を探りたいのだがなぁ

さくらのVPSの制限は2時間解けない

制限は突然来る。

サーバーの応答がないとヘルプをいただき(私の管理してるところじゃないんだけど…)
とりあえず見てみる。
webサーバー応答無し、ssh応答なくてログインできない、pingは通る。

さくらのVPSのコントロールパネルを見てみると
「このサーバはストレージのIOPS(1秒あたりのデータ入出力数)が制限されています。」
ですって。

朝9時直前ぐらいに制限がかかったようで、
コンソールを見るとOOM Killerの嵐。
おそらくswapファイルに大量のI/Oが発生していたのでしょう。

サポートに問い合わせると、制限は2時間だそうで、
「こちらでも解除はできないので、2時間待ってください」とのこと。

2時間も待ってられないので、とりあえず根気よくコンソールからログインを試行、
何度かチャレンジして成功したので、httpdとmysqldを停止。
みるみると負荷が下がっていくぞ…!

apacheのkeepalive timeoutが若干長いかなーというぐらいで他は特に気にならず。
プロセス数とかは追って調整するとして、再起動。
無事、動く。

wgetで巡回させても負荷がそんなに増えなかったのでこれで良しということにして完了。

サポートに言っても解除できないというのは覚えて置いた方が良いなー。

さくらのVPSは突然制限かけられて激重になるから要注意 | GUiLZ.ORG

「さくらのVPS」のディスク負荷が早朝4~6時に高い件。iowaitが酷いレベルに | TeraDas-テラダス