そもそも繋がってる状態からだと、繋がらない状態に戻す方法がわからなくて再現手順の検証が大変だったけど、もしも同じ状況になった人がいたら、少なくとも僕はこうやったら解決できましたよというメモ。
そこらへんで売ってる市販のルータでアンナンバード接続でWANに公開してるサーバがあったとして、サーバのWAN側のNIC(仮にeth0)に以下のコマンドで別のグローバルIPをVIPで付与してもなぜかWANから繋がらないときがある。
# ip addr add local 別のグローバルIP/29 dev eth0 label eth0:0
iptablesとかroutingテーブルとかtcpdumpとか思いつくとこ確認しまくってもなぜ繋がらないのか全然わからない。
じつはVIPじゃなくて一度eth0落として別のグローバルIPのほうをプライマリにしてifupすると、他はまったく同じなのになぜか繋がる。VIPのときは繋がらない。そして困ったことに上記方法で繋がるようにしたら、元のIPに戻してifupしなおしてからVIPで付与しなおしたりしても繋がらなかった状態に戻せなくなる。
ip addr addしたときには起こらなくて、ifupしたときときに起こるなにかがあるのだろうと思ってtcpdumpしながらifupしてみたら、ifupしたときはゲートウェイのルータに対してarp要求を送ってることがわかった。ip addr addしたときにも同じようなarp要求をルータに送れば繋がるようになるんじゃないかと思って、arpを送れるsend_arpコマンドはfakeパッケージに入ってるみたいなので入れてみた。
# aptitude install fake
そしてtcpdumpで確認してたのと同じようなarp要求をルータに送ってみる。
# ip addr add local 別のグローバルIP/29 dev eth0 label eth0:0 # send_arp 別グローバルIP eth0のMACアドレス ルータのIP ff:ff:ff:ff:ff:ff eth0
これをするだけでWAN側から新しく付与したIPに繋がるようになった。
あんまネットワーク得意じゃないから、どっか自分が設定しくってるのかと思ってIRCでかなり教えてもらいました。
たいへん勉強になりました…ありがとうございます!
以上、なんかよくわからん原因で繋がらなくなったら、send_arpすれば僕の場合は的中率100%で繋がるようになったので、もし困ってる人がいたらぜひ試してみて!