2023/07/31

Mikrotik CCRでDockerコンテナを動かす

 ## Mikrotik is 何

MikrotikとはラトビアにあるNW機器メーカーです。

誤自宅界隈では有名なブランドで、数年前に10G対応スイッチが激安で販売されたことで一躍有名になりました。

MikrotikにはCCR(Cloud Core Router)という製品ラインナップがあり、最近の機種はARM64プロセッサを積んだルータが販売されています。

最近のモデルで最廉価なものとしてCCR2004等があります。

廉価とは言っても日本円で10万円程度してしまうので、ご家庭用には少し厳しい価格帯です。

定価は500ドルを切っているので、円高に向かえばある程度手の届く価格になるのですが。。。

CCR等のMikrotik製品は「RouterOS」という独自OSが採用されており、現在メジャーバージョン7が提供されています。

そしてROSv7から提供される新機能として「Container機能」なるものがあります。


## Container機能

Container機能とは文字通り、ルータ上でDockerコンテナを動かす機能です。

前章で述べた通り現行のCCRはARM64プロセッサがのっており、一般的なOSと同様のアーキテクチャーで動いています。

そのため「Container機能」を使うとRouterOSのうえでLinux等のDockerコンテナを実行することが出来るのです。


ただ、制約はあり

・RouterOS v7.4beta以上のバージョンであること
・ARM64 or x86アーキテクチャであること
 ※公式ページにて確認可能

の条件を満たすことをご確認ください。

## 活用方法

ルータ上でコンテナを動かせるといっても、この機能は新しくまだあまりユースケースが見出されていません。

公式のナレッジではpiholeという広告ブロックなどの機能がついたDNSサーバが例に出されています。

OpenWRT等の汎用NOSではよくある使い方ですね。

Dockerコンテナを動かせる(=Linuxを動かせる)ということは何でもできるということと同義です。

ただ本来のルータ機能の余ったリソースを使って動かすため、空きリソース次第で出来ることは限られてきます。

## (例)Conoha DDNSクライアント

ConohaというWEBサービスをご存じでしょうか?

サーバやVPSのレンタルサービスを行っていて、他にもメールサーバやストレージなどサービスの種類は多岐にわたります。

中でもDNSサービスは無料で利用することが出来、APIとスクリプトを使うことで簡易的なDDNS機能を実装することもできます。

参考:https://www.neotitans.net/use-conoha-dns-api-to-update-record.html

有名なDDNSサービスは多くの場合、ルータなどのNW機器でもDDNSのアップデートが出来るようにサンプルConfigを公開しています。

しかし、Conohaで実装するDDNSはPythonのスクリプトを実行する必要があり多くの場合NW機器では実行することが出来ません。

そこでMikrotikのContainer機能を利用すれば、CronでのPythonスクリプトの定期実行を行うことが可能となります。


## 準備

Mikrotik用のコンテナイメージを作るため、まずDockerが使える環境を用意しましょう。
ARMアーキテクチャのイメージを作りますが、x86マシンで問題ないです。
今回はWindows10のWSL2環境でイメージを作成します。

まずはイメージ作成用のディレクトリを作り、移動します。

mkdir ~/ddns-alpine

cd ~/ddns-alpine 


このディレクトリには以下の3つのファイルを格納します。
  • Dockerfile
  • DDNSスクリプト(ddns.py)
  • Cronの設定ファイル(root)
DockerfileはDockerコンテナのOSやインストールするパッケージ情報などが書かれた設計図のようなものです。
サンプルのDockerfileは下記の通り

Dockerfile
FROM arm64v8/alpine
WORKDIR /
RUN apk --no-cache update
RUN apk add --no-cache python3 py3-pip
RUN pip3 install requests
RUN mv /etc/crontabs/root /etc/crontabs/root.backup
COPY ddns.py /ddns.py
COPY root /etc/crontabs/root
RUN chmod 755 /ddns.py
RUN chmod 600 /etc/crontabs/root
CMD ["crond","-f"]

 FROMでOS情報が指定されており、RUNでパッケージのインストールや権限の変更などを行っています。

次にDDNSスクリプトですが、今使ってるやつはあるんですが上で参照したサイトの修正版なので勝手に貼るわけにもいかず…

丸コピだと動かなかったと思うので(確か)、頑張ってサイトを参考に自分用に完成させてください…

cronの設定ファイルは、alpineでは「/etc/crontabs/root」となっているのでrootという名前のファイルにスクリプトの定期実行設定を入れます。

root

*/15    *       *       *       *       python3 /ddns.py

上は15分おきにDDNSのアップデートを実行する場合の例です。

 必要なファイルがそろったらビルドします。

当該ディレクトリにいる状態で下記のコマンドを投入します。

docker image build -t ddns:v0.1 .

ddnsと書かれた部分がイメージの名前です。

コロンの後に書かれたv0.1はバージョンなので、適宜変えてください。

最後の「.(ドット)」もお忘れなく。

実行すると数分で完了します。

完了後にビルドしたイメージをCCRで読み込むためtarファイルで書き出します。

docker save ddns:v0.1 > /mnt/c/ddns.v0.1.tar

※わかりやすようにCドライブ直下へ書き出しています。 

これでコンテナイメージは完成です。

次はCCR側の設定に移ります。


## CCRでの設定

Mikrotikは公式で「WinBOX」というGUI設定ツールを公開しておりますので、設定にはWinBOXを利用します

まず、公式サイトから「Extra Packages」をダウンロードします。


※WinBOXも上記ページからダウンロードできます。


ダウンロードしたzipを解凍し、中にある「container~.npk」をCCRに転送します。

この時に上で作ったコンテナイメージ(ddns.v0.1.tar)も転送しておきましょう。

解凍したファイルをWinBOXにドラッグすればCCRのroot直下に転送されます。

ここで一度再起動します。

System>Reboot

すると追加パッケージがインストールされます。

System>Package

Containerのパッケージが追加されていることをご確認ください。

ContainerをダブルクリックしEnableをクリックします。

すると右側のリストにContainerが表示され、機能が有効化されます。

ここからは公式ナレッジに従っていけばContainerが起動できます。

公式ナレッジ:https://help.mikrotik.com/docs/display/ROS/Container


GUIでも設定可能ですが、公式ナレッジに従ってコマンド形式で記載します。

WinBOXでも右の選択メニューから「New Terminal」をクリックすればコマンドでの設定が行えます。


①vethの設定

コンテナにアタッチする仮想IFの設定です。

NATするのでIPアドレスは何でもいいですが、一応既存のNWと被らないようにしましょう

/interface/veth/add name=veth1 address=172.17.0.2/24 gateway=172.17.0.1


②ブリッジIFの設定

vethを収容するブリッジを作成します。

/interface/bridge/add name=containers

/ip/address/add address=172.17.0.1/24 interface=containers

/interface/bridge/port add bridge=containers interface=veth1


③NATの設定

外部NWとルーティングしてもいいですが、ダイナミックルーティングが必要になるためNATマスカレードします。

/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.17.0.0/24


④コンテナ設定

コンテナイメージを展開します。

ナレッジでは環境変数等の設定を行っていますが、今回はコンテナに設定していないので必要ないです。

/container/add file=ddns.v0.1.tar interface=veth1 hostname=ddns


⑤コンテナの実行

コンテナを実行します。

末尾の0はCCR内の採番です。

/container/printで確認できます。

/container/start 0


⑥コンテナの状態確認

実行されたコンテナの状態を確認します。

runningになっていることを確認してください。

/container/print


これでコンテナの起動完了です。

DDNS機能はあくまで例なので、他にもいろいろな用途があると思います。

定期的にスクリプトを実行するようなものであれば、本記事を参考にすぐ作れるでしょう。

何かいい活用方法が見つかったらコメントいただけると幸いです。


0 件のコメント:

コメントを投稿