以前の記事で、私はisc-dhcpdのステータスを追跡する方法について話しました。今ではこのスキームを適用する実用的な方法について話しました。
負荷の高いゲストWi-Fiネットワークで作業する場合、外部サービスへの高度なアクセス権を持つクライアントを追跡および追加する問題があります。 最適なオプションはMACアドレスによるアクセス制御(dhcpd.confに多数のアドレスを入力する)ですが、実際に示すように、非常に不便です。 設定にすでに入力されているホストのステータスとその操作を実際に制御することはできません。
また、多数のランダムデバイスにより、リース期間を短縮するか、発行されたIPアドレスの範囲を拡大する必要があり、その結果、目的のホストの検索が遅くなります。 MACアドレスを監視して静的アドレスを発行すると、特定の問題が発生する可能性があります。 会社に2つのWi-Fiサブネットがあり、マルチアクセスポイントから2つの仮想ネットワーク(VLAN)が分散しているとします。 この場合、1つのWi-Fiネットワークが開いており、2つ目はパスワードで保護されています。
クライアントが正しく機能するためには、デバイスのMACアドレスを2つのプールに同時に追加する必要があります。 これにより、構成と管理の問題が混乱します。
詳細な説明を読むには、pf、squid、isc-dhcpd、およびWebサーバーがどのように機能するかについて少なくとも基本的な理解が必要です。
出口は何ですか?
解決策は少しわかりにくいですが、非常に簡単です。 dhcpd自体がネットワークへのユーザーアクセスを制御しないのはなぜですか?
したがって、isc-dhcpdがあります。ファイアウォールのサービスが表示されたときにアクセスを開き、表示されなくなったときにアクセスを無効にする必要があるクライアントのリストがあります。
クライアントのMACアドレスのデータベース、クライアントをすばやく追加するための便利なWeb銃口、設定を手動で編集せずにリモートで制御できるファイアウォール、および少しの忍耐が必要です。
まず、システムを準備する必要があります。
私はFreeBSDのサポーターです。そのため、私はすべての主要なプロジェクトを行っています。 多くのシステムコンポーネントには便利なコントロールがあります。 ファイアウォールとして、たくさんの
pfと
pftabledを使用します。 pfファイアウォールは、基本的なルールを変更せずに変更できる動的テーブルを備えているという点で、他のファイアウォールと比べて有利です。 pftabledは、特別に細工されたパッケージを使用してこれらのテーブルの状態を制御できるデーモンです。
おおよそのpf.conf構成
int_if="em0" ext_if="em1" table <androids> table <private_nets> persist { 10.0.0.0/8, 172.16.0.0/16, 192.168.0.0/16 } # nat ! nat on $ext_if from { <private_nets> } to { !<private_nets> } -> ($ext_if) # . <androids> squid transparent . no rdr on $int_if from <androids> to any # apache wpad.dat rdr on $int_if from ($int_if:network) to { any, !($int_if) } port { 80,8080 } -> 127.0.0.1 port 3129 # Allow DHCP pass in on $int_if proto udp from any port bootpc to any port bootps pass out on $int_if proto udp from any port bootps to any port bootpc # Allow DNS pass in on $int_if proto udp from ($int_if:network) to ($int_if) port domain keep state pass out on $int_if proto udp from ($int_if) to ($int_if:network) port domain # Allow Proxy access pass in on $int_if proto tcp from ($int_if:network) to ($int_if) port 3128 flags S/SA keep state pass in on $int_if proto tcp from ($int_if:network) to 127.0.0.1 port 3129 flags S/SA keep state # Allow access to local HTTP Server pass in on $int_if proto tcp from ($int_if:network) to ($int_if) port 80 flags S/SA keep state # Allow access from <androids> to any services pass in from <androids> to any keep state pass out on $ext_if from ($ext_if) to any keep state pass out on $ext_if proto icmp from any to any keep state
説明されている構成は何を提供しますか?
- ゲストネットワークからポート80.8080のホストに送信された要求は、ポート3129のプロキシサーバーにリダイレクトされます。
- androidsテーブルに含まれるホストからの要求は、外部ネットワークに直接転送されます。
- DNS、DHCP、ローカルWebサーバー、プロキシへの許可されたリクエスト
ポート80.8080のみを許可するのはなぜですか? 他のポートを開くと、ネットワークの使用を制御できなくなります。
回路が正しく機能するためには、ローカルwpadサービスを構成する必要があります。 設定するには、DNSサーバーにIN Aレコードを作成し、WebサーバーのアドレスをIPアドレスとして指定する必要があります。 以下は、Webサーバーのルートにあるwpad.datファイルの設定例です。
function FindProxyForURL(url, host) { if( isPlainHostName(host) || dnsDomainIs(host, ".conf.local") || localHostOrDomainIs(host, "127.0.0.1") ){ return "DIRECT"; } if ( isInNet(host, "172.16.0.0", "255.255.0.0") || isInNet(host, "192.168.0.0", "255.255.0.0") || isInNet(host, "10.0.0.0", "255.0.0.0") || isInNet(host, "127.0.0.0", "255.255.255.0") ){ return "DIRECT"; } if ( isInNet(myIpAddress(), "192.168.0.0", "255.255.0.0")) return "PROXY 192.168.0.1:3128"; else return "DIRECT"; }
ファイルの内容は次のとおりです。
- 要求にdnsサフィックスのないホスト名が含まれる場合、または要求されたホストのドメインに「.conf.local」が含まれる場合、またはホストが127.0.0.1に解決される場合、要求されたホストに要求を直接送信します。
- 要求されたホストがローカルサブネットアドレスに解決される場合、要求を直接送信します
- 残りをプロキシサーバーに送信する
透明モードでsquidを設定する方法は
ここで読むのが一番
です 。
さて、準備作業は完了です。 その後、システムカーネルの動作を確認できます。
dhcpdがユーザーのホストに正しく設定を与え、「プロキシサーバー設定の自動検出」設定を有効にすると、ブラウザーはwpad.datファイルを要求し、すべての要求をプロキシサーバー経由で送信します。 ホストをandroidsテーブルに追加すると、すべてのトラフィックがプロキシサーバーを通過します。
仕事用のデータベースを作成します
最も簡単で高速なデータ処理オプションは、発行されたアドレスの現在の設定を高速アクセスでアクセス可能な場所に保存することです。 Memcachedは私にとってこのような場所です。 一般的に、データベースやファイルストレージは、あなたの心が望むものなら何でも使用できます。 ポピーアドレスのローカルベースには、通常のパールバーDB_Fileを使用します。
最初の投稿で説明したように、発行済みアドレスのデータベースを作成するには、イベントハンドラーをdhcpdに接続する必要があります。 以下は私のハンドラーのテキストです。
ファイル/usr/local/etc/pftabled.keyには、pftabledを使用するキーが含まれている必要があります。
/var/db/macs.dbファイルには、DB_File HASHの形式でMACアドレスのベースが含まれている必要があります。
dhcpdからcommitコマンドが表示されると、受信したMACアドレスがアドレスベースと照合され、アドレスベースに存在する場合、パケットがpftabledに送信され、macに対応するandroidsテーブルにipアドレスが追加されます。 releaseまたはexpire-ipコマンドが表示されると、androidsテーブルのIPアドレスが自動的に削除されます。
memcachedおよびpftabledのデータ有効期間は19200秒(約5時間)に設定され、同じ時間がmaximum-lease-timeパラメーターのdhcpd.conf構成に設定されます。 これは、memcachedおよびpfのホストが失われないようにするためです。
pftabledは、次のパラメーターで開始する必要があります。
pftabled_flags = "-d -a 127.0.0.1 -k /usr/local/etc/pftabled.key -t 19200"crontabでは、次の行を追加する必要があります
* / 5 * * * * / sbin / pfctl -t androids -T expire 19200> / dev / null 2>&1注意!!! /usr/local/etc/pftabled.keyは0444でなければなりません実際、最後の部分はWebアクセスルールです。
コードはシンプルで気取らず、仕事には十分です。 したがって、可愛さとフリルなし。
まあ、それは基本的にそれです。
この読書があなたにとって有益であり、あなたの会社のシステムの改善の可能性についてのある種の考えにつながることを願っています。
PS:ユーザー自身によるアクセスを開くことができるホットスポットを作成するには、初期プロキシリダイレクトを認証フォームを使用してWebサーバーへのリダイレクトに置き換え、そこからisc-dhcpdを使用せずにpftabledにホストを追加します。
PPS:最後のファイルで「functions.pm」を使用すると、フォームと環境変数の入力プロセッサになります。 変数チェックはCGIで書き直すことができます。 ご希望の方には、モジュール「functions.pm」の機能コードとソースコードをレイアウトできます
Aborche 2011