デバイスは多々ありそうなので静的IPの登録を Rails 経由でやってみる。
FreeRADIUS を使うと DHCP の静的IPの設定を DB 側に保存できるらしいので使ってみた。
ということでサンプル的なアプリケーションを書いてみた。(https://github.com/atton-/freeradius_dhcp_with_rails)
IP の最後のオクテットと、デバイスの MacAddress を入力すると、DHCP サーバから IP を取得できます。
環境
- OSX Yosemite 10.10.5
- Ruby 2.2.3
- Rails 4.2.4
- Docker 1.8.1
- FreeRADIUS 3.0.4
- PostgreSQL 9.4.5
使いかた
まず Docker で PostgreSQL と FreeRADIUS 用のコンテナを起動。
FreeRADIUS 用のコンテナに直接入って、起動しているコンテナの情報に合わせて /etc/raddb/sites-enabled/dhcp.relay を書き換えてから radiusd を起動。
Rails 側でクライアントとなるデバイスの Mac Address と IP を登録。
そうすると DHCP で特定の Mac Address 宛に Static な IP が振られます。
解説とか
まず DHCP の設定は このページを参考に FreeRADIUS の設定。
基本的な設定はデフォルトのままでもOKです。
ちょっと問題なのが mods-config/sql/main/postgresql/queries.conf の設定。
元々のサンプルは /etc/raddb/mods-config/sql/main/postgresql/setup.sql や /etc/raddb/mods-config/sql/main/postgresql/schema.sql を利用しているのですが、これで使っている attribute という column name が ActiveRecord 的にアウト。
なので適当に名前を変えます。
今回使うテーブルは radcheck と radreply 。こいつの構造を保ったまま名前を変えます。
元の schema は username, attribute, value, op の 4 column + id。
username が mac address に相当して, value, op, attribute は config の key, op, value に対応してるっぽいです。
例えば attribute = 'DHCP-Your-Address', op = '=', value = '192.168.100.1' とか。
元は DHCP-Your-Address = 192.168.100.1 みたいに書いてたんだろうなー、とか想像したり。なのでいろんな情報とか突っこめそう。
それはさておき column の name を以下に変更。 op と value は変更無し。
- username => mac_address
- attribute => radius_attribute
対応するように queries.conf の query を書き換えます。
あとは Rails 側で radcheck 相当のモデル radius_check_information を作って、 mods-available/sql で参照している radcheck を radius_check_informations に変更。
同じように radreply もやってしまいます。
これで DHCP の Static IP の情報を DB に突っこむのはできました。
あとは rails 側でよしなにフォーマットに合うようにレコードを追加してあげたらOK。
引っかかったところ
Docker 側で dhcp とかを扱おうとすると arp table とかをいじろうとしてコケることが。
その場合は docker run する時に --privileged してやると良いみたいです。
あと Docker だと FreeRADIUS の実行ユーザとグループを root にしておかないと dhcp の返事ができないっぽいです。
具体的なコマンドとか
Docker で起動時の IP を使って FreeRADIUS の設定とかをしなかったので、ある程度手動で設定する必要があります。
なので具体的なコマンドとかを載せておこうと思います。
- $ git clone https://github.com/atton-/freeradius_dhcp_with_rails
- $ cd freeradius_dhcp_with_rails
- $ docker build -t pg94 docker/postgres
- $ docker run -itd --name postgres-server -p 5432:5432 -e POSTGRES_PASSWORD=hogehoge pg94
- $ docker build -t freeradius_with_rails/freeradius-dhcp docker/freeradius-dhcp
- $ docker run --privileged --link postgres-server:postgres-server --name dhcp-server -it freeradius_with_rails/freeradius-dhcp
- これで bash が起動します。
- ip a してその IP Address を確認。 (ex: 172.17.0.50)
- ip r してクライアントの Router を確認 (ex: 172.17.42.1)
- 今回はクライアントも Docker で上げてみます。
- なので Router は Docker Private Network の gateway です
- /etc/raddb/sites-enabled/dhcp.relay を編集
- DHCP-Domain-Name-Server に DNS を設定します (ex: 8.8.8.8)
- DHCP-DHCP-Server-Identifier に DHCP サーバの IP を設定します (ex: 172.17.0.50)
- DHCP-Router-Address に DHCP クライアントのゲートウェイのIP を設定します (ex: 172.17.42.1)
- DHCP-Subnet-Mask に DHCP クライアントのネットワークのサブネットマスクを設定します (ex: 255.255.0.0)
- radiusd -X
- で FreeRADIUS を起動します
- $ docker run --privileged -it centos bash
- DHCP クライアント相当の Docker container です
- $ yum install -y dhclient
- $ ip addr
- とかして mac address を確認します (ex: 02:42:ac:11:00:37)
- $ rake db:create db:migrate
- $ rails server
- mac address と IP の値を入れます。 (ex: 02:42:ac:11:00:37, 100)
- 今回は 172.17.0.0/16 のIPを振ります。
- $ dhclient -d
- docker run --privileged -it centos bash のコンテナで実行します
- 172.17.0.100 が振られます。やったね。
まとめ
これでデバイスごとに静的IPを触れるDHCPサーバを Rails で管理できました。
前の記事にも書いた KVM を Ruby から触る機能と登録したIPに対応するDNSとかと連携すると、IPを申請したら静的にIPが振られてドメインが登録されたり、VMを template から clone してそのIPとドメインが自動申請されるようなシステムが作れます。やったね。
0 件のコメント:
コメントを投稿