固定IPv4アドレスを失ったので、VPS上にDS-Lite方式に対応したルーターを作ってみた

2022.06.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

社内で年齢詐称疑惑の絶えない、インターネット老人会員の水島が大阪からお届けします。
社内Slackに作られてしまったリアクション
皆さんにとってインターネットとは何でしょうか。情報源…憩いの場…金の生る木…実家のような安心感……?
私にとってインターネットとは、IPv4とIPv6です。夢のない話ですね!

今回はお仕事とは全く関係ありません、自宅のインターネット回線のお話です。

涙なしでは語れません。諸行無常のインターネットの世界、お気に入りだったISPのサービス終了を何度か経験されている会員の皆様も多くいらっしゃると思いますが、先月いっぱいで長年愛用してきた固定IPv4が使える安価なプロバイダーが、惜しまれつつもサービス終了となってしまいました。

自宅で固定IPv4アドレスを必要とする活動をされている方はまだまだいらっしゃると思います。このままでは、「IPアドレスを持つ者はすべて対等にサービスを提供できる」という本来のインターネットの姿が失われてしまう、そんな危機感に駆られた為、この記事を書くことにしました。

何をしようとしているのか

IPv6のみでインターネットに接続している人が、IPv4のインターネットにも接続するための仕組みが世の中にはいくつか存在します。その一つがDS-Liteという仕組みで、簡単に説明するならば、「プロバイダーが巨大なルーター(NAT)を提供してくれていて、そこに対してIPIPトンネルを張り、自宅からの外向きの通信をそちらに向けるだけで、あとはプロバイダー側のルーターがよしなにしてくれる」という方式です。

この方式は便利な反面、(特別な契約をしない限り)特定のポートに対して待ち受けをすることができません。そこで、プロバイダーの代わりに、IPv4グローバルアドレスのある所に自分でルーターを置いて同じことをしてしまおうというのが今回の作戦です。ルーターが手中にあれば、好きにポートを割り当てて使えるというわけです。

いざ、実施!

前提環境

前提となる環境は、自宅がIPv6でインターネットに接続されていることと、グローバルIPv4アドレスとIPv6アドレスを持つVPSが一つあることです。
物理的に家に近いほうがパケットの往来にかかる時間を短くできますので、関西に住んでいる方は大阪に拠点があるVPSにすると良いでしょう。
ディスクもメモリも一番小さいプランで構いません。

IPアドレスの一覧:

VPSのIPv4アドレス: 198.51.100.123
VPSのIPv6アドレス: 2001:db8:d0g:f00d:198:51:100:123
自宅のルーターのIPアドレス: 2001:db8:1ce:ba11::1
自宅のプライベートIPv4ネットワーク: 192.168.1.0/24
自宅からIPv4向けにサービスを提供したいマシン: 192.168.1.109, 192.168.1.110

VPSの設定

その前に、ネームサーバーのTTLを短くしておきます。
手癖でDebian11をインストールしてしまいましたが、お好みのディストリビューションを選んでください。
下記のコマンドをVPS上で実行します。

$su -

#apt-get install net-tools iptables

#modprobe ip6_tunnel

#ip -6 tunnel add tun1 mode ip4ip6 remote 2001:db8:1ce:ba11::1 local 2001:db8:d0g:f00d:198:51:100:123
#ip link set tun1 up
#ip addr add 192.0.0.1/30 dev tun1

#sysctl -w net.ipv4.conf.all.forwarding=1
#sysctl -w net.ipv4.conf.ens3.rp_filter=0
#sysctl -w net.ipv4.conf.tun1.rp_filter=0
#sysctl -w net.nf_conntrack_max=65535

#route add -net 192.168.1.0/24 dev tun1

#iptables -t nat -F
#iptables -t nat -A POSTROUTING -j MASQUERADE
#iptables -t nat -A PREROUTING -p tcp --dst 198.51.100.123 --dport 80 -j DNAT --to-destination 192.168.1.109:80
#iptables -t nat -A PREROUTING -p tcp --dst 198.51.100.123 --dport 443 -j DNAT --to-destination 192.168.1.109:443
#iptables -t nat -A PREROUTING -p tcp --dst 198.51.100.123 --dport 143 -j DNAT --to-destination 192.168.1.110:143
#iptables -t nat -A PREROUTING -p tcp --dst 198.51.100.123 --dport 25 -j DNAT --to-destination 192.168.1.110:25
#iptables -t nat -A PREROUTING -p tcp --dst 198.51.100.123 --dport 465 -j DNAT --to-destination 192.168.1.110:465
#iptables -t nat -A PREROUTING -p tcp --dst 198.51.100.123 --dport 587 -j DNAT --to-destination 192.168.1.110:587
#iptables -t nat -A PREROUTING -p tcp --dst 198.51.100.123 --dport 993 -j DNAT --to-destination 192.168.1.110:993

メールサーバーも自前とかマジでインターネット老人会だな!なんて言わないでくださいね。

ルーターの設定

次に、自宅のルーターへ、VPSに対してIPIPトンネルを張る設定と、サービスを動かしているマシンからの通信をVPSにルーティングする設定を追加します。

NEC IXシリーズの設定例:

interface Tunnel2.0
  tunnel mode 4-over-6
  tunnel destination 2001:db8:d0g:f00d:198:51:100:123
  ip unnumbered FastEthernet0/1.0
  ip tcp adjust-mss 1460
  no shutdown

ip route default Tunnel0.0

ip access-list svr permit ip src 192.168.1.109 0.0.0.0 dest any
ip access-list svr permit ip src 192.168.1.110 0.0.0.0 dest any

route-map svr permit 10
  match ip address access-list svr
  set interface Tunnel2.0

※デフォルトルートとなっているTunnel0.0はプロバイダのAFTRに向いており、アクセスリストで指定したサーバの通信以外はこちらを通ります。

さて、どうでしょうか。上手く到達できましたか?
ネームサーバーの設定を変更して、完璧に動作しているか確かめましょう。

おっと!ビールはまだ開けないでください。
DNSの反映待ち(浸透いうな!)をつまみに一杯行きたい気持ちはわかりますが、大事な作業が残っています。

設定の永続化

このままではリブートするとすべて忘れてしまいますので、設定ファイルに書き込んでおきましょう。
Debian11の場合の設定例です。お使いのディストリビューションに合わせて設定ファイルの位置は読み替えてください。

/etc/modules に以下の行を追記

ip6_tunnel

/etc/sysctl.conf に以下の行を追記

net.ipv4.conf.all.forwarding=1
net.ipv4.conf.ens3.rp_filter=0
net.ipv4.conf.tun1.rp_filter=0
net.nf_conntrack_max=65535

/etc/interfaces に以下の行を追記

auto tun1
iface tun1 inet static
    address 192.0.0.1/30
    pre-up ip -6 tunnel add tun1 mode ip4ip6 remote 2001:db8:1ce:ba11::1 local 2001:db8:d0g:f00d:198:51:100:123
    post-up route add -net 192.168.1.0/24 dev tun1
    post-down ip -6 tunnel del tun1

iptablesはiptables-persistentに任せます。iptablesが適切に設定された状態で

#apt-get install iptables-persistent

と実行すると、現在の設定を保存するか尋ねられますので、Yesと答えれば完了です。
既にインストールされている場合は、/etc/iptables/rules.v4を直接編集するとよいでしょう。

/etc/iptables/rules.v4 の例
# Generated by iptables-save v1.8.7 on Mon May 30 00:00:00 2022
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -d 198.51.100.123/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.109:80
-A PREROUTING -d 198.51.100.123/32 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.1.109:443
-A PREROUTING -d 198.51.100.123/32 -p tcp -m tcp --dport 143 -j DNAT --to-destination 192.168.1.110:143
-A PREROUTING -d 198.51.100.123/32 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.1.110:25
-A PREROUTING -d 198.51.100.123/32 -p tcp -m tcp --dport 465 -j DNAT --to-destination 192.168.1.110:465
-A PREROUTING -d 198.51.100.123/32 -p tcp -m tcp --dport 587 -j DNAT --to-destination 192.168.1.110:587
-A PREROUTING -d 198.51.100.123/32 -p tcp -m tcp --dport 993 -j DNAT --to-destination 192.168.1.110:993
-A POSTROUTING -s 192.168.1.0/24 -o ens3 -j SNAT --to-source 198.51.100.123
COMMIT
# Completed on Mon May 30 00:00:00 2022

終わり

これで設定は完了です。rebootして問題なく動いていれば成功です。ネームサーバーのTTLを元に戻しておきましょう。
ルーターを乗っ取られると自宅内のサービス提供用マシンに直接アクセス出来ることになり大変危険ですので、セキュリティに気を付けて運用をエンジョイしましょう。

[追記]ちょっと修正

実際に動かしてみて、一つ問題がありました。サーバーのログを見てみると、通信元がすべてトンネル端のIPアドレスである192.0.0.1になってしまっていたのです。
これではログの意味がなくなってしまいますし、メールサーバーが逆引きに失敗して配信を拒否してしまうといった問題が起きることがありますので、下記のように修正します。

修正前

#iptables -t nat -A POSTROUTING -j MASQUERADE

修正後

#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens3 -j SNAT --to-source 198.51.100.123

これで、送信元のアドレスが書き換えられることはなくなります。

謝辞

この作戦を実施するにあたり、Tomochaさんのスライドを参考にさせていただきました。この場を借りてお礼申し上げたいと思います。