Raspberry Pi 4BでDS-Lite

Raspberry-Pi 4Bをルータとして使用し、DS-Lite接続するための設定です。OSをUbuntu 24.04に入れ替えたので、その時の記録として。
なお、Wi-Fiルータは、リピータモードで家内LANに設置して使用しています。

## Ubuntu 24.04 for Raspberry Piのダウンロードと書き込み
[Install Ubuntu on a Raspberry Pi](https://ubuntu.com/download/raspberry-pi)のページの「Download Ubuntu Server 24.04.1 LTS」のリンクからisoイメージをダウンロードし、rpi-imagerを使ってUSBメモリへ書き込みました。

## 起動
上のイメージは、すぐに起動するようになっているものなので、電源をいれると起動します。アカウントは、ubuntu/ubuntuです。すぐに、更新用のパスワードの入力を求められます。HDMIに繋いで作業をしました。

## USB-Etherアダプタの接続
DS-Liteを使うには、Rapsberry Piに付いているEthernetポートの他に、USB-Etherアダプタを使います。まぁ、なくても使えないことはないですがあまり意味ないので、その設定の説明はここではしません。

## netplanの設定

下記の設定が`netplan`の設定です。`eth0`がRaspberry PiのEthernetポート、`enx18ece795fe96`がUSB-Etherポートになります。おそらく、USB-Ether側のnameserversは要らないんじゃないかと思います。
内部ネットワークは、`192.168.0.0/24`で、Raspberry Piのアドレスは、`192.168.0.1`にしてあります。
`xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx`は、DHCPで割り当てられるipv6のアドレスです。これは、[IPv6の取得 - ESPRESSObinでDS-Lite](https://qiita.com/MiniAndNd/items/078a813953f832a2c288#ipv6%E3%81%AE%E5%8F%96%E5%BE%97)の中で取得方法を書いていますが、おそらく同じようにやれば取得できるのではないかと思います。未だにその時のアドレスを使いまわしています。`yyyy.yyyy.yyyy.yyyy,yyyy.yyyy.yyyy`も同様です。
ネームサーバーの、`2001:4860:4860::8888`と`2001:4860:4860::8844`は、GoogleのDNSです。

```
network:
    ethernets:
        enx18ece795fe96:
            dhcp4: false
            dhcp6: false
            ignore-carrier: true
            addresses:
            - 192.168.0.1/24
            nameservers:
                addresses:
                - localhost
                - 8.8.8.8
                - 1.1.1.1
            optional: true
        eth0:
            dhcp4: false
            dhcp6: false
            optional: false
            ignore-carrier: true
            addresses:
            - xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx/64
            routes:
            - to: default
              via: yyyy.yyyy.yyyy.yyyy,yyyy.yyyy.yyyy
            nameservers:
                address:
                - 2001:4860:4860::8888 2001:4860:4860::8844
    version: 2
```

`netplan apply`とするとRaspberry-PiにIPアドレスが適用され、aptコマンドなどが使えるようになると思います。

## パケットフィルタ

以上に加えて、パケットフィルタをしています。以下はどこからか拾ってきたものです。これがないとEthernetポートとUSB-Etherポート間の転送ができないんだったような。

```
#!/bin/sh
# ip6tables.sh

WAN_IF=eth0
LAN_IF=enx18ece795fe96
LAN_SUBNET=fd00:1fe::/64

# いったんルールをflush
ip6tables -t filter -F
ip6tables -t mangle -F
ip6tables -t nat -F
ip6tables -F

# filter tableはdefaultではINPUT, FORWARDはDROP, OUTPUTはACCEPT
ip6tables -t filter -P INPUT DROP
ip6tables -t filter -P OUTPUT ACCEPT
ip6tables -t filter -P FORWARD DROP

# loopbackはACCEPT
ip6tables -t filter -A INPUT -i lo -j ACCEPT
# LAN側はACCEPT
ip6tables -t filter -A INPUT -i $LAN_IF -j ACCEPT
# セッション確立後はACCEPT
ip6tables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# ICMPv6は利用しないredirectだけDROPし、他はACCEPT
ip6tables -t filter -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type redirect -j DROP
ip6tables -t filter -A INPUT -p ipv6-icmp -j ACCEPT

# LAN側からWAN側にForwardされる通信はACCEPT
ip6tables -t filter -A FORWARD -s $LAN_SUBNET -o $WAN_IF -j ACCEPT
# セッション確立後はACCEPT
ip6tables -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# ICMPv6はecho-request(ping)/echo-reply(pong)のみ許可
ip6tables -t filter -A FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type echo-request -j ACCEPT
ip6tables -t filter -A FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type echo-reply -j ACCEPT

# mangle tableはすべてACCEPT
ip6tables -t mangle -P PREROUTING ACCEPT
ip6tables -t mangle -P INPUT ACCEPT
ip6tables -t mangle -P FORWARD ACCEPT
ip6tables -t mangle -P OUTPUT ACCEPT
ip6tables -t mangle -P POSTROUTING ACCEPT
```

`ip6tables.sh`として保存して、rootで`./ip6tables.sh`としt実行します。実行後、以下で保存しておきます。`ip6tables.sh`は、`iptables-persistent`パッケージにあるので、aptでインストールが必要です。

```
sudo ip6tables-save > /path/to/active6
```

## routing
更にに、USB-EtherポートからのアクセスをWAN側に通すための設定です。私は、これを`/etc/rc.local`に書きましたが、ちゃんとしたやり方がありそうです。
mtuの設定は3000としてありますが、不要なら削除しても大丈夫です。

```
#!/bin/bash

REMOTE='2404:8e00::feed:100'
LOCAL='xxxx:xxxx:xxxx:xxx:xxxx:xxxx:xxxx:xxxx'

# IPIP6 tunnel linkup
ip -6 tunnel add ip6tnl1 mode ip4ip6 remote $REMOTE local $LOCAL dev wan
ip link set dev ip6tnl1 up

ifconfig ip6tnl1 mtu 3000

# IPv4 routing
route add default dev ip6tnl1

# restore iptables
ip6tables-restore /path/to/acrive6

exit
```

ファイルを作成したら、`chmod +x /etc/rc.local`して実行権を与えておきます。
`/etc/rc.local`を実行すれば、EthernetポートとUSB-Ether間の通信ができるようになるはずです。

## カーネルパラメータ
もう一つ、EthernetポートとUSB-Etherアダプタ間の通信には、パケットフォワーディングの設定がいります。`/etc/sysctl.conf`で以下を設定します。

```
net.ipv4.ip_forward=1
```

これを有効にするには、以下のコマンドを使います。

```
sudo sysctl -p
```


## DHCPサーバー
以下でインストールします。

```
sudo apt install isc-dhcp-server
```

設定は、`192.168.0.128-192.168.0.200`をDHCPにする場合、こうなります。`/etc/dhcp/dhcpd.conf`に設定します。

```
option domain-name "internal.aka-minnie.com";
option domain-name-servers 8.8.8.8;
authoritative;
subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.128 192.168.0.200;
  option broadcast-address 192.168.0.255;
  option routers 192.168.0.1;
}
```

設定を有効にするには、以下です。

```
sudo systemctl enable isc-dhcp-server
sudo systemctl restart isc-dhcp-server
```