PostgreSQLでIPv6、リンクローカルアドレスにはまる
IPv6、使いたくないという声の方がよく聞きますが、いまさらなので使っていきましょう。
今回はリンクローカルアドレスを使おうとしてはまる。
とある停電でDHCPのIPv4アドレスが振り直されてしまったのでRaspberryPiのIPv6使っておくかというふうに考えてみました。
ということで、RaspberryPiのPostgreSQLにもIPv6使ってみてもいいんじゃない?
IPv6でローカル的なアドレスを使おうとすると、ループバックアドレス(::1)、リンクローカルアドレス(fe80::/?)とユニークローカルアドレス(fd00::/8)などなどがあり、IPv4のプライベートIPアドレスのようなものです。
リンクローカルアドレスはルータ越えができず、ユニークローカルアドレスはルータ越えも可能です。
日本でネットに繋いでいればグローバルなIPv6アドレスも振られていると思いますが、外からも見えるので違うアドレスを使おうという今回の計画。
変更箇所は、postgresql.conf の listen_addressesと pg_hba.conf にIPv6アドレスの接続許可を加えることです。
まずはIPアドレスを確認します。
# ifconfig
でざっくりアドレスなどが出てくるのでinet6でlinkなアドレスを調べます。fe80::ではじまっているはずです。
IPv4の192.0.2.77, IPv6の2001:db8:: は例示用アドレスなので気にしない。
wlan0: flags=xxxxxxx
inet: 192.0.2.77
inet6: fe80::7777:7777:7777:7777 prefixlen: 64 scopeid 0x20<link>
inet6: 2001:db8:123:4567:89ab:cdef:123:7777 prefixlen 64 scopeid 0x0<global>
lo: とそれ以外があるのでそれ以外の方で fe80::はじまりの <link> のついたものをpostgresql.confのlisten_addressesに追加。
losten_address = '127.0.0.1,192.0.2.77,::1,fe80::7777:7777:7777:7777'
などとしてみます。77は例です。RaspberryPiな環境でPostgreSQLを再起動します。
# systemctl restart postgresql
待ち受け状態を確認します。
# netstat -ant
tcp6 0 0 ::1:5432 :::* LISTEN
postgresqlのポートは5432ですが、IPv6では::1:5432しか見つかりません。::1なアドレスやグローバルなアドレスはこれで使えているのですが。
リンクローカルアドレスを記述する場合、インターフェースが特定できないと困るので指定しないといけない場合があるようです。Linuxの場合、アドレスの後ろに%wlan0 などとつけます。ZoneIDとかいいます。インターフェースの名前は ifconfigコマンドの頭に出てくるものです。
losten_address = '127.0.0.1,192.168.0.77,::1,fe80::7777:7777:7777:7777%wlan0'
他の場合には%をエスケープする必要があるかもしれません。
これでもう一度再起動したところ接続可能になりました。
参考
今回はリンクローカルアドレスを使おうとしてはまる。
とある停電でDHCPのIPv4アドレスが振り直されてしまったのでRaspberryPiのIPv6使っておくかというふうに考えてみました。
ということで、RaspberryPiのPostgreSQLにもIPv6使ってみてもいいんじゃない?
IPv6のアドレス
IPv6に限らずですが、使われているアドレスの使われ方は いくつかあります。ローカルかつブロードキャストなど除くと127.0.0.1/8と、192.168.0.0/16 や172.168.0.0/16、10.0.0.0/8、それ以外に知られていないかもしれない169.254.0.0/16、などなどローカルなものもいろいろと。IPv6でローカル的なアドレスを使おうとすると、ループバックアドレス(::1)、リンクローカルアドレス(fe80::/?)とユニークローカルアドレス(fd00::/8)などなどがあり、IPv4のプライベートIPアドレスのようなものです。
リンクローカルアドレスはルータ越えができず、ユニークローカルアドレスはルータ越えも可能です。
日本でネットに繋いでいればグローバルなIPv6アドレスも振られていると思いますが、外からも見えるので違うアドレスを使おうという今回の計画。
リンクローカルアドレス
今回は同一ネットワーク上にある機器を繋ぐということではじめから振られているリンクローカルアドレスを使ってみようと思ったのですが、PostgreSQLで。変更箇所は、postgresql.conf の listen_addressesと pg_hba.conf にIPv6アドレスの接続許可を加えることです。
まずはIPアドレスを確認します。
# ifconfig
でざっくりアドレスなどが出てくるのでinet6でlinkなアドレスを調べます。fe80::ではじまっているはずです。
IPv4の192.0.2.77, IPv6の2001:db8:: は例示用アドレスなので気にしない。
wlan0: flags=xxxxxxx
inet: 192.0.2.77
inet6: fe80::7777:7777:7777:7777 prefixlen: 64 scopeid 0x20<link>
inet6: 2001:db8:123:4567:89ab:cdef:123:7777 prefixlen 64 scopeid 0x0<global>
lo: とそれ以外があるのでそれ以外の方で fe80::はじまりの <link> のついたものをpostgresql.confのlisten_addressesに追加。
losten_address = '127.0.0.1,192.0.2.77,::1,fe80::7777:7777:7777:7777'
などとしてみます。77は例です。RaspberryPiな環境でPostgreSQLを再起動します。
# systemctl restart postgresql
待ち受け状態を確認します。
# netstat -ant
tcp6 0 0 ::1:5432 :::* LISTEN
postgresqlのポートは5432ですが、IPv6では::1:5432しか見つかりません。::1なアドレスやグローバルなアドレスはこれで使えているのですが。
解決
リンクローカルアドレスを記述する場合、インターフェースが特定できないと困るので指定しないといけない場合があるようです。Linuxの場合、アドレスの後ろに%wlan0 などとつけます。ZoneIDとかいいます。インターフェースの名前は ifconfigコマンドの頭に出てくるものです。
losten_address = '127.0.0.1,192.168.0.77,::1,fe80::7777:7777:7777:7777%wlan0'
他の場合には%をエスケープする必要があるかもしれません。
これでもう一度再起動したところ接続可能になりました。
参考
- リンクローカルアドレスとゾーンインデックス (Wikipedia)
URIの場合
古いURL(RFC 1738)ではZoneIDをサポートしていません。URIでも使えませんでしたが、RFC 6874でURIのZoneID拡張が入っています。- RFC 6874 ZoneIDをURIで
- RFC 3986 URI
- RFC 1738 URL
コメント
コメントを投稿