インターネット共有のための sysctl での設定に躓いた

こんにちは。 Raspberry Pi に ArchLinux ARM を入れてみて遊んでいます。
1年くらい前、使わなくなったパソコンを使ってルータもどきを作ったことがありまして、同じものを Raspberry Pi で作ろうとしたところ、躓いたのでメモします。

ArchLinux や他の Linux で再現できるかどうか調べてません。
前回はこんな設定なかったと思うんだけどな。OS のバージョンやカーネルのアップデートによるものなのかは、この場合どこを追えばいいんですかね。

環境など


インターネット共有

目指すはこんな感じで使う。 3GやWiMAXのモバイルルータを有線に変換したい(だけ)。1年前に作ったのも構成はこちらと同じもの。

Internet ← (モバイルルータ) ← wlan0 ← (Raspberry Pi) ← eth0

実装方針

ここに従います。

  1. 静的 IP を割り当て(この場合は eth0 に)
  2. カーネルオプションをいじってパケット転送を有効化
  3. NAT の有効化
でも、これだと正常に動きませんでした。外へのパケット転送ができなかった。

解決へ

このときのカーネルオプションはこう。
# sysctl -a | grep forward
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.all.mc_forwarding = 0
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.default.mc_forwarding = 0
net.ipv4.conf.eth0.forwarding = 0
net.ipv4.conf.eth0.mc_forwarding = 0
net.ipv4.conf.lo.forwarding = 1
net.ipv4.conf.lo.mc_forwarding = 0
net.ipv4.conf.wlan0.forwarding = 0
net.ipv4.conf.wlan0.mc_forwarding = 0
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.mc_forwarding = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.default.mc_forwarding = 0
sysctl: reading key "net.ipv6.conf.default.stable_secret"
net.ipv6.conf.eth0.forwarding = 0
net.ipv6.conf.eth0.mc_forwarding = 0
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
net.ipv6.conf.lo.forwarding = 1
net.ipv6.conf.lo.mc_forwarding = 0
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
net.ipv6.conf.wlan0.forwarding = 0
net.ipv6.conf.wlan0.mc_forwarding = 0
sysctl: reading key "net.ipv6.conf.wlan0.stable_secret"

インターフェイスごとにオプションがあるけど net.ipv4.conf.all.forwarding = 1 だから問題ないんだろうなと思ってたらそれ間違いで、実際は all に加えて両方のインターフェイスの forwarding を 1 にする必要があった。

つまり、

net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.eth0.forwarding = 1
net.ipv4.conf.wlan0.forwarding = 1

を加える必要がある。

コメント

このブログの人気の投稿

ISUCON 7 予選に参加した話