Ubuntu

Ubuntu20.04 UFWを使ってIPv6でサービス公開してみる

v6プラスでPPPoEブリッジを使いIPv4でサービス公開をしている。
先日、Ubuntu20.04でUFWを使ったルーターを構築し、安定したサービス提供ができるようになった。

その後に色々確認してみたところ、いつの間にかウチの中のIPv6がきれいに動くようになっていた
Ubuntu14とか16の頃はDHCPのせいなのかなんなのか、思い通りには動かなかったんだけど…



広告


安い携帯端末までIPv6に対応し始めているから、IPv6でサービス公開することには速度的なメリットが一定程度ありそう。
そして、IPv6アドレスは半固定ということだけれど、今まで変わったことがないから、ほぼ固定IPアドレスっぽく使えるんだろうと思われる。

色々と環境が整ってきたので、IPv6でサービス公開してみようかなと。

環境

Ubuntu 20.04で構築したIPv4ルーターに、IPv6のNATを追加する。

RouterCaはオプションを付けるときに送られてきたルーターである。

RouterSVは先日IPv4でサービス公開するために立ち上げたもので、今回はRouterCaのフィルターを開けてすべてのパケットがRouterSVに到達するように設定。
必要最低限の要求を受け入れ、必要最低限の転送が行われるようにする。

ローカルのWebSVは、RouterSVを使ってインターネットにサービスを提供する。

サーバー名機能NICIPアドレス
RouterCaキャリアのルーター兼DNS24nn::0001/64 ※書き分けるためだけの架空アドレス
RouterSVルーターens16024nn::0011/64 ※書き分けるためだけの架空アドレス
WebSVインターネットに公開するWebサーバーens3324nn::0077/64 ※書き分けるためだけの架空アドレス

以前、radvdumpでRAを確認したところ、うちのIPv6アドレスのプレフィックスは64ビットだった。
このあたりIPv4とは違っていて、ちゃんと調べて知っておくことは、よそ様に余計な迷惑を掛けないようにするために大事だろうと思われる。

さて…
RouterSVで公開サービス以外のアクセスログをすべて残しつつ、WevSVを保護。
WebSVはサービスの保護に専念しつつサービスを公開する、という発想で設計するが、これはIPv4のルーター構築時のシナリオと同じ。
そのために、IPv6ではあるけれども、WebSVはデフォルトゲートウェイとしてRouterSVを指して、RouterSVは外からのアクセスをDNATする設定をしていく。

設定

IPアドレスの固定

ルーターなのでIPアドレスは固定。

/etc/netplan/00-installer-config.yaml

# This is the network config written by 'subiquity'
network:
  ethernets:
    ens160:
      addresses:
      - 192.168.0.11/24
      - 24nn::0011/64
      gateway4: 192.168.0.1
      gateway6: 24nn::0001
      nameservers:
        addresses:
        - 192.168.0.1
        - 24nn::0001/64
        search:
        - myhome.local
#    optional: true ← 起動で待たされる症状が出たら設定
  version: 2

※先日作ったルーターにIPv6の設定を追加している。

設定変更したら、以下のコマンドで反映させる。

$ sudo netplan apply

問題なければ再起動して、設定前に自動構成されていたデフォルトルート等をきれいにしておくと良いように思う。

カーネルパラメーターでパケット転送を有効化

カーネルにパケット転送することを伝える。
一般には、/etc/sysctl.confで設定するのだけれど、今回はUFWでルーターを設定しようとしている。

/etc/ufw/sysctl.conf

# Uncomment this to allow this host to route packets between interfaces
net/ipv4/ip_forward=1
net/ipv6/conf/default/forwarding=1
net/ipv6/conf/all/forwarding=1

※ipv6の行頭についている#を外して有効行にする。ipv4の方は、前回記事で有効化済み。

設定を反映させて、状態を確認する。

$ sudo ufw reload
$ cat /proc/sys/net/ipv6/conf/default/forwarding
1
$ cat /proc/sys/net/ipv6/conf/all/forwarding
1

これは恒久設定になっていて、再起動してもちゃんと反映されている。

設定が2行必要なのは何でかな?と思って調べてみた。
でも、defaultの方の設定はなんなのか…情報を見つけることはできなかった。

net.ipv6.conf.all.forwarding=1
このオプションを有効にすると、このホストのルーター広告に基づくStateless Address Autoconfigurationが無効になります。

/etc/sysctl.conf のコメントをDeepL先生に翻訳してもらったもの。

この設定もその効果の程は正直なところよく分からない。IPv6のアドレスが自動設定されるように見えている。

貸与ルーターのフィルタ設定

キャリアから貸与されているルーターにログインし、公開したいIPv6アドレスを通過させるように設定する。

【IPv6セキュリティのレベル】

設定項目設定値備考
IPv6ファイアウォール機能有効有効にすることで外部からのアクセスを遮断。
IPv6セキュリティのレベル高度ファイアウォールを有効にしてもフレッツ網内からのアクセスは可能。
高度に設定することで網内からのアクセスも遮断できる。

セキュリティレベルは一時期話題になっていたなぁ。
開けておいても攻撃のターゲットになる端末が見つかるはずはない、とか、5分ごとにIPアドレスが変わるから大丈夫、とか。確かにIPアドレスの範囲は広大。また、Windowsには「一時 IPv6 アドレス」があって、アクセス先で確かめると、それが記録されている。
だけれども、念のためガチガチの設定にしている。

次に、フィルタの設定をしていく。

【IPv6パケットフィルタ設定(IPoE)】

設定項目設定値備考
エントリ番号今回は1登録しているルール数、順番で変わる。
フィルタ種別許可
通信方向IPoE->LAN
プロトコル全て指定
TCPフラグプロトコルの指定により操作不可
送信元IPv6プレフィックス/プレフィックス長全て指定
宛先IPv6プレフィックス/プレフィックス長24nn::0011 / 128今回は[RouterSV]のアドレスのみ開放。
送信元ポートプロトコルの指定により操作不可
宛先ポートプロトコルの指定により操作不可
ICMPv6タイププロトコルの指定により操作不可
ICMPv6コードプロトコルの指定により操作不可

エントリを追加したら、有効にチェックマークを付けて設定ボタンを押す。

UFWによる転送設定(outbound)

ローカルからインターネットに出るための設定をしていく。

IP Masquerade

[WebSV]からインターネットにアクセスできるように、IP Masqueradeする。

/etc/ufw/before6.rules

…
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT

# NAT rules
*nat
:POSTROUTING ACCEPT [0:0]
-F
-A POSTROUTING -s 24nn::/64 -o ens160 -j MASQUERADE
COMMIT

※赤文字部分を追加。

POSTROUTINGの[0:0]指定は省略することができ、その場合は、カウンターが0クリアされない。

設定を反映させて確認する。

$ sudo ufw reload
$ sudo ip6tables -t nat --list-rules
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -s 24nn::/64 -o ens160 -j MASQUERADE

転送許可

カーネルパラメーターを転送可能にしても、それだけではパケットは転送されない。
一般にはデフォルトの転送ポリシーをACCEPTにして転送させるようだけれども、以前の設定を踏襲してポリシーはDROPのままとして、転送ルールを追加してみた。

具体的には、[WebSV]から外に出るものを許可する(135,137:139,445を除く)。
インターフェースが1つしかないので、LAN内部も(135,137:139,445)は出て行かないが、LAN内部はLUAのアドレスを使ってアクセスすることにした。

$ sudo ufw route deny in on ens160 out on ens160 to ::/0 port 135,137:139,445 proto tcp
$ sudo ufw route deny in on ens160 out on ens160 to ::/0 port 135,137:139,445 proto udp
$ sudo ufw route allow in on ens160 out on ens160 to ::/0

$ sudo ip6tables -t filter --list-rules ufw6-user-forward
-N ufw6-user-forward
-A ufw6-user-forward -i ens160 -o ens0 -p tcp -m multiport --dports 135,137:139,445 -j DROP
-A ufw6-user-forward -i ens160 -o ens0 -p udp -m multiport --dports 135,137:139,445 -j DROP
-A ufw6-user-forward -i ens160 -o ppp0 -j ACCEPT

※順序が重要。delete→insertするか、/etc/ufw/user.rulesの中を並べ替えてreloadするか、どうにかしてそろえる。

外部から送られてくるパケットのうち、接続済み、または、接続済みセッションに関連するものについては通過を許可したい。
確認してみたところ、その設定は標準で入っていた。

$ sudo ip6tables --list-rules ufw6-before-forward
-N ufw6-before-forward
-A ufw6-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw6-before-forward -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A ufw6-before-forward -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A ufw6-before-forward -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A ufw6-before-forward -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A ufw6-before-forward -j ufw-user-forward

ここまでの設定で、インターネットへのアクセスができるルーターとして動作する。

UFWによる転送設定(inbound)

インターネットにサービス公開するための設定をしていく。

NAT

[RouterSV]のところに到着したパケットの宛先を[WebSV]に書き換える。

/etc/ufw/before6.rules

…
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT

# NAT rules
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-F
-A PREROUTING -d 24nn::0011/128 -p tcp -m tcp --dport  80 -j DNAT --to-destination 24nn::0077
-A PREROUTING -d 24nn::0011/128 -p tcp -m tcp --dport 443 -j DNAT --to-destination 24nn::0077
-A POSTROUTING -s 24nn::/64 -o ens160 -j MASQUERADE
COMMIT

※赤文字部分を追記。

IPv4のルーターを作ったときには、PPP0に届いたパケットをDNATしていた。
IPv6でも専用のNICを追加していれば同じような設定ができるはずだが、今回は宛先が自分のIPv6アドレスだったら[WebSV]にアドレスを書き換える設定をしている。

設定を反映させる。

$ sudo ufw reload
$ sudo ip6tables -t nat --list-rules
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A PREROUTING -d 24nn::11/128 -p tcp -m tcp --dport 80 -j DNAT --to-destination 24nn::77
-A PREROUTING -d 24nn::11/128 -p tcp -m tcp --dport 443 -j DNAT --to-destination 24nn::77
-A POSTROUTING -s 24nn::/64 -o ens160 -j MASQUERADE

転送許可

宛先を[WebSV]に書き換えても、転送のデフォルトポリシーはDROPのため、ブロックされる(と思っているが、実際には転送できたような…)。
そこで、ens160に到着したパケットの[WebSV]への転送を許可する。

$ sudo ufw route allow in on ens160 out on ens160 to 24nn::0077 port 80 proto tcp
$ sudo ufw route allow in on ens160 out on ens160 to 24nn::0077 port 443 proto tcp

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       192.168.0.0/24             # SSH

135,137:139,445/udp on ens160 DENY FWD    Anywhere on ppp0
135,137:139,445/tcp on ens160 DENY FWD    Anywhere on ppp0
Anywhere on ens160         ALLOW FWD   Anywhere on ppp0
192.168.0.77 80/tcp on ens160 ALLOW FWD   Anywhere on ppp0
192.168.0.77 443/tcp on ens160 ALLOW FWD   Anywhere on ppp0
24nn::77 80/tcp on ens160 ALLOW FWD   Anywhere (v6) on ens160
24nn::77 443/tcp on ens160 ALLOW FWD   Anywhere (v6) on ens160

IPアドレスの固定(WebSV)

サービス公開する側のIPアドレスも計画に沿って固定する。

/etc/netplan/00-installer-config.yaml

# This is the network config written by 'subiquity'
network:
  ethernets:
    ens33:
      addresses:
      - 192.168.0.77/24
      gateway4: 192.168.0.11
      gateway6: 24nn::0011
      nameservers:
        addresses:
        - 192.168.0.1
        - 24nn::0001
        search:
        - myhome.local ←ここは所属するドメインにあわせる
  version: 2

※gateway6として、[RouterSV]のIPアドレスを追加。[RouterSV]はDNS機能を提供していないので、DNSは[RouterCa]をそのまま使う。

設定変更したら、以下のコマンドで反映させる。

$ sudo netplan apply

これで[WebSV]のサービスを[RouterSV]でしっかりと保護しつつ、Webサービスのみをインターネットに公開できるようになった。

起きたこと

IPv6のIPアドレスを固定して再起動したところ、以下の表示で2分5秒待たされる事象が発生。

[ *** ] A start job is runnning for Wait for Network to be Configured (46s / no limit)

原因は、IPv6に宅内で利用するULA(Unique Local Address)を割り振ったことで、うちの中で上手く動いているつもりなのだが、実際には何かがちゃんと動いていないということなのだろう。

本来は原因を突き止めてどうにかすべきところではあるものの、今回はここで教えてくれた方法で回避することにした。
Qiita / Ubuntu 18.04 ネットワーク接続の完了待ちのために起動が遅い問題の対処

設定の意味を確かめようと探してみたら、解説してくれているサイトを発見。
komeの備忘録 / 【Ubuntu18.04のネットワーク設定方法】Netplanの解説

さいごに

この設定はv6プラスを導入してすぐに試そうとしたのだけれど、テスト用の回線がなかったので断念していた。
この度、ルーティングについて色々と理解を進める必要があり、学習していく中でiptablesというものが少し理解できた。

この勢いでIPv6もやってみよう!ということでやってみたところ、思ったよりも短時間で実装することができた。
で、試してみたところ、IPv6のアクセスは思ったよりも少ない。IPv4は枯渇しているといわれながらも、現実はそんなものなのかもしれない。

ともあれ、思い通りにできるルーターが手に入ったので、色々と遊んでみよう。

広告

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他