なんとも不可解なIPv6 (2)

現在できていること

  • ホストマシンが,SLAACでIPv6アドレス・ルーティング情報を上流(プロバイダーのお仕着せルーター)から自動的に得ること
  • ホストマシンから外界へIPv6でつなぐこと
  • 外界からホストマシンのhttpd,sendmailなど公開しているサービスに,IPv4とIPv6で接続すること
  • ホストマシンからゲストマシンにdhcpdでIPv4のプライベートアドレスとIPv6のグローバルアドレスを与えること
  • ゲストマシンからIPv4のnatで外界につなぐこと
  • ホストマシンとゲストマシンの間のIPv6による双方向接続

できていないこと

  • ゲストマシンから外界にIPv6でつなぐこと

症状としては,例えばゲストマシンからSo-netのお仕着せルーターのIPv6アドレスをtraceroute6すると,ホストのvirbr0まで届くのですが,その先に行きません.ホストがブリッジ機能を果たしてくれません.

たぶん,引っかかっているのは,解ってしまえばなんでもないようなことだと思うのですが,この二日間悩んでいます.

KDDIのお仕着せルーターで,サーバー公開設定している.

なんとも不可解なIPv6

なんとも不可解

IPv6のルーティングについては,なんとも不可解である.以下の話は,参考リンクに挙げた,Andyさんの,On Going Struggleの記事による(一部自分で確認して情報を追加).

Stateless Address Auto-Configuration (SLAAC)

Linux Kernelが,ルーターモードでないと判断したら,SLAACが効いて,IPアドレス(IPv6のアドレス.以後も断りなければIPv6限定の話)の取得とルーティングを行うが,ルーターモードになると,SLAACは無効になって,各インターフェースのIPアドレスとルートを手動で設定しなおす必要が出てくる.

では,どのようにルーターモードであるか判断するかというと,/proc/sys/net/ipv6/conf/all/forwardingが1の時,つまり,

echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

が実行されるとルーターモードになる.このコマンドを実行したら,各インターフェースのIPアドレスとルートを手動で設定しなければならない.

ルーターでもSLAAC

ただし,Linux Kernel 2.6.37以降では,ルーターモードでもSLAACを活かすことができるということである.そのためには,

echo 2 > /proc/sys/net/ipv6/conf/<IF name>/accept_ra

とするということである.本来はバイナリーなのに”2″を書き込む.

<IF name>は”all”では効果がなく,それぞれのインターフェースごとに行う必要があるようだ.

参考ページ

Andyさんの,”The Ongoing Struggle”から,

ip6tablesスクリプト改訂

IPv6に関しては,なかなか解らなかったんですが,ip6tablesの設定がようやく,IPv4用のiptablesと対応させてできるようになりました.意図して設定すると,その通りの挙動になることが確認できました.

これまでは,so-netのルーターで,必要なサービスだけを通るようにして,サーバー(このBLOGのホスト)側では,全部OKにしていました.

今回,so-netのルーターでは,宛先IPアドレスがサーバーと一致すれば全部通すようにしました.フィルタリングはサーバーのほうでしています.IPv4と同じ運用です.

so-netのルーターは,20しかフィルタの設定ができないし,複数の設定の保存とか,融通も利きませんから,こういう形に持ってこようと考えてはいました.

Submission port (587)へのIPv6アクセス (Slackware 14.2へその13)

これは,Slackware 14.2のupgradeに直接関する問題ではなくて,IPv6化したあとの5か月越しの懸案でした.わが家のsendmailへ,IPv6ではsubmission port (587)へ接続できないのです.

lsof -i | grep sendmail
sendmail  29512   root    4u  IPv6 1301137      0t0  TCP *:smtp (LISTEN)
sendmail  29512   root    5u  IPv6 1301138      0t0  TCP *:smtps (LISTEN)
sendmail  29512   root    6u  IPv4 1301139      0t0  TCP *:submission (LISTEN)

てな具合です.そこで,ネット検索結果を参考に,sendmail.mcに,

DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea, Family=inet6')dnl

と加えて,なんやかんやしてsendmailをリスタートすると,

opendaemonsocket: daemon MSA: cannot listen: Address already in use

てな,エラーが出続けます.

想像するに,既に,IPv4オンリーでMSAが立ち上がったあとで,IPv6オプションを明示したMSAをもう一度立ち上げようとしている(あるいはその逆の順番)ことは解ります.だから,勝手に立ち上がるMSAを止めたい.

いつもながら,解ってしまえば簡単なことなんです.次のようなFEATURE文を一行書くだけです

FEATURE(`no_default_msa')dnl

無事動くようになりましたとさ.

sendmail  29792   root    4u  IPv6 1212952      0t0  TCP *:smtp (LISTEN)
sendmail  29792   root    5u  IPv6 1212953      0t0  TCP *:smtps (LISTEN)
sendmail  29792   root    6u  IPv6 1212954      0t0  TCP *:submission (LISTEN)

めでたしめでたし.

もちろん,上記のDAEMON_OPTIONS…も必要です.

MozcインストールOK (Slackware 14.2へその12)

Slackwareには標準でscim+anthyがついてきますので,.xprofileに

export GTK_IM_MODULE=xim
export QT_IM_MODULE=scim
export XMODIFIERS=@im=SCIM

って書いとけば日本語入力できます.

しかし,anthyは不完全な連文節変換で,開発も止まってしまっていて,今後も改善されることは期待できません.昔のDOSの単漢変換よりは遥かにましですが,文節の区切り方がどうもにもこうにもなレベルで,入力のリズムが途切れます.

UbuntuではMozcが利用できます.ちょっといじってみたら十分使えるレベルです.これを手でSlackwareにインストールするのは大変そうだなと思い,ネット検索したらSlackbuildスクリプトでbuildできるようにして公開してくださっている人がいます.

少し前に試したのですが,肝心なソースのURLが無効になってしまったようで,残念ながらbuildできませんでした.

つい先日その不具合を修正してくださったようで,先ほど試したらエラー無しでfcitxとMozcがインストールできました.いま,その環境で入力しています.

これなら,メール, Web, LibreOfficeによるドキュメント作成も十分実務に耐えられると思います.

関連項目

Slackware 15でMozcは,〇32bit, ×64bit (2022/6/9)

SlackwareARM 15でMozcはNG (2022/6/10)

ただし,Ubuntu 16.04 TLS現在では,デフォルトでは使えませんので,設定の変更が必要です.どうするかは,他を当たってください^^;
LibreOffice Writerでは,インライン入力ができないようで,これでは実務には無理かもです.^^;