PostgreSQLでIPv6、リンクローカルアドレスにはまる

IPv6、使いたくないという声の方がよく聞きますが、いまさらなので使っていきましょう。
今回はリンクローカルアドレスを使おうとしてはまる。

とある停電で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'

他の場合には%をエスケープする必要があるかもしれません。
これでもう一度再起動したところ接続可能になりました。

参考

URIの場合

古いURL(RFC 1738)ではZoneIDをサポートしていません。URIでも使えませんでしたが、RFC 6874でURIのZoneID拡張が入っています。
  • RFC 6874 ZoneIDをURIで
  • RFC 3986 URI
  • RFC 1738 URL

コメント

このブログの人気の投稿

ハリーポッター電子書籍版を購入してみた

面倒くさそなもじら系分離

電源回路が変?