ネットワークマニフェスト

ネットワークマニフェスト #

Actcast アプリケーションの動作に必要なリソースを指定する Manifesto の中で "networks" フィールドに接続先を指定することで、必要な通信を行うことが出来るようになります。 特にこの指定を指して ネットワークマニフェスト と呼びます。

接続先の指定 #

ネットワークマニフェストには接続先を指定する方法が 3 種類あります。 ドメインを指定する方法、ローカルネットワーク全体を指定する方法、マルチキャストアドレスを指定する方法です。 前者二つの指定では指定したアドレスへの接続のみを許可する SOCKS プロキシが起動し、これを通した通信を行う必要があります。 マルチキャストアドレス指定の場合は、特別な手順を踏むこと無く通常通りの通信が可能になります。

ドメインを指定する方法 #

domain, port, protocolの組み合わせを指定します。

keydescription
domain接続先のインターネットホスト名
port接続先のポート番号
protocol接続時のプロトコル ("tcp" or "udp")

domain 内のワイルドカード #

接続先の domain はワイルドカード (*) を使用することで一部を任意の値として指定することもできます。

ワイルドカードはサブドメインの位置に使用でき、任意の英数字やハイフンにマッチします。

例: Amazon API Gateway

以下の Amazon API Gateway の REST API の URL の場合、https://{restapi_id}.execute-api.{region}.amazonaws.comrestapi_idregion を任意の値としたい場合は以下のように指定します。

*.execute-api.*.amazonaws.com

ワイルドカードは階層ごとに指定する必要があります。

例: {foo}.example.com{bar}.{foo}.example.com に接続させたい場合

以下の 2 つを指定します。

*.example.com
*.*.example.com

例: {foo}.example.comexample.com に接続させたい場合

以下の 2 つを指定します。

*.example.com
example.com

ローカルネットワーク全体を指定する方法 #

local_addr, port, protocolの組み合わせを指定します。IPv4 のプライベートアドレスの範囲(10/8, 172.16/12, 192.168/16)と IPv6 のユニークローカルアドレスの範囲(FD00::/8)に接続できるようになります。

keydescription
local_addrローカルアドレスを許可 (trueのみ指定可能)
port接続先のポート番号
protocol接続時のプロトコル ("tcp" or "udp")

スキーマの詳細な定義はhttps://actcast.io/schema/v6/manifesto_schema.jsonを確認して下さい。

例: ローカルネットワーク上の HTTP サーバへ接続する場合

デバイスの配置されたローカルネットワーク上にあるサーバの 80 番ポートにアクセスする場合、以下のように設定します。

"networks": [
    { "local_addr": true, "port": 80, "protocol": "tcp" }
]

マルチキャストアドレスを指定する方法 #

multicast_addr, port, protocol, direction を指定します。 IP マルチキャスト通信は 1 対多通信の 1 方向通信プロトコルです。このため direction で 送受信方向を指定します。

keydescription
multicast_addr通信先のマルチキャストアドレス (224.0.0.0/4)
port通信先のポート番号
protocol通信プロトコル ("udp"のみ指定可能)
direction送受信の種別 ("send" or "recv")

スキーマの詳細な定義はhttps://actcast.io/schema/v6/manifesto_schema.jsonを確認して下さい。

例: RTP サーバからマルチメディアデータを受信する場合

224.0.0.120 の RTP サーバからマルチキャストで配信されるデータを受信する場合、以下のように設定します。

"networks": [
    { "multicast_addr": "224.0.0.120", "port": 5001, "protocol": "udp", "direction": "recv" }
]

プロキシへの接続 #

ACTCAST_SOCKS_SERVER

ACTCAST_SOCKS_SERVER は Actcast アプリケーションのコンテナ起動時に設定される環境変数です。この環境変数には SOCKS プロキシのアドレスとポートが <IPアドレス>:<ポート番号> の形式で設定されています。

ネットワークマニフェストでドメインを指定する方法またはローカルネットワーク全体を指定する方法を使用した場合、指定したホストへ接続する際はこの環境変数で指定されたアドレスを使用します。

Examples #

ネットワークマニフェストを使用する例をご紹介します。

Python アプリケーションで https://actcast.io にアクセスする #

Python アプリケーションで SOCKS プロキシを利用する場合、例えば Requests パッケージと PySocks パッケージを利用できます。
これらを使用する場合、以下のように.actdk/dependencies.jsonpiprequestspysocksを追加します。

{
  ...
  "pip": [
    ...
    "requests",
    "pysocks"
  ]
}

次に、manifesto/*.jsonで接続先を指定します。今回はhttps://actcast.ioにアクセスしたいため、以下のように指定します。

{
  ...
  "networks": [
    {
      "domain": "actcast.io",
      "port": 443,
      "protocol": "tcp"
    }
  ]
}

最後に、proxies付きのrequests.get()を呼びます。URI Scheme としてsocks5hを指定することで SOCKS プロキシ側で名前解決させる必要があります。

import os
import requests

requests.get(
    'https://actcast.io',
    proxies={
        'https': f'socks5h://{os.environ["ACTCAST_SOCKS_SERVER"]}'
    }
)  # => <Response [200]>

Python アプリケーションでローカルネットワーク上の別のサーバにアクセスする #

Pythonアプリで https://actcast.io にアクセスする例と同じく.actdk/dependencies.jsonpiprequestspysocksを追加します。

次に、ローカルネットワーク上の別のマシンで$ python3 -m http.server 80を実行することでサーバを起動しておきます。

次に、manifesto/*.json"local_addr": trueを指定します。

{
  ...
  "networks": [
    {
      "local_addr": true,
      "port": 80,
      "protocol": "tcp"
    }
  ]
}

最後に、proxies付きのrequests.get()を呼びます。 Python アプリケーションで https://actcast.io にアクセスする例とは違い名前解決は不要なためsocks5hではなくsocks5を指定しています。

import os
import requests
requests.get(
    'http://192.168.1.100',
    proxies={
        'http': f'socks5://{os.environ["ACTCAST_SOCKS_SERVER"]}'
    }
)  # => <Response [200]>

アプリケーションの各種スキーマ に戻る