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

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

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

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

Raspberry pi を DHCP + DNS サーバーにしたい

f:id:edosha:20170622083157j:plain:w400

クローズネットワークの台数増加

クローズネットワークを組んで使っています。
最初は台数が少なかったので固定 IP でよかったのですが、台数増加に伴い DHCP サーバーが欲しくなってきました。
ついでに名前もつけてあげれば IP を気にする必要がなくなります。
そこで、Raspberry piDHCPDNS サーバーに仕立て上げることにしました。

使用したのは Raspberry pi 3 Model B です。

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
SSH を有効にする

SSH を有効にするには raspi-config から行います。

pi@raspberrypi:~ $ sudo raspi-config

以下のような設定画面が出てきます。

f:id:edosha:20170622090958p:plain:w600

ここで、"5 Interfacing Options" を選択、"P2 SSH" を選択して、Yes を選択すれば OK。

SSH の接続確認

Windows なら Tera term とか、Mac ならターミナルとかから接続できるか確認します。
デフォルトのユーザ名は pi、パスワードは raspberry です。

$ ssh pi@192.168.0.1

これでディスプレイとか USB 類を外し、SSH 経由で操作できるようになりました。

emacs のインストー

ここからは、いろいろとテキストをいじっていくことになります。
nano は使い慣れていないので、大好きな emacs をインストールしておきます。

$ sudo apt-get install emacs

Caps lock を Ctrl にする

以下のサイトのまんまです。

l-w-i.net

/etc/default/keyboard というファイルを書き換えます。

$ sudo emacs /etc/default/keyboard

途中に XKBOPTIONS という部分があるので、そこを以下のように書き換えます。

XKBOPTIONS="ctrl:nocaps"

このあと再起動すれば OK。

DHCP + DNS サーバーの導入

大部分は以下のリンクを参考にしました。
一部、DNS の設定や運用部分を追記しています。

gazee.net

Dnsmasq のインストー

apt-get でインストールします。

$ sudo apt-get install dnsmasq

設定

設定ファイルを編集します。

$ 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 で作りました。
ただこのあと、結局このネットワークを外につなぎたくなりました。
そのときの続編はこちらからどうぞ。

edosha.hatenablog.jp

香川県移住体験ツアー6: まとめ

移住体験ツアーのまとめ

今まで 5 回にわたって執筆してきた移住体験ツアーですが、本記事のまとめが最後になります。

各記事の概要と、全体としてどんなことを感じたのか、まとめたいと思います。

各記事について

1: 準備編

この準備編では、移住コーディネーターさんと、香川県政策部地域活力推進課さんに旅程の相談をさせていただきました。
ここで空き家バンクの見学や、先輩移住者とのインタビューなどをセッティングしていただきました。
知り合いのいない移住希望者がこういったことをセッティングするのはかなり難しいので、本当に助かりました。
今移住を希望されている方は、このような支援を最大限に活用すると良いのではないかと思います。

2: 取材編

取材編では、準備編でお世話になった方々に実際にお会いしました。
そして香川県での生活に対する生の声を伺うことができました。

この取材を通じて感じたのは、実際に住んでいる方の声はネットでは得られないこと、そして、
こういう生の声を得るには自治体にコンタクトを取るのが実は手っ取り早いのではないか、ということです。

自治体に相談するのはハードルが高いな、と自分自身は感じていましたが、それによって得られる情報はとても大きいと感じました。

3: 三木町編

三木町では、空き家バンク見学、役場で移住相談、そして子どもの遊び場訪問をしました。
空き家バンク物件は自然に囲まれたとても素敵な環境にあり、移住後の生活を想像することができました。
役場では本当に温かい対応をしていただき、移住への期待が増し、不安が減りました。
また遊び場では三木町在住の子連れお母さんとお話をして、三木町の子育て環境の良さを聞けました。

初めて行った三木町でしたが、ここは本当に良いところだと感じました。

4: 三豊市編

三豊市では道の駅訪問もしましたが、なんといっても先輩移住者との対談です。
私と同じような立場である先輩移住者の声を聴くことができ、本当にありがたい機会となりました。
良かったことだけでなく、考えさせられることも全部、教えていただきました。
このとき感じたのは、

自分たちにとって何が大切なのか、しっかり考えて移住を決めるべきだと感じました。

ということです。

5: 丸亀市編

丸亀市ではスーパー、子どもの遊び場、そして市役所を訪問しました。
もともと飯野山の風景が気に入っており、また今回はスーパーと子どもの遊び場の良さを知ることができました。
また、移住や子育て支援のメニューは、市町によって異なるということを知りました。
ここでもやはり「自分たちにとって何が大切なのか」を考えなければという気持ちになりました。

まとめ

移住ツアーでは、香川県のいろんな良さを知ることができました。
自然だったり、食だったり、、
でも自分にとって一番印象的だったのは、人の良さだったのかもしれません。
準備編からお世話になった香川県庁の方々、役場の方々、先輩移住者、公園で出会った方々...
とてもあたたかく接していただきました。

もう一つ感じたのは、移住にあたって「自分にとって何が一番大切なのか」をしっかり考える必要があるということです。
あらゆるすべてのことが理想通りという場所はありえないと思います。
であれば、他のことは多少理想と違ったとしても、最も大切なことが叶えられる場所なら良いと思うのです。
自分の中の「優先順位」。
これをはっきりさせるのは実はとても難しいことですが、真剣に自分の心と向き合わなければと思いました。

f:id:edosha:20170613075147j:plain:w400


最後に、今回の移住体験ツアーでお世話になった香川県庁の方々、役場の方々、先輩移住者、公園で出会った方々に、心からの感謝を述べさせていただきたいと思います。
貴重な経験をさせていただき、本当にありがとうございました!!

そして、移住することになった場合は、どうぞよろしくお願いいたします!!

香川県移住体験ツアーシリーズ