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

続きを読む

postfix で RBL を利用する場合

Postfix で RBL を使用する場合、単純に「smtpd_recipient_restrictions」内のしかるべき場所に「reject_rbl_client」で指定してあげたら良いだけです。

ただ、改めてドキュメントを見ていると、返答された A レコードの内容によって通したり通さなかったり出来る模様でした。

smtpd_recipient_restrictions =
	permit_mynetworks,
	permit_sasl_authenticated,
	reject_unauth_destination,
	reject_rbl_client all.rbl.jp,
	reject_rbl_client bl.spamcop.net,
	reject_rbl_client zen.spamhaus.org=127.0.0.[2;3;4;5;6;7;10;11]

こんな感じで書いた場合、

  • all.rbl.jp および bl.spamcop.net で接続元 IPv4 (aaa.bbb.ccc.ddd だと ddd.ccc.bbb.aaa.rbl_domain の様な形式) で A レコードを引いて、何か値が返ってきたらブロック。
  • zen.spamhaus.org で引いた場合で、127.0.0.2, 127.0.0.3, 127.0.0.4, 127.0.0.5, 127.0.0.6, 127.0.0.7, 127.0.0.10, 127.0.0.11 のいずれかが返ってきた場合ブロック。

となる様でした。

なお、「reject_rbl_client」パラメータの「rbl_domain=」の後の IPv4 アドレスは Postfix 2.1 以降、[] 内の値を「;」文字で分割できるのは、Postfix 2.8 以降で使用できる模様です。

ちなみに、zen.spamhaus.org を使用している場合で、本当に設定が有効になっているかどうかを確認するには、設定したサーバから「nelson-sbl-test [アットマーク] crynwr.com」あてにメール送信をします。

正しく設定されていると、サーバ側のメールログにブロックされている旨が記録されますし、結果もメールで返送されてきます。

squid 3.1 設定のメモ (Debian GNU/Linux 7 での場合)

Debian GNU/Linux 7 での設定例です。キャッシュは使用しません。プロキシのポート番号は 8080 です。

■設定とインストール

・インストール

# apt-get install squid3

・認証用ファイルを作る

以下のような形式のプレーンテキストファイルを「/etc/squid3/passwd」に作成し、適切な権限を与えます。

Username:Password
# cd /etc/squid3
# echo "Username:Password" > passwd
# chmod 600 passwd
# chown proxy:proxy passwd

・squid3 の設定ファイルを編集

/etc/squid3/squid.conf を編集する。

# Digest 認証部分
auth_param digest program /usr/lib/squid3/digest_pw_auth /etc/squid3/passwd
auth_param digest children 5
auth_param digest realm Proxy Server
auth_param digest nonce_garbage_interval 5 minutes
auth_param digest nonce_max_duration 30 minutes
auth_param digest nonce_max_count 50

# キャッシュマネージャーの ACL
acl manager proto cache_object

# localhost の ACL
acl localhost src 127.0.0.1/32 ::1

# Digest 認証の ACL
acl passwdauth proxy_auth REQUIRED

# Proxy での SSL ポート番号並びに通すポートと CONNECT メソッドの ACL
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl CONNECT method CONNECT

# キャッシュマネージャーへのアクセス制限 (localhost のみ)
http_access allow manager localhost
http_access deny manager

# プロキシへのアクセス制限 (あらかじめ定義したポート、メソッドで localhost は許可、それ以外は Digest 認証が必要)
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow passwdauth
http_access deny all

# プロキシのポート番号
http_port 8080

# キャッシュ設定 (使用しない)
cache_mem 0 MB
cache deny all

# 実行ディレクトリ
coredump_dir /var/spool/squid3

# プロキシサーバが出力するヘッダを抑制
forwarded_for delete
via off

・設定確認

# squid3 -k parse

「via off」部分で WARNING が出ますが、ヘッダの抑制は行われます。

・再起動

# /etc/init.d/squid3 restart

■その他

squid3 が動作しているサーバが IPv6 アドレスも持っている場合、IPv4 な接続元から squid3 経由で通信すると、要求された接続先が IPv6 アドレスを持っている場合、IPv6 でアクセスすることを確認しました。プロキシ形での IPv4 <-> IPv6 変換としても使用できそうです。

Debian 8 + DNS64 + NAT64 on the Raspberry Pi 2

Debian 8 上に DNS64 + NAT64 を設定した備忘録である。例によって無保証である。

2017/02/11 追記: Jool 3.5.x 系でも同じようにインストール出来ることを確認した。

Linux カーネルのビルドは、「Kernel Building – Raspberry Pi Documentation」に記載の通り、DNS64, NAT64 関係は、「DSAS開発者の部屋:Raspberry Pi 2 で NAT64 箱をつくってみた」の通りとなる。

両者のドキュメントに感謝しつつ、実際に設定を行ってみた。なお、私の環境では、USB で NIC を接続して別インタフェースを接続している。

続きを読む