うちは固定IPでは無いので、Interlinkの固定IPサービスを使ってます。 仕組みは、うちのサーバからInterlinkのサーバへVPNで繋いでるだけ。固定IPはInterlink側が保持してて、外からのアクセスはすべてこのInterlinkの固定IPからVPN経由でうちのサーバに入ってきます。 ただ、とてもこのVPNがすごく遅いです…。たぶん1Mbpsとかそういうレベル。なので某所用にダイレクト接続を試みてみました。 まず、もともとのルーティング設定で、ローカル側(192.168.xxx.0/24)はルーティングの設定でeth0側に抜けます。これは問題無し。 しかし、それ以外のアクセスは、このVPN側(絵の中では61.xxx.xxx.A)がデフォルトゲートウェイになっていますので、そこから出入りすることになります。 これが非常に大きな問題で、VPNを使わない側、絵で言う211.xxx.xxx.AというIPへ外部からアクセスされても、戻りのパケットはppp0側から抜けます。 IPパケットにはSRC(source:アクセス元)IPとDST(destination:アクセス先)が設定されていますが、たとえば111.xxx.xxx.xxxという人が211.xxx.xxx.Aへアクセスした場合は、
上りパケット…SRC-IP:111.xxx.xxx.xxx DST-IP:211.xxx.xxx.A
下りパケット…SRC-IP:61.xxx.xxx.A DST-IP:111.xxx.xxx.xx
になります。実際には
上りパケット…SRC-IP:111.xxx.xxx.xxx DST-IP:211.xxx.xxx.A
下りパケット…SRC-IP:211.xxx.xxx.A DST-IP:111.xxx.xxx.xx
で無ければ通信は成り立ちません。サーバのデフォルトゲートウェイが61.xxx.xxx.Aなので、下りパケットのSRC-IPが変化しています。 通常ルーティングはIPアドレス毎に、どの回線を使うかを判断しますが、SRC/DST-IP両方は見ていません。上記例の場合はSRC-IP(サーバから見るとDestinationなんだけどね)しか見ていません。ですので、今回は以下のような対策をとりました。 デフォルトゲートウェイをeth0側に変更(ちょっと別の訳あり)。 ppp0側から入ってきたパケットは、すべてppp0へルーティング。 eth0をデフォルトゲートウェイにした場合は、当然ppp0側からのパケットはeth0から抜けますが、ここをポリシールーティングという方法を使って強制的にppp0から抜けさせます。 やり方はこんな感じ
# 前のデフォルトゲートウェイを削除
route del default gw 61.xxx.xxx.A
# デフォルトゲートウェイを192.168.xxx.Aに設定
route add default gw 192.168.xxx.A
# ppp0へ入ってきたすべてのパケット(0/0 = 0.0.0.0/0)を、ppp0(61.xxx.xxx.A)側へとばす。
ip route add 0/0 dev ppp0 table 20
ip rule add from 61.xxx.xxx.A table 20 […]