ネットワークマニフェスト
network_modeが"socks"または指定なしになっている場合、Actcast アプリケーションの動作に必要なリソースを指定する Manifesto の中で "networks" フィールドに接続先を指定することで、必要な通信を行うことが出来るようになります。
network_modeが"bridge"で UDP マルチキャストを行いたい場合も指定が必要です。
特にこの指定を指して ネットワークマニフェスト と呼びます。
接続先の指定
ネットワークマニフェストには接続先を指定する方法が 3 種類あります。 ドメインを指定する方法、ローカルネットワーク全体を指定する方法、マルチキャストアドレスを指定する方法です。 前者二つの指定では指定したアドレスへの接続のみを許可する SOCKS プロキシが起動し、これを通した通信を行う必要があります。 マルチキャストアドレス指定の場合は、特別な手順を踏むこと無く通常通りの通信が可能になります。
ドメインを指定する方法
domain, port, protocolの組み合わせを指定します。
| key | description |
|---|---|
domain |
接続先のインターネットホスト名 |
port |
接続先のポート番号 |
protocol |
接続時のプロトコル ("tcp" or "udp") |
domain 内のワイルドカード
接続先の domain はワイルドカード (*) を使用することで一部を任意の値として指定することもできます。
ワイルドカードはサブドメインの位置に使用でき、任意の英数字やハイフンにマッチします。
例: Amazon API Gateway
以下の Amazon API Gateway の REST API の URL の場合、https://{restapi_id}.execute-api.{region}.amazonaws.com の restapi_id と region を任意の値としたい場合は以下のように指定します。
*.execute-api.*.amazonaws.comメモ
ワイルドカードは階層ごとに指定する必要があります。
例: {foo}.example.com と {bar}.{foo}.example.com に接続させたい場合
以下の 2 つを指定します。
*.example.com*.*.example.com例: {foo}.example.com と example.com に接続させたい場合
以下の 2 つを指定します。
*.example.comexample.comローカルネットワーク全体を指定する方法
local_addr, port, protocolの組み合わせを指定します。IPv4 のプライベートアドレスの範囲(10/8, 172.16/12, 192.168/16)と IPv6 のユニークローカルアドレスの範囲(FD00::/8)に接続できるようになります。
| key | description |
|---|---|
local_addr |
ローカルアドレスを許可 (trueのみ指定可能) |
port |
接続先のポート番号 |
protocol |
接続時のプロトコル ("tcp" or "udp") |
例: ローカルネットワーク上の HTTP サーバへ接続する場合
デバイスの配置されたローカルネットワーク上にあるサーバの 80 番ポートにアクセスする場合、以下のように設定します。
"networks": [
{ "local_addr": true, "port": 80, "protocol": "tcp" }
]マルチキャストアドレスを指定する方法
multicast_addr, port, protocol, direction を指定します。
IP マルチキャスト通信は 1 対多通信の 1 方向通信プロトコルです。このため direction で
送受信方向を指定します。
| key | description |
|---|---|
multicast_addr |
通信先のマルチキャストアドレス (224.0.0.0/4) |
port |
通信先のポート番号 |
protocol |
通信プロトコル ("udp"のみ指定可能) |
direction |
送受信の種別 ("send" or "recv") |
例: 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.jsonのpipにrequestsとpysocksを追加します。
{
...
"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.jsonのpipにrequestsとpysocksを追加します。
次に、ローカルネットワーク上の別のマシンで$ 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]>