1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

aFleX(Tcl)を触ってみよう

Posted at

aFleXとは

aFleX スクリプト言語は、検査およびリダイレクトポリシー(フィルタ、ドロップ、リダイレクト)を詳細かつきめ細かく制御できる強力なインラインカスタムスクリプトエンジンです。aFleX スクリプト言語は、シンプルさと使いやすさを追求したツールコマンド言語(Tcl)プログラミング標準に基づいています。aFleX ポリシーを機能させるには、ACOS デバイスの仮想ポートにバインドする必要があります。その後、aFleX ポリシーは、仮想ポートを通過するすべてのトラフィックのペイロードパケットを検査することで、ポリシー決定を行います。
(A10 Network 公式ドキュメントから引用した英文をGoogle翻訳しました)

デフォルトで用意されているスクリプトを使って、aFleXを触って理解してみよう

1.「logging_clients」でアクセスログを記録する

デフォルトで用意されているスクリプトは下記の通り。

# This aFleX logs Client/Server IP/Port information for security when using Source NAT
when CLIENT_ACCEPTED {
  set timestamp [TIME::clock seconds]
  set cip [IP::client_addr]
  set cport [TCP::client_port]
  set vip [IP::local_addr]
  set vport [TCP::local_port]
}

when SERVER_CONNECTED {
  set sip [IP::server_addr]
  set sport [TCP::server_port]
  set snat_ip [IP::local_addr]
  set snat_port [TCP::local_port]

  log "\[$timestamp\] $cip:$cport -> $vip:$vport to $snat_ip:$snat_port -> $sip:$sport"
}

実際にaFleXを適用した結果は下記の通り、クライアント側の情報と転送先の情報がシスログに記録されます

vThunder#sh log
Log Buffer: 30000
Sep 12 2025 00:00:00 Info        [AFLEX]:logging_clients:[1757602800] 192.168.100.36:62768 -> 192.168.100.151:80 to 192.168.100.150:24146 -> 192.168.100.160:80

ただ、timestampがUNIXタイム表記なので読みづらいですね。
また、クライアントがアクセスしようとしたURLも取れないかなと思いました

ということで、少しスクリプトを変えてみました
# This aFleX logs Client/Server IP/Port information for security when using Source NAT
when CLIENT_ACCEPTED {
  set timestamp [TIME::clock format [TIME::clock seconds] -format {%Y/%m/%d %H:%M:%S}]
  set cip [IP::client_addr]
  set cport [TCP::client_port]
  set vip [IP::local_addr]
  set vport [TCP::local_port]
}

when HTTP_REQUEST {
  set host [HTTP::host]
  set uri [HTTP::uri]
  set scheme [HTTP::scheme]
}

when SERVER_CONNECTED {
  set sip [IP::server_addr]
  set sport [TCP::server_port]
  set snat_ip [IP::local_addr]
  set snat_port [TCP::local_port]

  log "\[$timestamp\] $cip:$cport -> $vip:$vport to $snat_ip:$snat_port -> $sip:$sport URL:$scheme://$host$uri" 
}

結果は下記の通り、URLのような形式で出力できました

vThunder#sh log
Log Buffer: 30000
Sep 12 2025 00:00:00 Info        [AFLEX]:logging_clients:[2025/09/12 00:00:00] 192.168.100.36:54428 -> 192.168.100.152:443 to 192.168.100.150:24147 -> 192.168.100.165:443 URL:https://192.168.100.152/index.html

2.「redirect1」でhttpをhttpsにリダイレクトする

掲題の通り、http→httpsにリダイレクトするシンプルな機能

デフォルトで用意されているスクリプトは下記の通り。

# redirect HTTP request to https URL
when HTTP_REQUEST {
  HTTP::redirect https://[HTTP::host][HTTP::uri]
}

http://192.168.100.152/index.htmlでアクセスしたら、
https://192.168.100.152/index.htmlにしっかりリダイレクトされました

触ってみた感想

aFleXは基本的にイベントで発火して、さまざまなコマンドを実行できるものでした

コマンド自体もかなり種類があり、公式リファレンスに下記のように機能の一部を紹介してくれています

  • プール(SLBサービスグループ)やノード(サーバー)の選択などのアクションを実行します
  • IPパケットヘッダーのクエリ – IPヘッダーから情報を返します
  • IP、TCP、またはUDPパケットデータのクエリ – ペイロードから情報を返します
  • HTTPパケットヘッダーまたはコンテンツのクエリ – HTTPヘッダーまたはペイロードから情報を返します
  • HTTPクッキーの操作 – クッキーを変更します
  • TCPヘッダーとコンテンツの操作 – TCPヘッダーまたはコンテンツを変更します
  • HTTPヘッダーとコンテンツの操作 – HTTPヘッダーまたはコンテンツを変更します
  • SSLおよびX.509のクエリ – 証明書から、または証明書に関する情報を返します
  • ディープパケットインスペクション – パケットから文字列を返します

通常のLBの振り分け方式では敵わないような複雑な条件でも、aFleXで接続先のサーバの振り分けをしたりすることもできるので、さまざまな要件に対応できそうですね

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?