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
これで再起動しても大丈夫になりました。
Raspberry pi を DHCP + DNS サーバーにしたい
クローズネットワークの台数増加
クローズネットワークを組んで使っています。
最初は台数が少なかったので固定 IP でよかったのですが、台数増加に伴い DHCP サーバーが欲しくなってきました。
ついでに名前もつけてあげれば IP を気にする必要がなくなります。
そこで、Raspberry pi を DHCP 兼 DNS サーバーに仕立て上げることにしました。
使用したのは Raspberry pi 3 Model B です。
Raspberry Pi3 Model B ボード&ケースセット 3ple Decker対応 (Element14版, Clear)-Physical Computing Lab
- 出版社/メーカー: TechShare
- メディア: エレクトロニクス
- この商品を含むブログ (4件) を見る
OS は Raspbian Jessie Lite の April 2017 バージョンを使用しました。
Raspberry pi の初期設定
SSH を有効にする
通常 Raspberry pi はディスプレイと USB マウス/キーボードを接続して操作しますが、DHCP + DNS サーバーにそんなものは贅沢です。
どうせローカルネットワークに入るので、SSH を有効にして SSH 経由で操作できるようにしました。
以下のリンクを参考に。
qiita.com
IP アドレスの設定
SSH でつなぐには IP アドレスを知らないといけません。
というわけで Raspberry pi に固定アドレスを振ることにしました。
2017/07/06 追記
OS Raspbian Jessie からは、/etc/network/interfaces ではなく /etc/dhcpcd.conf をいじるのが正しいようです。
なぜか /etc/network/interfaces でうまくいっていたのですが、Raspberry pi を 2 台導入して同じことをやろうとしたら、できませんでした。
なので /etc/dhcpcd.conf の書きかえ方も記載しておきます。
sudo nano /etc/dhcpcd.conf
最後の方に以下の記述を入れます。
interface eth0 static ip_address=192.168.0.1/24 static domain_name_servers=192.168.0.1
こちらは古い記述です。
アドレスは /etc/network/interfaces の編集で行います。
sudo nano /etc/network/interfaces
eth0 インターフェースに 192.168.0.1 を割り当てます。
auto eth0 iface eth0 inet static address 192.168.0.1 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 dns-nameservers 127.0.0.1 192.168.0.1 dns-search local
emacs のインストール
ここからは、いろいろとテキストをいじっていくことになります。
nano は使い慣れていないので、大好きな emacs をインストールしておきます。
$ sudo apt-get install emacs
Caps lock を Ctrl にする
以下のサイトのまんまです。
/etc/default/keyboard というファイルを書き換えます。
$ sudo emacs /etc/default/keyboard
途中に XKBOPTIONS という部分があるので、そこを以下のように書き換えます。
XKBOPTIONS="ctrl:nocaps"
このあと再起動すれば OK。
DHCP + DNS サーバーの導入
大部分は以下のリンクを参考にしました。
一部、DNS の設定や運用部分を追記しています。
設定
設定ファイルを編集します。
$ sudo emacs /etc/dnsmasq.conf
/etc/dnsmasq.conf の下のほうにある
#conf-file=/etc/dnsmasq.more.conf
の#を削除します。
# Log lots of extra information about DHCP transactions. #log-dhcp # Include another lot of configuration options. conf-file=/etc/dnsmasq.more.conf #conf-dir=/etc/dnsmasq.d # Include all the files in a directory except those ending in .bak #conf-dir=/etc/dnsmasq.d,.bak
この /etc/dnsmasq.more.conf を作成して編集します。
$ sudo emacs /etc/dnsmasq.more.conf
# ローカルホスト名を上位DNSに転送しない domain-needed # ローカルIPアドレスの逆引きを上位DNSに転送しない bogus-priv # ショートドメイン名を補完するドメイン名(hoge -> hoge.local) local = /local/ # ローカルドメイン名 domain = local # ショートホスト名を補完する expand-hosts # DHCPで割り当てするアドレスの範囲とリース時間 dhcp-range = 192.168.0.50, 192.168.0.200, 12h # DHCPクライアントに通知するルータのIPアドレス dhcp-option = option:router, 192.168.0.1 # DHCPクライアントに通知するDNSサーバのIPアドレス dhcp-option = option:dns-server, 192.168.0.1 # 固定アドレスをふって、名前をつける dhcp-host = aa:aa:aa:aa:aa:aa, pc1, 192.168.0.10, infinite # 名前だけつける dhcp-host = bb:bb:bb:bb:bb:bb, pc2
これでクライアントに関しては DNS/DHCP ともに動作します。
ただこの方法だと、dnsmasq が DHCP を発行した場合のみ名前解決がされるようで、固定アドレス (Raspberry pi 自身) を最初から持っているものは名前解決できませんでした。
これを解決するには、/etc/hosts に名前を書けば良いようです。
$ sudo emacs /etc/hosts
Raspberry pi 自身のアドレスを書きます。
127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters 127.0.1.1 raspberrypi 192.168.0.1 raspi.local raspi
設定ができたので dnsmasq を再起動します。
$ sudo service dnsmasq restart
運用
DHCP リース記録の確認
どのように DHCP がリースされたかが気になったので調べてみました。
/var/lib/misc/dnsmasq.leases を見ることで実現できます。
$ cat /var/lib/misc/dnsmasq.leases 0 aa:aa:aa:aa:aa:aa 192.168.0.10 pc1 01:aa:aa:aa:aa:aa:aa:aa 1506215087 bb:bb:bb:bb:bb:bb 192.168.0.50 pc2 01:bb:bb:bb:bb:bb:bb
一番左がリース時間のようです。
不要な DHCP リースの削除
dnsmasq の設定をいろいろ試していると、リース時間無限大でいらないエントリが残ってしまいました。
そういうものを消すには、単に上記の /var/lib/misc/dnsmasq.leases の不要な行を消せば良いようです。
その場合は、いったん dnsmasq のサービスを止めたほうが良さそうです。
$ sudo service dnsmasq stop $ sudo emacs /var/lib/misc/dnsmasq.leases
0 aa:aa:aa:aa:aa:aa 192.168.0.10 pc1 01:aa:aa:aa:aa:aa:aa:aa
$ sudo service dnsmasq start
これでローカルネットワークの使い勝手が向上しました。
続編
今回はクローズネットワークを Raspberry pi で作りました。
ただこのあと、結局このネットワークを外につなぎたくなりました。
そのときの続編はこちらからどうぞ。
香川県移住体験ツアー6: まとめ
移住体験ツアーのまとめ
今まで 5 回にわたって執筆してきた移住体験ツアーですが、本記事のまとめが最後になります。
各記事の概要と、全体としてどんなことを感じたのか、まとめたいと思います。
各記事について
1: 準備編
この準備編では、移住コーディネーターさんと、香川県政策部地域活力推進課さんに旅程の相談をさせていただきました。
ここで空き家バンクの見学や、先輩移住者とのインタビューなどをセッティングしていただきました。
知り合いのいない移住希望者がこういったことをセッティングするのはかなり難しいので、本当に助かりました。
今移住を希望されている方は、このような支援を最大限に活用すると良いのではないかと思います。
2: 取材編
取材編では、準備編でお世話になった方々に実際にお会いしました。
そして香川県での生活に対する生の声を伺うことができました。
この取材を通じて感じたのは、実際に住んでいる方の声はネットでは得られないこと、そして、
こういう生の声を得るには自治体にコンタクトを取るのが実は手っ取り早いのではないか、ということです。
自治体に相談するのはハードルが高いな、と自分自身は感じていましたが、それによって得られる情報はとても大きいと感じました。
3: 三木町編
三木町では、空き家バンク見学、役場で移住相談、そして子どもの遊び場訪問をしました。
空き家バンク物件は自然に囲まれたとても素敵な環境にあり、移住後の生活を想像することができました。
役場では本当に温かい対応をしていただき、移住への期待が増し、不安が減りました。
また遊び場では三木町在住の子連れお母さんとお話をして、三木町の子育て環境の良さを聞けました。
初めて行った三木町でしたが、ここは本当に良いところだと感じました。
まとめ
移住ツアーでは、香川県のいろんな良さを知ることができました。
自然だったり、食だったり、、
でも自分にとって一番印象的だったのは、人の良さだったのかもしれません。
準備編からお世話になった香川県庁の方々、役場の方々、先輩移住者、公園で出会った方々...
とてもあたたかく接していただきました。
もう一つ感じたのは、移住にあたって「自分にとって何が一番大切なのか」をしっかり考える必要があるということです。
あらゆるすべてのことが理想通りという場所はありえないと思います。
であれば、他のことは多少理想と違ったとしても、最も大切なことが叶えられる場所なら良いと思うのです。
自分の中の「優先順位」。
これをはっきりさせるのは実はとても難しいことですが、真剣に自分の心と向き合わなければと思いました。
最後に、今回の移住体験ツアーでお世話になった香川県庁の方々、役場の方々、先輩移住者、公園で出会った方々に、心からの感謝を述べさせていただきたいと思います。
貴重な経験をさせていただき、本当にありがとうございました!!
そして、移住することになった場合は、どうぞよろしくお願いいたします!!