2018年9月30日日曜日

Raspberry Piでネットワークルーティング

またしても需要がなさそうですが、Raspberry Piで2つのプライベートネットワーク間をルーティングします。

ググるとRaspberry PiをDHCP & default gateway にする方法はたくさん出てくるのですが、
DHCP と default gateway は普通の WiFi ルータに任せて、プライベートセグメントだけルーティングする、という面倒なことをやろうとしたら情報がなかったので。

やりたいこと

図のように、WiFiルータが2つあって、それぞれ LAN1(192.168.1.0/24) と LAN2(192.168.2.0/24) のネットワークを作っています。
LAN1 には NAS がぶら下がっていて、普段作業する Mac なども繋がっています。
一方、LAN2 には子供が使う Windows マシンが繋がっています。
このままでもそれぞれの WiFi ルータからネット接続できるのですが、
LAN2 側から NAS を使いたかったので Raspberry Pi でゲートウェイすることにしました。
ただし、DHCPはそれぞれのWiFiルータなので default gateway はWiFiルータです。

普通はWiFiルータ2をWiFiコンバータにすれば済む話なのですが、
たまたまWiFiルータが1台余っていたので。

しかも、自宅の壁面にマルチメディアコンセントが埋め込まれているのですが、
そこにLANケーブルを挿すとグローバルネットワークになってしまうのでこんなことに。
本当は天井裏のハブをルータに置き換えて、壁面配線をプライベートネットワークにしたいのですがそれはまた別の話。

Raspberry Piでルーティングする

Raspberry Piを有線と無線の両方につないだとしても、そのままではルーティングしてくれません。
IP forwardを許可して iptables を設定すればOKです。

まず、/etc/sysctl.conf に「#net.ipv4.ip_forward=1」という行があるのでコメントを外します。
その後、/proc/sys/net/ipv4/ip_forwardに「1」を書き込んで reboot。
root@raspberrypi:~ # echo -n 1 > /proc/sys/net/ipv4/ip_forward
root@raspberrypi:~ # reboot
さらに、ルーティングされるようにiptables に設定を追加。
素通しするだけだから「nat」とか要らないかなぁ、という気もしますが、細かい設定はよく分かりません。
誰かちゃんとした設定を教えて、エロい人。
root@raspberrypi:~ # iptables -F
root@raspberrypi:~ # iptables -X
root@raspberrypi:~ # iptables -t nat -F
root@raspberrypi:~ # iptables -t nat -X
root@raspberrypi:~ # iptables -t mangle -F
root@raspberrypi:~ # iptables -t mangle -X
root@raspberrypi:~ # iptables -P INPUT ACCEPT
root@raspberrypi:~ # iptables -P FORWARD ACCEPT
root@raspberrypi:~ # iptables -P OUTPUT ACCEPT
root@raspberrypi:~ # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
root@raspberrypi:~ # iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
「iptables -L」でこんな感じの出力になれば成功です。
root@raspberrypi:~ # iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  
この状態で Raspberry Pi はルーティングしてくれるはずですが、
Windows マシンから 192.168.1.x のアドレスに ping を打っても返ってきません。
それは Raspberry Pi とは別の理由なので後で対応します。

iptables が起動時に設定されるようにする

Raspbian は標準で iptables が入っていますが、起動時に設定を反映してくれないようです。
「iptables-persistent」というパッケージを入れれば良い模様。

インストールは単に「sudo apt-get install iptables-persistent」でOK。
インストール時に現在のiptablesを保存するか聞かれるので「YES」。
その後、再起動すれば iptables が再設定されます。

Windowsから別セグメントのファイルサーバにアクセスできるようにする

これでルーティングされているはずなのですが Windows から NAS に ping が通りません。
なぜなら、Windows の default gateway が WiFi router2 になっているから。
WiFi router2 は NAS のアドレスを知らないため、インターネット側にルーティングしてしまいます。

もし、WiFi router2 の設定で、192.168.1.0/24 を Raspberry Pi にルーティングできるなら設定します。
普通の家庭用 WiFi ルータではそんな細かい設定ができないことが多いので、今回は Windows 側で頑張ります。

とは言え、Windows でも通常のコントロールパネルからは設定できません。
管理者権限でDOSプロンプトを開いて次のコマンドを実行。
# route -p add 192.168.1.0/24 192.168.2.10
「192.168.2.10」は Raspberry Piの LAN2 側アドレスです。
「-p」オプションは persistent のことで、このオプションを付けると再起動後にも反映されます。
もしいきなり試すのが怖ければ「-p」無しで実行すれば再起動で元に戻ります。

ここまで設定できたら Windows から ping を打ってみます。
# ping 192.168.2.10
PING 192.168.2.10 (192.168.2.10): 56 data bytes
64 bytes from 192.168.2.10: icmp_seq=0 ttl=64 time=2.546 ms
  :
# ping 192.168.1.10
PING 192.168.1.10 (192.168.1.10): 56 data bytes
64 bytes from 192.168.1.10: icmp_seq=0 ttl=64 time=2.546 ms
  :
# ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
・・・あれ?
Raspberry Pi の LAN1 側アドレスからは応答があるので、ルーティングはできています。
ところが、LAN1に繋がっているNASから応答がありません。

これは、NAS までは ping が通っています。
NAS から戻ってくるときに、NAS 側の default gateway が WiFi router1 になっているからです。
またかよ。

基本的に NAS からインターネットアクセスすることはないと思いますので、
NAS の default gateway を Raspberry Pi (192.168.1.10) にすれば大丈夫です。
もちろん、192.168.2.0/24 だけを振っても良いですが、家庭用NASではそんな設定はできないと思います。

Windowsのhostsファイルを編集する

これで、 LAN2 側の Windows から LAN1 側の NAS につながるようになりました。
ただし、このままだと名前解決できないので常に IP アドレスで繋ぐことになります。

Raspberry Pi で DNS を動かしても良いですが面倒なので Windows の hosts ファイルに直接書き込んでしまいます。
メモ帳を管理者権限で開いて hosts ファイルの末尾に設定を追加します。
Windows10 の hosts ファイルは「C:\Windows\System32\drivers\etc\hosts」です。
# cat C:\Windows\System32\drivers\etc\hosts
   :
192.168.1.10  NAS
これでホスト名でファイルサーバにアクセスできるようになりました。

おわり。

0 件のコメント:

コメントを投稿