子育てしながらエンジニアしたい

現在 2 歳女の子の子育て中エンジニアによる、技術系 + 日常系ブログ。

Raspberry pi を NAT ルーター兼 DHCP + DNS サーバーにしたい

やっぱり外にもつなぎたい...

前回の記事で、クローズネットワーク内に Raspberry pi を置いて、DHCP + DNS サーバーにしました。

edosha.hatenablog.jp

当然ながらクローズネットワークなので、外には出られません。
しかし開発をしていると、どうしても外につなぎたいことがあります。

pip とか apt-get とか...

そのときにいちいち回線をつなぎ直すのは面倒です。
なので、前回使った Raspberry pi に NAT ルーターの機能を追加することにしました。

ネットワークの完成イメージ

f:id:edosha:20170706112816p:plain:w500

すでに外につながる PPPoE ルーターがあり、その配下に Raspberry pi を置くことにします。
そのまた下にクローズネットワークを構築します。

このとき、Raspberry pi 配下にある端末へのアクセスに対しては Raspberry piDNS サーバーとして動作し、
そうでない端末 (google.com とか) には、Google DNS (8.8.8.8) を使うことにします。

必要な部品

Raspberry piEthernet の口が一つしかありません。
しかし上記のようなネットワークを組むには、LAN 側と WAN 側の 2 つの Ethernet が必要になります。

そこで、WAN 側には USB-Ethernet 変換を使うことにしました。
下記の製品であれば、ドライバーがすでに Raspbian の中に入っているので、これにしました。

自分の環境では、USB ポートにさすだけで eth1 として認識されました。

Raspberry pi の設定

それでは Raspberry pi の設定をします。
前回設定した Dnsmasq の一部書き換えと、IP 転送の設定をします。

Dnsmasq の書き換え

一行だけ書き換えれば OK です。
DHCP でアドレスを配るときに、アクセスすべき DNS サーバーのアドレスを追加するようにします。

/etc/dnsmasq.more.conf を開いて、前回の記事では以下のようになっているところを...

# DHCPクライアントに通知するDNSサーバのIPアドレス
dhcp-option = option:dns-server, 192.168.0.1

192.168.0.1 のあとに 8.8.8.8 を追加するだけです。

# DHCPクライアントに通知するDNSサーバのIPアドレス
dhcp-option = option:dns-server, 192.168.0.1, 8.8.8.8

そして Dnsmasq サービスを再起動しましょう。

$ sudo service dnsmasq restart

IP 転送の許可

Stack overflow の回答を参考にしました。

raspberrypi.stackexchange.com

まずは /etc/sysctl.conf を開きます。

$ sudo emacs /etc/sysctl.conf

この中で、#net.ipv4.ip_forward=1 となっているところがあるので、その # を消します。

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1  # <-- コメントアウトを解除する

次に、以下のように IPv4 の転送を有効にします。

$ sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

iptables の設定

最後に iptables の設定をします。
なお以下に記載する設定は、eth0 がクローズネットワーク側、eth1 が外側なので、ご留意ください。

まず iptables に残っているエントリを全部消去します。

$ sudo iptables -F
$ sudo iptables -X
$ sudo iptables -t nat -F
$ sudo iptables -t nat -X
$ sudo iptables -t mangle -F
$ sudo iptables -t mangle -X
$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -P OUTPUT ACCEPT

次に eth0 - eth1 間の通信を有効にします。

$ sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$ sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

これで、外側への通信ができるようになったはずです。

このままではリブートしたあと設定が消えてしまうので、この設定をセーブし、起動時に読み込めるようにします。
まず、設定をファイルに書き出します。

$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

このファイルを起動時に読み込むようにするために、/etc/rc.local の exit 0 の上に以下の記述を追加します。

sudo iptables-restore < /etc/iptables.ipv4.nat

これで再起動しても大丈夫になりました。