PeplinkのルーターAPIをcurlで叩く方法

Peplink,導入ガイド・ハウツー,技術情報Peplink

PeplinkのルーターAPIをcurlで叩く方法

PeplinkのルーターAPIではデバイスの状態や
SpeedFusionVPNの回線情報を取得することが可能です。

Peplink公式のAPIドキュメントも下記URLから閲覧が可能となっています。
https://download.peplink.com/resources/Peplink-Router-API-Documentation-for-Firmware-8.5.0.pdf

以前の記事ではPostmanというツールを使用したAPIの叩き方を紹介しましたが
今回はcurlというコマンドライン(コマンドプロンプト等)からHTTPリクエストが行えるツールを使った方法で叩いてきます!

弊社ではこちらとPythonを組み合わせて、スループットや電波品質のデータを毎秒自動で取得してcsv形式に保存するツールなどを作成しています。 機会があればそちらの方法も共有予定です。

Peplink公式のAPIドキュメントコマンドについて

問題点

公式のAPI資料のコマンド例では、主に2つの理由でそのままでは動作しないことがあります。

  1. 通信プロトコルの問題(全OS共通): http 接続になっており、 https での接続が必須のため失敗します。
  2. コマンド構文の問題(Windows特有): Mac/Linuxを前提とした記法のため、Windowsではエラーになります。
curl -c cookies.txt -H "Content-Type: application/json" -X POST -d'{"username":"user","password":"pass"}' http://192.168.1.1/api/login

本記事ではこの動作しない場合の回避策を共有します!

Windowsの場合、下記でログインが可能です。

curl -k -c cookies.txt -H "Content-Type: application/json" -X POST -d "{\"username\":\"user\",\"password\":\"pass\"}" https://192.168.1.1/api/login

userpassはPeplinkのWebAdminにログインする時のものに置き換えてください。

IPアドレスの部分はデバイスのIPアドレスに置き換えてください。

※APIを使うには、まずログインする必要があるので上記コマンドから行う必要があります。

※Windowsのコマンドプロンプトでは挙動が異なるため、公式ドキュメントのシングルクォート( ' )をダブルクォート( " )に修正しています。

※同様の理由でエスケープ( )も活用しています。

実演

※この記事ではあえて失敗部分を載せています 。

まずPeplinkルーターにクライアント(PC)を繋ぎます。

今回は有線で接続を行っています。

Windowsボタン+Rからcmdを指定して実行すると素早く開くことができます。

ショートカットからコマンドプロンプトを起動している場面
ショートカットからコマンドプロンプトを起動している場面

コマンドプロンプトに ipconfig を入力してIPアドレスが割り振られたか確認をします。
割り振られていない場合はDHCPが有効になっているのか確認を行ってください。

C:\Users\Tanaka>ipconfig
~略~
イーサネット アダプター イーサネット 2:

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: fe80::23cd:15dc:3803:fa5d%18
   IPv4 アドレス . . . . . . . . . . . .: 192.168.XXX.XXX
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .: 192.168.XXX.XXX

curlでAPIを叩く

確認出来たら早速資料に記載してある通りに入力をして進めて行きます。
※XXX部分はデバイスに設定してあるものに置き換えております。

C:\Users\Tanaka>curl -c cookies.txt -H "Content-Type: application/json" -X POST -d "{\"username\":\"XXX\",\"password\":\"XXX\"}" http://192.168.XXX.XXX/api/login
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

302 Foundというメッセージが出力されるのを確認しました。
これはリクエストしたページが別の場所(URL)に移動したことを示すHTTPステータスコードです。

ブラウザでアクセスした場合自動的に新しいURLへ移動しますが、 curl コマンドでは自動で移動してくれません。

curl コマンドに -L オプションを追加することで、リダイレクト先のURLへ自動的にアクセスできるようになるのですが、HTTPのPOSTからHTTPSへのリダイレクトではPOSTデータが維持されず認証情報が失われ、 Unauthorized になってしまいます。

※他にも-kコマンドが追加されていますがこれについては後述します。

C:\Users\Tanaka>curl -k -L -c cookies.txt -H "Content-Type: application/json" -X POST -d "{\"username\":\"XXX\",\"password\":\"XXX\"}" http://192.168.XXX.XXX/api/login
{
  "stat": "fail",
  "code": 301,
  "message": "Unauthorized"
}

なのでログイン情報を投げる先を下記の用に変更して試していきます。

https://192.168.XXX.XXX/api/login

curl -c cookies.txt -H "Content-Type: application/json" -X POST -d "{\"username\":\"XXX\",\"password\":\"XXX\"}" https://192.168.XXX.XXX/api/login

叩いた結果はこちら

C:\Users\Tanaka>curl -c cookies.txt -H "Content-Type: application/json" -X POST -d "{\"username\":\"XXX\",\"password\":\"XXX\"}" https://192.168.XXX.XXX/api/login
curl: (60) schannel: SNI or certificate check failed: SEC_E_WRONG_PRINCIPAL (0x80090322) - 対象のプリンシパル名が間違っ ています。
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the webpage mentioned above.

しかし別のメッセージが出力されてしまいましたね。
これは接続先サーバーの身元を確認できなかったために発生する、セキュリティ上の警告です。

これはSSL証明書が通常 www.example.com のようなドメイン名に対して発行されるためです。

ルーターなどの機器は、自身のホスト名が書かれた自己署名証明書を持っているため
IPアドレスでアクセスするとこのエラーが起こるのが一般的です。

  • アクセスしようとしているIPアドレス: 192.168.XXX.XXX
  • 機器が提示した機器のホスト名: b-one-5g-1ec6

ではこのセキュリティ警告を無視してアクセスするように-k オプションを入れてみましょう!

curl -k -c cookies.txt -H "Content-Type: application/json" -X POST -d "{\"username\":\"XXX\",\"password\":\"XXX\"}" https://192.168.XXX.XXX/api/login

叩いた結果はこちら

C:\Users\Tanaka>curl -k -c cookies.txt -H "Content-Type: application/json" -X POST -d "{\"username\":\"XXX\",\"password\":\"XXX\"}" https://192.168.XXX.XXX/api/login
{
  "stat": "ok",
  "response": {
    "permission": {
      "GET": 1,
      "POST": 1
    }
  }
}

無事にログインすることができました!

まとめ

ログインができると他のコマンドも使えるようになりますので、

下記項目に気を付けて活用していきましょう!

  • httpとhttpsの違い
  • -k オプションによるセキュリティ警告の無視

Q&A

Q1:デバイスAPIは無料で使えるの?

A1:無料で使えます。

Q2:デバイスAPIの他にはないの?

A2:Peplinkデバイスのクラウド管理ツールであるInControl2(IC2)のAPIもございます。

Q3:APIを使えば具体的にどんなことができるの?

A3:回線状態の取得や一部設定の変更を自動化できます。自社システムと連携すれば、監視や運用の効率化に役立ちます。

おすすめ記事

Visited 10 times, 1 visit(s) today