Raspberry pi を NAT ルーター兼 DHCP + DNS サーバーにしたい
やっぱり外にもつなぎたい...
前回の記事で、クローズネットワーク内に Raspberry pi を置いて、DHCP + DNS サーバーにしました。
当然ながらクローズネットワークなので、外には出られません。
しかし開発をしていると、どうしても外につなぎたいことがあります。
pip とか apt-get とか...
そのときにいちいち回線をつなぎ直すのは面倒です。
なので、前回使った Raspberry pi に NAT ルーターの機能を追加することにしました。
ネットワークの完成イメージ
すでに外につながる PPPoE ルーターがあり、その配下に Raspberry pi を置くことにします。
そのまた下にクローズネットワークを構築します。
このとき、Raspberry pi 配下にある端末へのアクセスに対しては Raspberry pi が DNS サーバーとして動作し、
そうでない端末 (google.com とか) には、Google DNS (8.8.8.8) を使うことにします。
必要な部品
Raspberry pi は Ethernet の口が一つしかありません。
しかし上記のようなネットワークを組むには、LAN 側と WAN 側の 2 つの Ethernet が必要になります。
そこで、WAN 側には USB-Ethernet 変換を使うことにしました。
下記の製品であれば、ドライバーがすでに Raspbian の中に入っているので、これにしました。
BUFFALO Giga USB3.0対応 有線LANアダプター【 Nintendo Switch 動作確認済 】LUA4-U3-AGT
- 出版社/メーカー: バッファロー
- 発売日: 2014/06/25
- メディア: Personal Computers
- この商品を含むブログ (2件) を見る
自分の環境では、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 の回答を参考にしました。
まずは /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
これで再起動しても大丈夫になりました。