自ドメインの DNSSEC 対応を終了

昨年の春前具合から自ドメインを DNSSEC 対応にしてきたのだけれど、もうやめます。

理由は、管理が手間過ぎるから。ZSK の運用も含めてスクリプトで自動化していたので、ずっと運用する分には問題はないのだけれど、いざ手動で何かを行う際にゾーン署名に用いている ZSK がどれなのか、自動化ゆえに余計にわけが分からなくなって管理がめんどい。

どうせ、DNSSEC の検証をしているフルリゾルバもあまりないような気もするし、それならやめちゃおう。

RTX810 で SNMP Trap を送信し、Linux マシンで受ける

SNMP Trap を送信するルータは、YAMAHA RTX810 、受信するマシンの OS は Debian 10 。受信したトラップを root あてにメールする。

RTX810 の設定

snmp trap host [SNMP トラップを受けるサーバの IPv4 アドレス]
snmp trap community router
snmp trap enable snmp all

Debian 10 側の設定

  • snmptrapd をインストール

    # apt-get install snmp snmptrapd nmp-mibs-downloader
  • YAMAHA private MIB をダウンロード

    YAMAHA private MIB のページより、yamaha-private-mib.tar.gz をダウンロードし、アーカイブ中のファイルを /usr/local/share/snmp/mibs/yamaha 以下に保存する。

  • snmp の設定

    /etc/snmp/snmp.conf
    #mibs :
    mibdirs +/usr/local/share/snmp/mibs/yamaha
    mibs +ALL

    ※ mibs : をコメントアウトし、mibsdirs と mibs を設定する。

  • snmptrapd の設定

    /etc/snmp/snmptrapd.conf
    authCommunity log,execute router
    traphandle default /usr/bin/traptoemail -f snmp@example.com -s 127.0.0.1 root

    ※ snmp trap のコミュニティ名はルータと snmptrapd.conf で同じものとする。

  • snmptrapd を起動

    # systemctl start snmptrapd.service
  • 起動時に snmptrapd を有効とする

    # systemctl enable snmptrapd.service
  • ルータからの UDP 162 を通過するようにしておく

Debian 9 の Apache2.4 で TLSv1.3 を利用する

TLSv1, TLSv1.1 が 2020 年にもメジャーなブラウザで無効化されると言う話題が出ていました。

Deiban 9 の Apache 2.4 は、TLSv1.2 に対応しているので特に影響はありませんが、どうせという事で TLSv1.3 に対応をしてみました。

続きを読む

eo 光ネットの IPv6 接続を専用ルータ無しに利用する

eo 光ネットの「IPv6インターネット接続の標準提供開始のお知らせ」の通り、2018/08/30 より、PPPoE による IPv6 接続サービスが実施されています。

専用ルーターが必要との表記はありますが、市販されていた手持ちの YAMAHA RTX810 で IPv6 接続できたので、設定方法を備忘録代わりに記載します。

なお、当然ながら、非公式であり、完全に自己責任での内容となりますので、ご注意下さい。また、ルーターのログを見ている限り、プロバイダ側での着信方向フィルタリングは存在しないようですので、ルーター側の設定を間違えると、うっかり自 LAN 内の端末がグローバルからアクセス可能となることもあり得ます。十分注意が必要です。

前提としては、eo 光ネットに IPv4 での PPPoE 接続設定が LAN2 を利用して PP 1 として出来ている状態です。
VLAN を切っているため、IPv6 が当たるインタフェースは vlan3 にしていますが、適宜読み替えて下さい。

以下、追加するコマンドです。

pp select 1 
 ppp ipv6cp use on
 ipv6 pp rip send off
 ipv6 pp secure filter in 300011 300012 300013 300014 300015 300016 310011 310012 310013 319998 319999
 ipv6 pp secure filter out 300011 300012 300013 300014 300015 300016 329998 329999 dynamic 320011 320012 320013 320014 320015 329998 329999
 ipv6 pp dhcp service client
pp enable 1
ipv6 filter 300011 reject-nolog * * udp,tcp 135 *
ipv6 filter 300012 reject-nolog * * udp,tcp * 135
ipv6 filter 300013 reject-nolog * * udp,tcp netbios_ns-netbios_ssn *
ipv6 filter 300014 reject-nolog * * udp,tcp * netbios_ns-netbios_ssn
ipv6 filter 300015 reject-nolog * * udp,tcp 445 *
ipv6 filter 300016 reject-nolog * * udp,tcp * 445
ipv6 filter 310011 pass * * icmp6
ipv6 filter 310012 pass fe80::/10 * udp 546 547
ipv6 filter 310013 pass fe80::/10 * udp 547 546
ipv6 filter 319998 pass * * established
ipv6 filter 319999 reject-nolog * * * * *
ipv6 filter 329998 pass * * * * *
ipv6 filter 329999 reject-nolog * * * * *
ipv6 filter dynamic 320011 * * ftp
ipv6 filter dynamic 320012 * * domain
ipv6 filter dynamic 320013 * * www
ipv6 filter dynamic 320014 * * smtp
ipv6 filter dynamic 320015 * * pop3
ipv6 filter dynamic 329998 * * tcp
ipv6 filter dynamic 329999 * * udp
ipv6 prefix 3 dhcp-prefix@pp1::/64
ipv6 vlan3 address dhcp-prefix@pp1::1/64
ipv6 vlan3 dhcp service server
ipv6 vlan3 rtadv send 3 o_flag=on
ipv6 route default gateway pp 1

と言うわけで、専用ルータでなくとも、YAMAHA のルータでも IPv6 で接続できました。

なお、うちのルータですが、vlan1 に既に固定 IPv6 アドレスが当たっているので、恒常的には設定していません。
IPv6 でも、フィルタ型ルーティングの様なことが出来れば良いのですけれど。

・追記

IPv6 での外へのアクセスを eo 光の IPv6 にしてみました。IPv6 はインタフェースに複数の IPv6 アドレスを付けられるので、この部分は凄く便利ですね。

Let’s Encrypt でワイルドカード 証明書を得る (nsd4 利用)

Let’s Encrypt でワイルドカード証明書を得るためには DNS-01 で認証を得る必要があります。

nsd4 と dehydrated の組み合わせで一応出来たので、備忘録として記載します。なお、マスターサーバ上で実装、bind9 付属の named-checkzone を利用しているので注意して下さい。

・/etc/nsd/zones/example.com (ゾーンファイルの修正)

nsd4 では、動的にゾーンのレコードを追加したり削除したり出来ないので、実際のゾーンファイルを直接書き換えます。

関係ないところを書き換えないためにも、シリアル値を「;SERIAL_START」から「;SERIAL_END」の範囲で、DNS-01 で使う「_acme-challenge」については「;LE_DNS-01_START」から「;LE_DNS-01_END」の範囲でくくります。

$TTL 86400
example.com.		IN	SOA	ns.example.com. root.ns.example.com. (
;SERIAL_START
				2018051301	; Serial
;SERIAL_END
				86400		; Refresh 24 Hours
				7200		; Retry 2 Hours
				1209600		; Expire 2 Weeks
				7200		; Negative cache TTL 2 Hours
			)

					IN	NS	ns.example.com.

;LE_DNS-01_START
;_acme-challenge.example.com.	60	IN	TXT	"NOTHING"
;LE_DNS-01_END

NS					IN	A	192.168.1.1

・hook.sh

dehydrated 同梱の hook スクリプトを以下の様にします。

#!/usr/bin/env bash

deploy_challenge() {
    local DOMAIN="${1}" TOKEN_FILENAME="${2}" TOKEN_VALUE="${3}"
    local REGEXDOMAINNAME=`echo ${DOMAIN} | sed -e 's/\./\\\./'`
    local NOWUMASK="`umask`"
    local serial1=`named-checkzone "${DOMAIN}" "/etc/nsd/zones/${DOMAIN}" | awk '/serial/ {print $5}'`
    local serial2=`expr $serial1 + 1`
    
    umask 022
    
    sed -i -e "/;SERIAL_START/,/;SERIAL_END/ s/$serial1/$serial2/" "/etc/nsd/zones/${DOMAIN}"
    sed -i -e "/;LE_DNS-01_START/,/;LE_DNS-01_END/ s/^;_acme-challenge\.${REGEXDOMAINNAME}\..*/_acme-challenge.${DOMAIN}.\t60\tIN\tTXT\t\"${TOKENVALUE}\"/" /etc/nsd/zones/${DOMAIN}
    nsd-control reload
    
    sleep 5
    
    umask ${NOWUMASK}
}

clean_challenge() {
    local DOMAIN="${1}" TOKEN_FILENAME="${2}" TOKEN_VALUE="${3}"
    local REGEXDOMAINNAME=`echo ${DOMAIN} | sed -e 's/\./\\\./'`
    local NOWUMASK="`umask`"
    local serial1=`named-checkzone "${DOMAIN}" "/etc/nsd/zones/${DOMAIN}" | awk '/serial/ {print $5}'`
    local serial2=`expr $serial1 + 1`
    
    umask 022
    
    sed -i -e "/;SERIAL_START/,/;SERIAL_END/ s/$serial1/$serial2/" "/etc/nsd/zones/${DOMAIN}"
    sed -i -e "/;LE_DNS-01_START/,/;LE_DNS-01_END/ s/^_acme-challenge\.${REGEXDOMAINNAME}\..*/;_acme-challenge.${DOMAIN}.\t60\tIN\tTXT\t\"NOTHING\"/" /etc/nsd/zones/${DOMAIN}
    nsd-control reload
    
    sleep 5
    
    umask ${NOWUMASK}
}

deploy_cert() {
}
deploy_ocsp() {
}
unchanged_cert() {
}
invalid_challenge() {
}
request_failure() {
}
generate_csr() {
}
startup_hook() {
}
exit_hook() {
}

HANDLER="$1"; shift
if [[ "${HANDLER}" =~ ^(deploy_challenge|clean_challenge|deploy_cert|deploy_ocsp|unchanged_cert|invalid_challenge|request_failure|generate_csr|startup_hook|exit_hook)$ ]]; then
  "$HANDLER" "$@"
fi

dehydrated の config ファイルの修正

DNS-01 と hook.sh を使う様に指定します。その他は適切に設定して下さい。

CHALLENGETYPE="dns-01"
HOOK=./hook.sh

dehydrated の domains.txt ファイルの修正

以下の様な書式で記載します。

*.example.com > wildcard.exaple.com

証明書発行

後は、いつもどおり証明書を要求すると、DNS-01 で認証され、発行されます。

その他

domains.txt で「example.com *.example.com」の様にすると、example.com に 2 回 DNS-01 認証が発生し、上手くいきませんでした。

OpenVPN で VPN トンネル内に IPv6 を通す

とりあえず、Debian GNU/Linux 9 において、OpenVPN の VPN トンネル中で IPv6 を通すメモです。

基本的に「OpenVPN 設定メモ (Debian 7 Wheezy)」の項目が設定できていて (Debian 9 でもおおよそ同じです) 、サーバ側にはグローバル IPv6 が当たっていて、適切なフィルタリングが出来ているものと想定します。

■前提

  • VPN の内側で使用するネットワークは、ユニークローカルアドレス、「fd00:abcd:abcd:abcd::/64」、サーバの VPN 側 IPv6 は「fd00:abcd:abcd:abcd::1」を使うことにする。
  • 上記のメモの内容が Debian GNU/Linux 9 の OpenVPN パッケージで構築済みである。
  • 設定するサーバには IPv6 の接続性がある。

■設定

/etc/openvpn/server.conf に以下を追記します。

server-ipv6 fd00:abcd:abcd:abcd::1/64
push "route-ipv6 fd00:abcd:abcd:abcd::/64"
push "route-ipv6 2000::/3"
push "dhcp-option DNS DNSサーバのIPv6アドレス" # オプション

ip6tables で以下の様なルールを設定します。(設定内容はこのままコピペじゃなくて、実際の環境に合わせて下さい。)

ip6tables -A INPUT -i tun0 -s fd00:abcd:abcd:abcd::/64 -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A OUTPUT -o tun0 -d fd00:abcd:abcd:abcd::/64 -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A FORWARD -i tun0 -o ens3 -s fd00:abcd:abcd:abcd::/64 -d ::/0 -j ACCEPT
ip6tables -A FORWARD -i ens3 -o tun0 -s ::/0 -d fd00:abcd:abcd:abcd::/64 -j ACCEPT -m state --state ESTABLISHED,RELATED
ip6tables -t nat -A POSTROUTING -o ens3 -s fd00:abcd:abcd:abcd::/64 -d ::/0 -j MASQUERADE
ip6tables -A FORWARD -j DROP

上記を設定後、openvpn サーバを再起動させて、iPhone などのクライアントから OpenVPN で接続すると、VPN 側で IPv4 アドレスの他、IPv6 アドレスも付与されます。

■課題

当然ながら、IPv6 アドレスオンリーのサイトにも繋がるはずですが、なぜか一部画像が表示されなかったりという現象を確認しています。mtu の問題なのかなぁ、と思っているのですが、「OpenVPN Connect iOS FAQ」によれば、iOS の OpenVPN クライアントでは fragment パラメータを設定しているサーバには接続できないらしく、どうしたものかと考え中です。

本サーバの OS アップデート

本サイトのサーバ OS をアップデートしました。これにより、以下の変更が発生しています。

  • HTTP/2 に対応しました。
  • SNI の設定を変更したので、HTTPS 経由で SNI 非対応のブラウザ (例えば Windows XP の Internet Explorer) からは本サイトが表示できなくなりました。
    ※ここ数年ぐらいの環境であれば影響しないはず。

なお、VPS は引き続き ConoHa を利用していますが、HDD の旧プランから SSD の新プランに移行しています。下にも書いているけれど、SSD のおかげか、はたまた fcgid に変更したからか、体感レベルでパフォーマンスは上がっています。

続きを読む

nsd4 と nsd3 でマスター、スレーブサーバを設定した備忘録

以下のような環境で設定した備忘録である。なお、IP アドレスは例である。

■環境

・マスター (Debian GNU/Linux Stretch) / nsd4

IPv4 アドレス: 192.0.2.1
IPv6 アドレス: 2001:0DB8::1

・スレーブ (Debian GNU/Linux Wheezy) / nsd3

IPv4 アドレス: 192.0.2.2
IPv6 アドレス: 2001:0DB8::2

続きを読む