VyOSで競技プログラミングを試みた軌跡

ここ半年ほどやたらと脆弱性のニュースが多い気がしますが、今度はSSLv3周りでPOODLEとかいう名前だけは可愛い脆弱性の話題、古いものを使っているユーザーをどれほど守るかと、どれほどユーザーの安全を守るかという二つの相反する要素の葛藤を強いられている人も多そうですね。

さて、以前に、ルーターで競技プログラミングという記事を書きました。Advent Calendarに向けて書いた記事で、競技プログラミングを引き合いにルーターのパケット割り振りの機能を用いて計算を行うことができるかという記事で、iptablesを使用してある程度繰り返し処理や記憶を伴う計算をある程度することができそうだ、という感じを出しながら一問解くことができました。しかし、この記事には、iptablesなのでルーターっぽくないという問題点がありました。
この問題を解決するための次のステップとして、自由度はそれほど下がらないと思われつつももう少しルーターっぽい感じの操作体系となるVyOSを用いることを考え、昨年の記事の手法をそのままVyOSに適用可能かについて検討しました。

まずは、VyOSのインストールを行います。VyOSのウェブページから最新版のインストーラ(インストールした時は1.0.5だったので1.0.5で試みましたが、最近1.1.0が出たようです。)のイメージをダウンロードし、起動し、初期設定を行いました。VyOSの解説を目的としたわけではないので、必要ならVyOSのUser Guideを参照してください。

さて、ここで、パケット転送を思い通りに行うために必要なコマンドを実行する必要があります。前回の記事で使用したものでは

  • 特定のポートに届いたパケットを特定のホスト・ポートに転送
    • その際、特定のフラグを叩くこともある
    • 特定のフラグが過去60秒に一定回数叩かれていることを前提条件としているものもある

という条件をたくさん設定することにより機能を実現しました。1-65535それぞれのポートがどこに対応するかはPerlで計算した上で予め流し込んでおきました。

今回この手法を設定するにあたり、まずは以下の様なコマンドを用いて転送ができるようでした。

set nat source rule 10 destination port 1
set nat source rule 10 translation address 192.168.150.2
set nat source rule 10 translation port 32769

そして、これの挙動を過去の記憶によって変動させるため、以下の様なコマンドを実行する必要があると思われました。

set nat source rule 10 state new 'hoge'

しかし、これはうまくいきません。

vyos@vyos# set nat source rule 10 state new 'hoge'

  Configuration path: nat source rule 10 [state] is not valid
  Set failed

[edit]

nat sourceのruleに対してstate、というのはうまくいかないようです。firewallについてはうまくいくようですが、これはポートノックや攻撃者をある程度締め出すために使われるようなので、natには不要と判断されるのかもしれません。
これを受け、これと同等のコマンドをウェブ検索や公式ページでの検索で探しましたがみつかりませんでした。

そのため、現状ではVyOSで競技プログラミング、あるいは計算を行うことができていません。今後の課題となると考えられます。

繰り返し処理を行うにあたっては転送によりポートを変えながら何度も転送することは必須と考えられるため、この間にマシン自体の状態を変化させることは、変数を用いた処理を行うのに事実上必要な処理だと思われますが、これができないとなると、VyOSを用いて複雑な計算を行うことは困難であると考えられます。これはルーターで競技プログラミングを行うにあたって重大な障壁であると考えられ、現状では当方では打開策を思いつくに至りません。これについて現状を打破するのにつながる可能性のある情報などがありましたら、是非コメント欄や電子メール、SNSなどでご一報いただければと思います。