Orange Pi R1 のSPIフラッシュにOSを入れてルーターにする

メニュー

nftables

iptablesの後継らしい。

Kernel config
[*] Networking support  --->
  Networking options  --->
    <*> NETLINK: socket monitoring interface
nftコマンドを利用するのにNETLINKが必要と思われます。
[*] Networking support  --->
  Networking options  --->
    [*] Network packet filtering framework (Netfilter)  --->
      <*> Netfilter connection tracking support
      <*> Netfilter nf_tables support
        <*>   Netfilter nf_tables conntrack module
        <*>   Netfilter nf_tables masquerade support
        <*>   Netfilter nf_tables nat module
      IP: Netfilter Configuration  --->
        [*] IPv4 nf_tables support
Kernelでnf_tablesを有効にする必要がありますが、
menuconfigで nat module を出すのに、先に"Netfilter connection tracking support"と"IPv4 nf_tables support"をチェックする必要があります。
"Netfilter nf_tables nat module"をチェックするとmasqueradeも出てきます。
conntrack module はファイアウォールを設定するのに必要です。

Buildroot
Target packages  --->
  Networking applications  --->
    [*] nftables
チェックしてビルドすればnftコマンドが利用できます。

nftablesはカーネルの機能なので別途デーモンの起動は必要ありません。
nftコマンドでルールを変更すれば即時反映します。
ただし、起動時はルールが設定されていない状態なので、ルールをインポートするための起動スクリプト的なものは作る必要があります。

NATを有効にするにはsysctlでip_forwardを有効にする必要があります。
sysctlは/etc/init.d/S02sysctlで自動起動されるようになっていますが初期状態では設定ファイルがありません。
/etc/sysctl.conf
net.ipv4.ip_forward = 1
設定ファイルを作って再起動すれば利用できるようになります。

/etc/nftables 以下にnftablesのテンプレートのようなものが存在します。
これらは実行可能スクリプトの形式になっていますが、初期状態ではパーミッションはついていません。
# nft -f /etc/nftables/all-in-one.nft
の様に、直接実行せずにnftコマンドの-fオプションで指定して取り込むこともできます。

/etc/nftables/all-in-one.nft は他のファイルをインクルードする様になっていますが、相対PATHになっているので絶対PATHに変更した方がいいと思います。
#!/usr/sbin/nft -f
include "/etc/nftables/ipv4-filter.nft"
include "/etc/nftables/ipv4-nat.nft"
IPv4のルーターにしたいので上記2箇所以外はコメントアウトしました。
IPv6に対応させたりする場合はkernelコンフィグも対応させる必要があります。
このファイルを実行すればipv4-filter.nftとipv4-nat.nftの内容がインポートされますが、初期状態ではただの雛形なので何もルールが設定されていません。

NAT
# nft add rule ip nat postrouting oif eth0 masquerade
でeth0から出ていくパケットでIPマスカレードが有効になります。
PPPでIPマスカレードをするには、
# nft add rule ip nat postrouting oiftype ppp masquerade
pppデバイスがない状態ではoifにppp0は設定できなのでoiftypeで設定します。
# nft list table ip nat
でnatテーブルのルールセットが出力されます。
この出力内容は、nft -fで取り込める形式なので、
# nft list table ip nat > /etc/nftables/ipv4-nat.nft
とすれば保存できます。

ファイアウォール
# nft add rule ip filter input ct state established,related accept
# nft add rule ip filter input iif lo accept
# nft add rule ip filter input iif eth1 accept
# nft add rule ip filter input iif wlan0 udp dport 67 accept
# nft chain ip filter input { policy drop \; }
1行目わかりにくいですが、2行目でloからのパケットは許可されますが、応答パケットはeth0にきますんで1行目がないと遮断されちゃいます。
eth1は有線LANなので全部許可します。
wlan0はUDPポート67(DHCP)だけ許可します。
最後の行はデフォルトの処理が初期状態でacceptになっているのでdropに変更します。どのルールにも一致しない場合はdropになります。
# nft list table ip filter > /etc/nftables/ipv4-filter.nft
で保存。

nftコマンドで特定行にルールを挿入することは可能ですが、コマンドが覚えられないので、
末尾にaddして保存してからテキストエディタでいじればいいと思います。

保存したルールの読み込みは、
/etc/inittab
::sysinit:/etc/nftables/all-in-one.nft
::sysinit:/etc/init.d/rcS
でデーモン等の起動前にやることにしました。
all-in-one.nftは初期状態で実行可能なパーミッションになっていません。

Orange PiをPPPoE接続のルーターにする場合はMTU(MSS)をnftablesで変換する必要があります。
pppdを参照してください。
[編集]   [AD]
rentafree.net