タスクについて少し説明します。
インターネットカフェにはwifiネットワークまたはLANがあり、インターネットへの時間ベースのアクセスを提供する必要があります。 システムを制御することをお勧めします-設定して忘れて、オペレーターにプリンターでパスワードを生成し、金銭を受け取るためにレジを渡します。
多くの人が、認可スキーム、必要なタスクに応じてファイアウォールシステムテーブルを時々変更するスクリプトを考え出します。完全に動的なシステムを作成した人はいません。 したがって、システム管理者が自分のタスクに適応するプロトタイプを提案します。
Linuxシステム管理者は、お気に入りのファイアウォールに基づいてこのメカニズムを実装できると思いますが、pfを使用します。
なぜあなたが尋ねるのですか?
動的テーブルと呼ばれる素晴らしいものがあるからです。
pf構成ファイルでは、テーブルは次のように記述されています。
table <wifiallow> persist
テーブルの内容は、コマンドラインとpftabledユーティリティを使用して動的に変更できます。 このユーティリティは、テーブルコンテンツ管理コマンドを受け入れるudpサーバーです。
コマンドラインを使用すると、テーブルの管理は非常に簡単です。
pfctl -t tablename -T show -
pfctl -t tablename -T expire 3600 - 1
pfctl -t tablename -T add 10.10.10.10 -
pfctl -t tablename -T delete 10.10.10.10 -
pfctl -t tablename -T flush -
pftabledは、udpパッケージを介して追加、削除、およびフラッシュ操作を許可します。 pftabled 1.07の最新リリースには、pftabledを管理するためのperlクライアントがあります。 当然、すべての操作は、リスニングサーバーと同じキーを持つ承認済みホストからのみ実行されます。
それで、何が必要ですか?
mod_rewriteモジュールを使用したapacheと、このスキームを実装したいという要望。
回路の基本原理は単純です。 インターネットホストにアクセスしようとしているホストのアドレスが権限テーブルにない場合は、ユーザー名とパスワードの入力を要求してアドレスをWebフェイスに転送する必要があります。 ホストがテーブルにある場合、インターネットにリリースする必要があります。
pfでは、これは次のように解決されます
$int_if = "xl0";
$ext_if = "xl1";
rdr on $int_if proto tcp from !<wifiallow> to any port 80 -> $int_if port 8081 # apache
nat on $ext_if proto tcp from <wifiallow> to any -> ($ext_if) # nat
Apacheの構成で、仮想ホストを作成し、スクリプトへのすべての着信要求の書き換えルールを記述します。
<Directory "/usr/local/www/wifi-redir">
Options Indexes ExecCGI FollowSymLinks
Allow from all
RewriteEngine on
RewriteRule ^(.*)$ redirect.cgi?url=$1 [L]
RewriteRule ^redirect\.cgi$ - [L]
</Directory>
スクリプトはリクエストを受け入れ、認証フォームを発行します。 urlパラメーターとして、ユーザーが要求したアドレスが渡されます。 フォームに送信してログインパスワードを誤って入力した後、フォームの入力元であるリファラーにリダイレクトする必要があります。 この操作をスキップすると、フォームに入力すると無限ループに入ります。
ユーザー名とパスワードが正しい場合は、perlクライアントの一部を使用して、wifiallowテーブルにすぐにエントリをオンラインで追加し、このユーザー名とパスワードが既に使用されていることをログに記録します(悪用されないようにします)。ユーザーが最初に要求したURLにリダイレクトします。 ログインとパスワードのテーブルは、mysqlまたはユーザーにとって便利な任意の形式で管理できます。 フォームが獲得されたら、crontabに行を追加します
* * * * * /sbin/pfctl -t wifiallow -T expire 3600 > /dev/null
作成時間が1時間を超えると、毎分テーブルからIPアドレスが削除されます。 発生する可能性のある唯一の問題は、既に確立された接続のサポートです。 出口は簡単です。 許可されたアドレステーブルにないホストに対して5分ごとにpfctl -k hostipを実行する(keepstate接続を削除する)シェル+ awk + grepで小さなスクリプトを作成します。
このスキームは当社でテストされ、機能しています。 各管理者はdhcpアドレスの配布、名前の解決などの状況を持っているため、スクリプトのコンテンツと現在のファイアウォール設定をアップロードしても意味がないと思います。 実装の基本的な考え方は上記のとおりです。
このソリューションの実装と操作に成功しました。