組み込み学習に関する問題のまとめ

  • ファイル udhcpd.leases は何をするものですか?

「udhcpd.leases」は、「udhcpd」DHCP サーバー プログラムが DHCP クライアントに割り当てられた IP アドレスを記録するファイルです。「udhcpd」が新しい IP アドレスを DHCP クライアントに割り当てると、クライアントの MAC アドレス、IP アドレス、リース有効期限およびその他の情報が「udhcpd.leases」ファイルに記録されます。これにより、クライアントが次回 DHCP 割り当てを要求したときに、 , 「udhcpd」は、このファイルに記録されている情報をもとにクライアントに同じIPアドレスを割り当てることで、安定したIPアドレスの割り当てを実現します。OpenWrt システムでは、デフォルトで、`udhcpd.leases` ファイルは `/var/lib/misc/udhcpd.leases` ディレクトリにあります。

  • dhcpd.leases ファイルはリアルタイムで更新されますか?

「udhcpd.leases」ファイルは、DHCPサーバー「udhcpd」によってクライアントに割り当てられたIPアドレス、MACアドレス、リース期間などの情報を格納するファイルです。クライアントが IP アドレスを取得すると、DHCP サーバーは、IP アドレス、MAC アドレス、リース期間など、およびその他の構成情報を含むクライアントの情報を「udhcpd.leases」ファイルに記録します。このファイルは、従来の DHCP サーバーのリース リストと同様に機能します。

DHCP サーバーが IP アドレスを割り当てると、新しく割り当てられた IP アドレス情報が `udhcpd.leases` ファイルに書き込まれ、リアルタイムで更新されます。DHCP サーバーは、クライアントから DHCP Release メッセージを受信すると、対応するリース情報をファイルから削除し、リースの有効期限が切れた後に、対応するリース情報を期限切れとしてマークします。

「udhcpd」の実行中に「udhcpd.leases」ファイルが削除されると、すべてのクライアントが新しい IP アドレスを再要求することに注意してください。したがって、このファイルは、誤って削除した場合の望ましくない影響を避けるために、慎重に扱う必要があります。

  • Linux の ARP テーブルのエージング タイムは?

Linux では、ARP テーブルのエージング タイムは、カーネル内のパラメータ `net.ipv4.neigh.default.gc_stale_time` によって決定されます。このパラメータは、応答が受信されなかった場合に ARP エントリが保持される時間 (秒単位) を指定します。

デフォルトでは、この値は 60 秒です。現在の値は次のコマンドで表示できます。

sysctl net.ipv4.neigh.default.gc_stale_time

ARP テーブルのエージング タイムは、次のようにカーネル パラメータを変更することで変更できます。

sysctl -w net.ipv4.neigh.default.gc_stale_time=120

上記のコマンドは、ARP テーブルのエージング タイムを 120 秒に設定します。このコマンドをシステム起動スクリプトに追加して、システムが起動するたびにパラメータを設定できます。

  • ARP メッセージのエージング タイムはどのように実装されますか?

ARP キャッシュ テーブルのエージング タイムはタイマーによって実装され、タイマーの時間間隔は通常、オペレーティング システムのカーネル パラメータによって決定され、通常は数分から 30 分の間になります。ARP キャッシュ テーブル内のレコードのタイムスタンプが現在時刻とこの時間間隔を超えて異なる場合、ARP キャッシュ テーブルに無効なレコードが多数表示されるのを防ぐために、そのレコードはオペレーティング システムによって自動的に削除されます。ホストが一定期間ネットワーク インターフェイスを使用しない場合、インターフェイスに関連する ARP レコードもインターフェイスとともに解放され、ARP レコードも自動的に削除されます。

ARP キャッシュ テーブルのエージング タイムは、オペレーティング システムのバージョン、カーネルのバージョン、ハードウェア構成の違いによって異なる場合があることに注意してください。ARP キャッシュ テーブルのエージング タイムは、特定のニーズに合わせてオペレーティング システムの設定パラメータを通じて調整できます。

  • ARP テーブルが期限切れになった後、ARP リクエストは再発行されますか?

ARP テーブル内のエントリの有効期限が切れると、次にそのエントリにアクセスしたときに ARP リクエストが発生します。つまり、ARP リクエストの宛先アドレスが更新する必要のあるアドレスであり、送信元アドレスが ARP リクエストです。リクエストを送信するデバイスの MAC アドレス。ARP リクエスト メッセージは、リクエスト メッセージと同じ方法で送信されます。必要な ARP 要求が完了すると、ARP テーブル内の対応するエントリが、今後の通信のために正しい MAC アドレスで更新されます。

  • udhcpc と udhcpd はどう違いますか

「udhcpc」と「udhcpd」は両方とも、組み込みデバイス用の UDP プロトコル スタック実装における DHCP クライアントおよびサーバーです。両者の違いは次のとおりです。

1. `udhcpc` は `udhcp` 内のツールで、カーネルが IP アドレスを割り当てることができるように、DHCP サーバーにリクエストを送信し、受信した応答応答情報をカーネル ネットワーク プロトコル スタックに通知するクライアント プログラムです。インターフェイスに。「udhcpd」は、ネットワーク上のデバイスに IP アドレスおよびその他のネットワーク パラメータを割り当てる役割を担う DHCP サーバー プログラムです。

2. 「udhcpc」と「udhcpd」はどちらも組み込みシステム向けに合理化された DHCP 実装であり、従来の DHCP クライアントおよびサーバーと比較して、設定可能な項目が少なく、サイズが小さいため、組み込みシステムなどに適しています。 。

3. 「udhcpc」および「udhcpd」の使用法は、通常の DHCP クライアントおよびサーバーの使用法と似ており、コマンド ライン パラメータまたは構成ファイルを使用して、ネットワーク パラメータの関連設定を指定できます。

したがって、「udhcpc」と「udhcpd」は組み込みデバイス用の 2 つの DHCP 実装であり、「udhcpc」は DHCP クライアント プログラム、「udhcpd」は DHCP サーバー プログラムであり、それぞれが異なる機能を担当します。

  • この文はどういう意味ですか? system("killall host_monitor >/dev/null 2>&1");

この文は、C/C++ プログラムのシステム コマンド `killall` を呼び出して、`host_monitor` という名前のプロセスを閉じます。具体的には、「system()」関数は、システム コマンドを呼び出すことができる C/C++ 言語の標準ライブラリ関数の 1 つです。`killall` は、同じ名前を持つすべてのプロセスを強制終了するために使用される Linux コマンドです。次のパラメータ `>/dev/null 2>&1` は、コマンド出力とエラー情報を null デバイスにリダイレクトすることを意味します。つまり、ヌル デバイスには出力されません。ターミナル。したがって、この文の機能は、プログラム内で `killall host_monitor` コマンドを呼び出して、`host_monitor` という名前のプロセスをシャットダウンし、プログラムへの影響を避けるために出力とエラー メッセージをマスクすることです。

  • OpenWrt では、udhcpd コマンドが見つからないというメッセージが表示されますか?

OpenWrt では、「udhcpd」コマンドを使用して小規模な DHCP サーバーを起動し、ルーターに接続されているデバイスに IP アドレス、ゲートウェイ、DNS サーバーなどの情報を割り当てることができます。「udhcpd」コマンドが見つからないというメッセージが表示された場合は、コマンドがインストールされていないか、コマンドへのパスがシステム環境変数に追加されていないことが原因である可能性があります。

次のコマンドを実行すると、「udhcpd」がインストールされているかどうかを確認できます。

opkg リスト-インストール済み | grep udhcpd

出力が空の場合、「udhcpd」はインストールされていません。次のコマンドを使用して「udhcpd」をインストールできます。

opkgのアップデート

opkg は udhcpd をインストールします

インストールが完了したら、次のコマンドを使用して `udhcpd` を開始できます。

udhcpd /etc/udhcpd.conf

このうち、 /etc/udhcpd.conf は udhcpd の設定ファイルであり、必要に応じて設定する必要があります。

  • Openwrt ファームウェアには udhcpd サーバーが含まれていません。追加するにはどうすればよいですか?

OpenWrt への udhcpd サーバーのインストールは、次の手順で完了できます。

1. SSH 経由で OpenWrt ルーターにログインします。SSH に慣れていない場合は、関連するチュートリアルを参照して学習してください。

2. 「opkg update」コマンドを実行して、パッケージリストを更新します。

3. 「opkg install udhcpd」コマンドを実行して、udhcpd サーバーをインストールします。

4. `/etc/config/dhcp` 設定ファイルを変更し、udhcpd サーバーを有効にします。

`/etc/config/dhcp` 設定ファイルで、`option dhcpd '1'` を `option dhcpd '2''` に設定し、それぞれ `option start '100'` と `option limit '150'` を設定します。 DHCP サーバーに割り当てられる IP アドレスの開始アドレスと最大数。変更された構成ファイルの内容は次のようになります。

構成 dhcp 'lan'

オプションインターフェイス「lan」

オプション開始 '100'

オプション制限「150」

オプションのリース時間「12h」

オプション dhcpv6 'サーバー'

オプション ra 'サーバー'

オプション ra_management '1'

オプション dhcpd '2'

5. 変更を保存し、ルーターを再起動して新しい設定を有効にします。「service dhcp restart」コマンドを実行して、DHCP サーバーを再起動します。

  • openwrt ファームウェアのコンパイルには udhcpd サーバーが含まれません。コンパイル中に追加するにはどうすればよいですか?

OpenWrt ファームウェアのコンパイル時に udhcpd サーバーを選択しなかった場合は、再コンパイルすることで追加できます。udhcpd サーバーを追加する手順は次のとおりです。

1. OpenWrt ソース コード ディレクトリに移動し、次のコマンドを実行してフィードを更新します。

./scripts/feeds update -a

2. udhcpd パッケージをインストールします。

./scripts/feeds udhcpd をインストールします

3. コンパイル オプションを設定し、メニュー設定インターフェイスに入ります。

メニュー構成を作成する

4. 「ネットワーク」->「udhcpd」を選択して確定すると、udhcpd がファームウェアにコンパイルされます。

5. 保存して設定インターフェイスを終了し、コンパイルを開始します。

make -j8

6. コンパイルが完了したら、bin ディレクトリで必要なファームウェア ファイルを見つけます。

注: ステップ 4 で「M」を選択すると、udhcpd はモジュールとしてコンパイルされ、ファームウェアには udhcpd が含まれません。したがって、udhcpd をファームウェアに直接コンパイルするには、「M」ではなく「*」を選択してください。

  • この文、ローカル名=$1 は何を意味しますか?

この文は単純なシェル スクリプト ステートメントで、$1 はスクリプトの実行時に渡される最初のパラメーターを表し、local name=$1 は name という名前のローカル変数を定義し、その値をパラメーターの最初の値に割り当てます。local キーワードはローカル変数を宣言するために使用されます。ローカル変数は現在の関数スコープ内でのみ有効であり、他の関数やグローバル変数には影響しません。

シェルには $0、$1、$2 などの記号が表示されますが、これは何を意味するのでしょうか? 簡単に言うと、$0 は作成したシェル スクリプトの名前で、$1 は作成したシェル スクリプトに渡す最初のパラメータです。 , $2 は、作成したシェル スクリプトに渡す 2 番目のパラメータです。

たとえば、次の内容を含む新しいシェル スクリプト Test.sh を作成します。

#!/bin/sh
echo "shell脚本本身的名字: $0"
echo "传给shell的第一个参数: $1"
echo "传给shell的第二个参数: $2"

保存して終了したら、Test.sh が存在するディレクトリに bash Test.sh 1 2 と入力します。

結果は次のとおりです。

shell脚本本身的名字: Test.sh
传给shell的第一个参数: 1
传给shell的第二个参数:  2
  • この文、local tmpname=${name%_*} は何を意味しますか?

このコマンドはシェル スクリプトで使用されます。ここで、「local」はローカル変数を定義することを意味します。

`${name%_*}` は文字列操作であり、変数 `name` の末尾から最も短い `_` 文字とそれに続くすべての文字を削除することを意味します。

処理された文字列を返し、それを `tmpname` 変数に代入します。この操作の目的は通常、ファイル名の基本部分を取得することです。

ファイルの管理と操作を容易にするために、ファイル名からバージョン番号やその他の情報を削除します。

  • udhcpd.conf 構成ファイルの説明

プール名 プールデフォルト

プール順序 0XFFFFFFFF

インターフェースbr0

192.168.1.100を開始

終了 192.168.1.200

サブネット 255.255.255.0 を選択

オプトリース 86400

オプトルーター 192.168.1.1

オプトDNS 192.168.1.1

オプトドメイン Realtek

半分

この構成コードは、DHCP サービスをセットアップするために使用されます。ここで、

- `poolname pool-default` は、「pool-default」という名前の IP アドレス プールを定義します。

- `poolorder 0XFFFFFFFF` はアドレス割り当ての順序を設定します。ここで、`0XFFFFFFFF` はデフォルトのランダム割り当て方法を意味します。

- `interface br0`は、DHCPサービスに対応するネットワークインターフェースを「br0」として指定します。

- `start 192.168.1.100` と `end 192.168.1.200` は、それぞれ IP アドレス プールの開始アドレスと終了アドレス、つまり DHCP サービスによって割り当てられる IP アドレスの範囲を指定します。

- `opt subnet 255.255.255.0` はサブネット マスクを設定します。

・「optリース86400」は、クライアントが取得したIPアドレスの有効期間であるリース時間を設定しますが、ここでは86400秒(1日)に設定しています。

- 「opt router 192.168.1.1」はデフォルトゲートウェイのIPアドレスを指定します。

- `opt dns 192.168.1.1` は、DNS サーバーの IP アドレスを指定します。

- `opt domain Realtek` はドメイン名を設定します。ここでは「Realtek」です。

- `poolend`はIPアドレスプール設定の終了を示します。

したがって、この構成コードの目的は、「br0」インターフェイスに接続されているクライアントに IP アドレスを割り当てる DHCP サービスをセットアップすることです。

割り当てられるIPアドレス範囲は192.168.1.100~192.168.1.200、サブネットマスクは255.255.255.0、リース時間は1日です。

DNS サーバーのアドレスは 192.168.1.1、ドメイン名は「Realtek」です。

  • この文は /bin/p0f -i br0 -p -f /etc/p0f.fp -s /var/run/p0f.so という意味ですか?

このコマンドは、br0 で使用する p0f という名前のネットワーク トラフィック スニファーを開始します。

インターフェイス上のネットワーク トラフィックをキャプチャし、/etc/p0f.fp ファイル内のルールを通じてトラフィックを照合します。

結果は /var/run/p0f.so ファイルに出力されます。ここで、 -p フラグは、キャプチャされたネットワーク パケットを人間が読める形式に解析します。

-f フラグは、p0f ルール ファイルの場所を指定します。

  • この文、/binsntp -s time.windows.com -s time.nist.gov -i 8 は何を意味しますか?

この文は、 time.windows.comおよび time.nist.govにアクセスするために使用される Linux システムで sntp コマンドを実行するものです。

2 つのタイム サーバーは現在時刻を取得し、8 秒間隔で継続的に時刻を同期します。具体的な意味は以下の通りです。

- /bin/sntp: sntpコマンドの実行ファイルのパスを指定します。

- -s time.windows.com : time.windows.comタイム サーバーから同期する時刻を指定します

- -s time.nist.gov: time.nist.gov タイム サーバーから同期する時刻を指定します。

- -i 8: sntpコマンドの同期時間間隔を8秒に指定します。

  • この文はどういう意味ですか? bin/udhcpc -i br0 -par/run/udhcpc.pid.br0 -s /et

この文は、「udhcpc」プロセスを開始し、「br0」インターフェースに IP アドレスを割り当てるコマンドです。具体的な説明は以下の通りです。

- `bin/udhcpc`: `udhcpc` コマンドが配置されているパス。「udhcpc」は、DHCP サーバーから IP アドレスの割り当てを要求するために使用される軽量の DHCP クライアント プログラムです。

- `-i br0`: DHCP クライアントが使用する必要があるインターフェース名を指定します。ここでは `br0` として指定します。これは、Linux で `br0` インターフェイスを使用することを意味します。

- `-p /var/run/udhcpc.pid.br0`: `udhcpc`プロセスのPIDファイルの格納パスを指定します。PID ファイルはプロセス ID を含むファイルで、プロセスの実行ステータスを記録し、その後のプロセスの管理を容易にするために使用されます。

- `-s /etc/udhcpc.script`: `udhcpc`起動時に実行するスクリプトファイルのパスを指定します。このスクリプト ファイルには、IP アドレス、サブネット マスク、ゲートウェイなどの DHCP クライアントの特定の構成情報が含まれています。

  • /bin/hostapd_cli -a /var/hostapd_wps.sh -B -P /var/r この文は何を意味しますか?

この文は「hostapd_cli」コマンドを実行しています。その具体的な意味は次のとおりです。

- `/bin/hostapd_cli`: hostapd_cli のパスを指定します。

- `-a /var/hostapd_wps.sh`: 指定されたスクリプトを使用して、hostapd からのイベントを処理します。

- `-B`: hostapd_cli をバックグラウンドで実行します。

- `-P /var/run/hostapd_cli-br0.pid`: hostapd_cli プロセスの PID 番号を記録するために使用される PID ファイルのパスと名前を指定します。

通常、このコマンドはバックグラウンドで hostapd_cli を実行し、受信したイベントを指定された処理スクリプトに送信するために使用されます。

このコマンドでは、「-a」オプションと「-P」オプションのパラメータを、特定の環境と要件に応じて変更する必要があります。

  • この文、/bin/radvd -C var/radvd.conf は何を意味しますか?

この文は「radvd」コマンドを実行し、「/var/radvd.conf」ファイルを設定ファイルとして使用します。「radvd」は、IPv6 アドレスを自動的に構成するためにルーター アドバタイズメント メッセージを送信するためにルーター上で使用されるデーモン プロセスです。その設定ファイルには、IPv6 プレフィックス、ルーター アドレスなど、送信する必要がある RA メッセージの内容が含まれています。このコマンドでは、「-C」オプションで構成ファイルのパスを「/var/radvd.conf」として指定します。

  • この文は /bin/hostapd -g var/run/hostapd/global -P var/run/ を意味しますか?

このコマンドは、WLAN アクセス ポイント機能を実装するために使用される hostapd デーモンを起動するためのコマンドであり、そのパラメーターは次のとおりです。

- `-g var/run/hostapd/global`: hostapd_cli ツールとの対話に使用されるグローバル制御インターフェイスのパスを指定します。

- `-P var/run/hostapd.pid`: hostapd のプロセス ID を記録するために使用される pidfile のパスを指定します。

- `-B`: hostapd デーモンを起動し、コマンド ラインをブロックせずにすぐに戻ります。

hostapd のデフォルトの設定ファイルは `/etc/hostapd/hostapd.conf` ですが、`-B -P` パラメータを使用して他の設定ファイルのパスと名前を指定できます。

  • チャット: この文はどういう意味ですか、/bin/crond

この文は、Linux システムで crond コマンドを実行して、crond デーモン プロセスを開始します。crond は Linux システムのサービス プロセスであり、その主な機能は、データのバックアップ、ログの定期的なクリーニング、レポートの定期的な送信など、指定されたタスクを定期的に実行することです。

  • ps がプロセス [cfg80211] をチェックすると、このプロセスに [] が表示されるのはなぜですか

`[cfg80211]` はプロセス名の前に追加されるマークであり、プロセスの一部ではなく、プロセスがユーザー空間アプリケーションではなくカーネル内のモジュールであることを示します。Linux カーネルでは、一部のモジュールのコードは、ネットワーク プロトコル スタック、ファイル システム、デバイス ドライバーなどの特定のタスクを処理するプロセスの形式で実行されます。これらのモジュールのプロセス名には、通常のユーザー プロセスと区別するためにマークが付けられます。「cfg80211」は、Linux カーネル用のワイヤレス ネットワーク プロトコル スタックであり、このマークは、プロセスがワイヤレス ネットワーク関連のタスクを処理するカーネル モジュールであることを示します。

  • wpa_supplicant と hostapd の違いは何ですか?

wpa_supplicant と hostapd はどちらも Wi-Fi 接続を実装するために使用されるオープンソース ソフトウェアですが、機能が異なります。

wpa_supplicant は、ワイヤレス ネットワークに接続するために使用される Wi-Fi クライアントです。WEP、WPA、WPA2、802.1X など、複数の暗号化方式と認証プロトコルをサポートしています。Linux システムでは、wpa_supplicant は通常、システム ネットワーク マネージャーのバックエンドとして機能し、ワイヤレス ネットワークに自動的に接続するために使用されます。

hostapd は、コンピュータを Wi-Fi 経由のアクセス ポイントにして、他のデバイスがコンピュータに接続してインターネット接続を使用できるようにする Wi-Fi アクセス ポイント ソフトウェアです。hostapd は、WEP、WPA、WPA2、802.1X などの複数の暗号化方式と認証プロトコルをサポートします。hostapd は、ワイヤレス ホットスポットまたはワイヤレス ネットワーク ラボを作成するためによく使用されます。

したがって、wpa_supplicant と hostapd の主な違いはその機能です。wpa_supplicant はワイヤレス ネットワークに接続するために使用される Wi-Fi クライアントであり、hostapd はワイヤレス ホットスポットを作成するために使用される Wi-Fi アクセス ポイント ソフトウェアです。

  • チャット:wpa_supplicant コードの説明

wpa_supplicant は、ワイヤレス ネットワークに接続するためのオープンソース WiFi クライアントで、WPA/WPA2 や 802.1X 認証などのセキュリティ プロトコルをサポートしています。以下は、wpa_supplicant のメインコードの説明です。

1.メイン機能

wpa_supplicant の主な機能は wpa_supplicant.c に実装されています。この関数は主に、初期化、構成、イベント ループの実行などの操作を完了します。

2. 設定ファイルの読み込み

wpa_supplicant は、構成ファイルを使用して WiFi 接続パラメータを設定することをサポートしています。main 関数では、wpa_supplicant_init_conf 関数が呼び出されて構成ファイルが読み取られ、構成ファイル内のパラメーターが wpa_supplicant 構造体の対応するメンバー変数に割り当てられます。

3. インターフェース管理

wpa_supplicant は DBus を使用して WiFi インターフェイスを管理します。DBus は、wpa_supplicant がオペレーティング システム内の他のプロセスと通信できるようにするクロスプロセス通信メカニズムです。wpa_supplicant は、DBus インターフェイスを使用して WiFi インターフェイスを有効、無効、構成します。

4. イベントループ

wpa_supplicant はイベント ループを使用して、スキャン、接続、切断、認証などの WiFi イベントを処理します。main 関数では、wpa_supplicant_run 関数が呼び出されてイベント ループが開始され、イベント ループが終了するまでブロックされます。

5. インターフェースドライバー

wpa_supplicant は、Linux カーネル独自のドライバー、wext ドライバー、nl80211 ドライバーなどを含む、さまざまな WiFi インターフェイス ドライバーをサポートします。ドライバーが異なれば実装も異なりますが、それらはすべて、wpa_supplicant と通信するための一連のインターフェイスを実装する必要があります。

6. セキュリティプロトコル

wpa_supplicant は、WPA-PSK、WPA2-PSK、WPA-Enterprise、WPA2-Enterprise などの複数の WiFi セキュリティ プロトコルをサポートします。セキュリティ プロトコルが異なれば、必要な認証方法も異なりますが、それらはすべて、wpa_supplicant と通信するための一連のインターフェイスを実装する必要があります。

上記は wpa_supplicant の主要なコードの説明ですが、wpa_supplicant のコード構造は明確で、拡張や保守が容易です。

Hostapd コードの説明?

hostapd は、Wi-Fi アクセス ポイントの作成と管理に使用されるデーモンです。IEEE 802.11 のアクセス制御、認証、暗号化をサポートし、IPv4 および IPv6 ネットワークもサポートします。

hostapd のコードは C 言語で書かれており、主に次のモジュールに分かれています。

1. hostapd.c: hostapd のメイン ファイル。構成ファイルの解析、デーモンの初期化、信号処理などが含まれます。

2. driver_*: 基礎となるドライバーに関連するコード。主にワイヤレス ネットワーク カードとの通信を実装します。

3. hostapd.conf: hostapd 設定ファイルには、アクセス ポイントのさまざまなパラメータ設定が含まれています。

4. eapol_auth/eapol_sm: EAP 認証とキー管理を実装します。

5. utils: hostapd のいくつかのツール機能。

動作中、hostapd はまず構成ファイルを読み取り、さまざまなパラメーターを解析し、次に基礎となるドライバーを初期化し、さまざまなイベントをリッスンします。クライアントが接続すると、hostapd は EAP 認証およびキー管理モジュールを呼び出して、クライアントの認証と暗号化を完了します。同時に、hostapd はクライアント間のデータ送信の管理、データ パケットの送信ステータスの維持なども行います。

hostapd コードの中心となる部分は、ワイヤレス ネットワーク カードとの通信です。異なるワイヤレス ネットワーク カードには、hostapd と通信するための異なるドライバーが必要となるため、hostapd はドライバーと対話するためのいくつかのインターフェイス機能を提供し、さまざまなワイヤレス ネットワーク カードがこれらの機能を実装しやすくします。同時に、hostapd は、クライアントとの EAP 認証、キー管理などのいくつかの一般的なワイヤレス インターフェイス機能も提供し、ワイヤレス アクセス ポイントのさまざまな機能の実装を容易にします。

一般に、hostapd のコード構造は比較的明確で、主に構成ファイルの解析、基礎となるドライバー、EAP 認証、キー管理などのいくつかのモジュールに分かれています。hostapd を使用する場合は、実際の状況に応じて構成ファイルを変更し、hostapd デーモン プロセスを開始して独自の Wi-Fi アクセス ポイントを作成する必要があります。

  • WiFi ドライバーを使い始めるにはどうすればよいですか?

WiFi ドライバーを学習するには、Linux システム プログラミングの基礎とワイヤレス ネットワークの理解が必要です。WiFi ドライバーを使い始めるためのヒントをいくつか紹介します。

1. Linux カーネル ネットワーク プロトコル スタックを理解します。TCP/IP プロトコル、ネットワーク デバイス ドライバーなど、ネットワーク プロトコル スタックの基本的な知識を学びます。これらは WiFi ドライバーを理解するための基礎となります。

2. Linux デバイス ドライバー フレームワークを学習します。Linux デバイス ドライバー フレームワークとドライバー モデルを理解し、Linux ドライバーのロードおよびアンロード プロセスを理解します。

3. WiFi テクノロジーを学ぶ: WiFi 標準、WiFi プロトコル、チャネル、無線周波数などのワイヤレス ネットワーク テクノロジーを理解し、802.11 プロトコル スタックの基本原理を習得し、WiFi チップの動作原理に精通します。

4. WiFi ドライバーのソース コードを読む: WiFi ドライバーのソース コードを読むことが、WiFi ドライバーを学習する最良の方法です。まず、Linux カーネル、hostap、ath9k などに付属するドライバーなど、オープン ソースの WiFi ドライバー プロジェクトについて学ぶことができます。単純なドライバーから始めて、徐々にコードの実装とデバッグ手法を理解してください。

5. ツールチェーンとデバッグツールをマスターする: クロスコンパイルなどの基本的な開発ツールや、gcc、gdb、make などのデバッグツールの使い方をマスターします。

  • Linux カーネルのネットリンク通信

Netlink は、カーネル空間とユーザー空間の間でネットワーク関連情報 (ネットワーク インターフェイス、ルーティング テーブル、ARP テーブル、ソケットなど) を転送するために、Linux カーネルがプロセス間通信 (IPC) に使用するメカニズムです。Netlink ソケットは、ユーザー空間とカーネル空間の間でメッセージを渡すために使用される特別なソケットです。

Netlink は、スケーラブルで効率的なメッセージ指向のプロセス間通信メカニズムを提供します。ユーザー空間プロセスは、Netlink ソケットを使用して、カーネルにメッセージを送信し、特定の操作 (ルートの追加、ソケットの作成など) を要求し、カーネルからの応答を受信できます。カーネルは、Netlink ソケットを使用してユーザー空間に非同期通知を送信することもできるため、ユーザー空間のアプリケーションはネットワーク イベントについて適時に通知を受けることができます。

Netlink ソケットは、構成メッセージ、エラー メッセージ、マルチキャスト メッセージ、統計メッセージなどの複数のメッセージ タイプをサポートします。各メッセージ タイプには特定の形式があります。ユーザー空間アプリケーションは、Netlink ソケットを使用してカーネルと通信し、send()、recv() などの汎用ソケット API を使用して Netlink メッセージを送受信できます。

Linux システムでは、一部のツールとネットワーク管理アプリケーション (ifconfig、route、iptables、tcpdump など) は Netlink に基づいて実装されており、Netlink ソケットを使用してカーネルと通信し、ネットワーク構成情報を取得または変更できます。

要約すると、Netlink は、Linux カーネルとユーザー空間プロセス間の効率的でスケーラブルかつ柔軟なネットワーク通信のためのメカニズムを提供します。

  • WiFi タイミングを実装しますか?

WiFi タイミング機能は、スケジュールされたタスクのスクリプトを作成するか、システム独自のスケジュールされたタスク ツールを使用することによって実装できます。具体的な実装手順は次のとおりです。

1. スケジュールされたタスクのスクリプトを作成する

シェル スクリプトまたは Python などのスクリプト言語を使用して、WiFi スイッチのスケジュールされたタスク スクリプトを作成できます。たとえば、WiFi をオンまたはオフにするタイマーを設定するスクリプトを作成できます。

「」バッシュ

#!/bin/bash

# WiFiをオンにする

nmcli 無線 Wi-Fi がオンになっています

# 10分待ちます

睡眠600

# WiFiをオフにする

nmcli 無線 Wi-Fi オフ

2. システムに組み込まれているスケジュールされたタスク ツールを使用する

Linux システムに付属のスケジュールされたタスク ツールを使用すると、スケジュールされたタスクを簡単に実行できます。Ubuntu システムでは、crontab コマンドを使用して、スケジュールされたタスクを作成および管理できます。

たとえば、毎日午前 9 時に WiFi をオンにし、午後 5 時にオフにするには、次のコマンドを使用してスケジュールされたタスクを作成できます。

「」バッシュ

# スケジュールされたタスクを編集する

crontab -e

#次の 2 行をファイルに追加します

0 9 * * * nmcli 無線 Wi-Fi がオン

0 17 * * * nmcli 無線 Wi-Fi オフ

上記のコマンドは、対応するコマンドを毎日午前 9 時と午後 5 時に実行することを意味します。ここで、`0 9 * * *` は毎日午前 9 時に実行されることを意味し、`0 17 * * *` は毎日午前 5 時に実行されることを意味します毎日午後。実行されるコマンドは、`nmcli` コマンドを使用して WiFi をオンまたはオフにすることです。

実際のアプリケーションでは、特定のニーズに応じて対応するスケジュール タスク スクリプトを作成し、スケジュール タスク ツールを使用してそれらを定期的に実行することも必要です。

  • WiFi ステルスの原理について説明しますか?

Wi-Fi ステルスは SSID 隠蔽とも呼ばれ、ネットワーク名 (SSID とも呼ばれる) のブロードキャストを無効にすることでワイヤレス ネットワークを隠す方法です。これは、他の人が利用可能なワイヤレス ネットワークをスキャンするときにネットワークを見ることはできませんが、ネットワーク名がわかっていればネットワークに接続できることを意味します。

SSID を非表示にする原理は単純です。通常の状況では、Wi-Fi アクセス ポイントは定期的にビーコン フレームを送信して、近くのデバイスにアクセス ポイントの存在を通知します。これらのビーコン フレームには、ネットワークの SSID (ネットワーク名) およびアクセス ポイントに関するその他の情報が含まれています。SSID が非表示の場合、ビーコン フレームの SSID フィールドは空に設定され、アクセス ポイントは SSID をデバイスにブロードキャストしません。

非表示の Wi-Fi ネットワークに接続するには、ユーザーはネットワークの名前 (つまり SSID) と、事前共有キー (PSK) や 802.1X 認証資格情報などのその他のネットワーク認証情報を手動で入力する必要があります。場合によっては、利用可能なネットワークをスキャンするときにネットワークも見つかるように、デバイスの「SSID を非表示」オプションを有効にすることが必要になる場合があります。

SSID を非表示にしても、真のセキュリティは提供されないことに注意することが重要です。SSID を隠すとネットワークが攻撃者に見えなくなる可能性がありますが、この技術は悪意のある攻撃からネットワークを真に保護するものではありません。ネットワーク管理者は、ネットワークのセキュリティを確保するために、強力なパスワード、暗号化、アクセス制御などの他のセキュリティ対策を講じる必要があります。

  • ノートパソコンと携帯電話は同時に同じ WiFi に接続されています。ノートパソコンは IPV6 経由でルーター Web にアクセスできますが、携帯電話はアクセスできません。原因は何でしょうか?

この問題には複数の原因が考えられます。考えられる説明は次のとおりです。

1. 携帯電話のネットワーク設定の問題: 携帯電話のネットワーク設定で IPv6 が有効になっていないか、IPv6 が無効になっている可能性があります。電話機のネットワーク設定をチェックして、IPv6 が有効になっていることを確認できます。

2. ルーター設定の問題: ルーターの設定に問題がある可能性がありますので、ルーターの IPv6 設定を確認する必要があります。ルーターで IPv6 が正しく構成されていない場合、一部のデバイスが IPv6 経由でネットワークにアクセスできなくなる可能性があります。

3. 携帯電話のハードウェアの問題: 携帯電話のハードウェアが IPv6 をサポートしていない可能性があり、その結果、IPv6 経由でネットワークにアクセスできなくなります。このような状況は比較的まれであり、一般的に言えば、最新の携帯電話のほとんどは IPv6 をサポートしています。

4. ルーターと携帯電話の間のネットワークの問題: ルーターと携帯電話の間のネットワーク接続に問題があり、その結果、IPv6 経由でネットワークにアクセスできなくなる可能性があります。ルーターと電話機を再起動するか、他のネットワーク接続を使用してみてください。

要約すると、この問題はさまざまな理由で発生する可能性があり、特定の状況に応じて調査する必要があります。問題を解決できない場合は、ネットワーク サービス プロバイダーまたは製造元のテクニカル サポート部門に問い合わせてください。

  • Ptables が physdev と一致する原理は何ですか?

Linux システムでは、「iptables」コマンドはファイアウォール ルールを管理できる非常に強力なツールです。特定のパケットをフィルタリングする必要がある場合は、「iptables」コマンドを使用して、送信元 IP、宛先 IP、プロトコル タイプ、ポートなどのデータ パケットの属性を照合できます。さらに、「iptables」は「physdev」のマッチングもサポートしています。このパラメータは、データ パケットの物理インターフェイス、つまり、データ パケットがどのネットワーク カード インターフェイスから受信するのか、またはどのネットワーク カード インターフェイスから送信されるのかを照合するために使用できます。 。

「physdev」パラメータを使用する場合、通常、Linux システムがルーターまたはゲートウェイ デバイスとして使用されるシナリオで使用されます。たとえば、2 つのネットワーク インターフェイスがあり、1 つはインターネットに接続され、もう 1 つは内部 LAN に接続されている場合、「physdev」パラメータを使用して、特定のネットワーク カードに対してのみパケット フィルタリングを実装できます。

以下は、「physdev」パラメータを使用してパケットを照合するルールの例です。これは、「eth1」という名前のインターフェイスからの受信 ICMP パケットを拒否します。

iptables -A FORWARD -p icmp -m physdev --physdev-in eth1 -j DROP

このルールは「FORWARD」チェーンに追加され、これが転送されたパケットをフィルタリングするためのルールであることを示します。「-p icmp」は、このルールが ICMP プロトコルのデータ パケットのみに一致することを意味します。「--physdev-in eth1」は、「eth1」インターフェイスから入力されるデータ パケットのみに一致することを意味します。「-j DROP」は、データ パケットは照合され、直接破棄されます。

簡単に言えば、「physdev」パラメータを使用すると、特定のネットワーク カードのパケットをフィルタリングできるため、ネットワーク トラフィックをより詳細に制御できます。

iptables では、「physdev」マッチング モジュールを使用して、ネットワーク カードなどの特定の物理ネットワーク デバイスをマッチングします。これは、物理デバイスに基づいてトラフィックをフィルタリングするための一致条件としてルールで使用されます。

`physdev` と一致させるには、次のコマンドを使用できます。

iptables -A INPUT -m physdev --physdev-in eth0 -j ACCEPT

このコマンドは、eth0 ネットワーク カードを介して入力されたデータ パケットが許可されることを示します。

このうち、「--physdev-in」オプションは物理デバイスに合わせた入力インターフェースを指定し、「-j」オプションはアクションを指定するもので、ここではパケットを受け入れることを意味する「ACCEPT」となっています。

`--physdev-out` オプションを使用して、物理デバイスに一致する出力インターフェイスを指定することもできます。次に例を示します。

iptables -A OUTPUT -m physdev --physdev-out eth0 -j DROP

このコマンドは、eth0 ネットワーク カードを介して出力されるデータ パケットをブロックすることを意味します。

「physdev」モジュールはカーネルベースのファイアウォールでのみ使用でき、「nftables」などのユーザー空間のファイアウォールでは使用できないことに注意してください。さらに、物理インターフェイス名は「eth」、「wlan」、または「wlp」で始まる必要があります。そうしないと、このルールは機能しません。

  • Linux 関数 iw_get_ext() は何をするのでしょうか?

私の知識によれば、「iw_get_ext()」関数は Linux システムの標準関数ではなく、ワイヤレス ネットワーク インターフェイスの拡張情報を取得するために使用される「wireless-tools」ツールキットの関数です。

具体的には、「iw_get_ext()」関数は、指定された無線ネットワークインターフェースの指定された拡張情報を取得するために使用される関数である。その関数プロトタイプは次のとおりです。

int iw_get_ext(int sockfd, const char *ifname, int request, struct iwreq *wrq);`

この関数のパラメータについては以下で説明します。

- `sockfd`: ソケットファイル記述子。

- `ifname`: ワイヤレス ネットワーク インターフェイスの名前。

- `request`: 要求された拡張情報の種類。

- `wrq`: 拡張情報を格納するために使用される構造体 `iwreq` へのポインタ。

「iw_get_ext()」関数は、成功を示す値 0 を返し、エラーを示す他の値を返します。この関数の具体的な実装と使用法については、「wireless-tools」のドキュメントまたはソース コードを参照してください。

「wireless-tools」ツール パッケージはいくつかの新しいツールとライブラリに置き換えられたため、「iw_get_ext()」関数は新しい Linux システムでは使用できなくなる可能性があることに注意してください。

  • この SIOCGIWRTLSTAINFO とは何ですか?

`SIOCGIWRTLSTAINFO` は Linux システムのマクロ定義であり、ワイヤレス ネットワーク インターフェイスのリアルタイムの接続ステータス情報を取得するために使用されます。

具体的には、「SIOCGIWRTLSTAINFO」は、「ioctl()」システムコールで取得する拡張情報の種類を示すパラメータである。ワイヤレス ネットワーク インターフェイスのコンテキストでは、「SIOCGIWRTLSTAINFO」パラメータを使用して、現在インターフェイスに接続されているすべてのクライアント デバイスのリアルタイム ステータス情報を取得します。

`SIOCGIWRTLSTAINFO` を使用するには、`iwreq` 構造体を作成し、そのタイプ フィールド `u.data.flags` を `IWRTL_STAINFO` に設定して、接続ステータス情報を取得したいことを示す必要があります。次に、「ioctl()」システムコールのパラメータをソケットファイル記述子、「SIOCGIWRTLSTAINFO」マクロ定義、および「iwreq」構造体へのポインタに設定して、接続ステータス情報を取得します。

「SIOCGIWRTLSTAINFO」は一部のワイヤレス ネットワーク カードに固有の拡張情報タイプであるため、すべてのワイヤレス ネットワーク カードがこの機能をサポートしているわけではないことに注意してください。さらに、新しい Linux システムでは、「wireless-tools」ツールキットと「SIOCGIWRTLSTAINFO」マクロ定義は使用されなくなる可能性がありますが、ワイヤレス ネットワーク インターフェイスの接続ステータス情報を取得するために、より最新のツールと API が使用される場合があります。

  • この SIOCGIWNAME は何のためにあるのでしょうか?

SIOCGIWNAME` は Linux システムのマクロ定義であり、ワイヤレス ネットワーク インターフェイスの名前を取得するために使用されます。

具体的には、「SIOCGIWNAME」は、「ioctl()」システムコールで取得する拡張情報の種類を示すパラメータである。ワイヤレス ネットワーク インターフェイスのコンテキストでは、インターフェイスで使用されるワイヤレス ネットワーク カード ドライバーの名前を取得するために、「SIOCGIWNAME」パラメーターが使用されます。

`SIOCGIWNAME` を使用するには、`iwreq` 構造体を作成し、そのタイプ フィールド `u.data.flags` を `0` に設定して、ワイヤレス ネットワーク カード ドライバーの名前を取得することを示す必要があります。次に、「ioctl()」システムコールのパラメータをソケットファイル記述子、「SIOCGIWNAME」マクロ定義、および「iwreq」構造体へのポインタに設定して、ワイヤレスネットワークカードドライバの名前を取得します。

「SIOCGIWNAME」はワイヤレス ネットワーク カード ドライバーに固有の拡張情報タイプであるため、すべてのワイヤレス ネットワーク カードがこの機能をサポートしているわけではないことに注意してください。さらに、新しい Linux システムでは、「wireless-tools」ツール パッケージと「SIOCGIWNAME」マクロ定義は使用されなくなる可能性がありますが、ワイヤレス ネットワーク インターフェイス情報を取得するために、より最新のツールと API が使用される場合があります。

  • このコードは何を意味するのでしょうか? fp = Popen("hostapd_cli -i wlan0 all_sta | gredot11RSNAStatsSTAAddress", "r");

このコード行は、C 言語の「popen()」関数を使用して Linux システム コマンド ライン ツール「hostapd_cli」を呼び出し、ワイヤレス ネットワーク ポート「wlan0」上に接続されているすべてのクライアント デバイスの RSNA (Robust Security Network Association) ステータスを取得します。 `grep` コマンドは、`dot11RSNAStatsSTAAddress` フィールドをフィルターで除外し、結果をファイル ストリーム `f. に出力します。

具体的には、このコード行の動作は次のとおりです。

1. `popen()` 関数を使用して子プロセスを読み取り専用モードで開き、その標準出力ストリームをファイル ストリーム `fp` に関連付けます。

2. 子プロセスで「hostapd_cli -i wlan0 all_sta」コマンドを実行すると、指定したワイヤレス ネットワーク インターフェイス上で接続されているすべてのクライアント デバイスの詳細なステータス情報が返されます。

3. このコマンドの出力をパイプ経由で `grep dot11RSNAStatsSTAAddress` コマンドに渡します。これにより、`dot11RSNAStatsSTAAddress` フィールドの値がフィルタリングされ、結果が標準出力ストリームに出力されます。

4. `popen()` 関数は、標準出力ストリームのデータをファイル ストリーム `fp` に読み取り、ファイル ストリーム ポインタ `fp` を返します。

このコード行の実行は、Linux システムにインストールされ正しく構成されている「hostapd_cli」コマンド ライン ツールに依存することに注意してください。さらに、このコード行のコマンド ライン パラメータ「all_sta」は、「hostapd_cli」コマンドのパラメータであり、接続されているすべてのクライアント デバイスのステータス情報を取得することを示すために使用されます。

  • ルーターリレーモードとブリッジモードの違いを詳しく説明します。

リレー モードとブリッジ モードはどちらも複数のネットワーク デバイスを接続するためのモードですが、実装と機能が異なります。

1. リレーモード

ワイヤレス リレーとも呼ばれるリレー モードは、無線信号を介してあるルーターから別のルーターに信号を転送します。リピーター モードでは、2 番目のルーターが最初のルーターからワイヤレス信号を受信し、その信号を再ブロードキャストします。リピーター モードは通常、Wi-Fi 信号範囲を拡張するために使用されます。

リピーター モードの利点は、有線接続を必要とせずに Wi-Fi 信号の到達範囲を拡張できることです。ただし、リレー モードには次のような欠点もあります。

- 速度の低下: リピーター モードでは、信号を 2 回送信する必要があるため、速度が低下します。

- セキュリティの低下: リレー モードでは、データが 2 つのルーターを経由する必要があるため、セキュリティも低下します。

2. ブリッジモード

ブリッジ モードは、トランスペアレント ブリッジ モードとも呼ばれ、2 つ以上のネットワーク デバイスを接続して、1 つの大きな LAN のように見せます。ブリッジ モードでは、デバイス間の通信は、ルーティングなしで、あたかも同じネットワーク上にあるかのように行われます。

ブリッジモードのメリットはルーターを使わずにLANの範囲を拡張でき、機器間の通信速度も向上します。ただし、ブリッジ モードには次のような欠点もあります。

- 複雑な構成: ブリッジ モードでは手動構成が必要であり、各デバイスの IP アドレスが重複しないようにする必要があります。

- セキュリティの問題: すべてのデバイスが同じ LAN 上にあるため、ネットワークのセキュリティが低下する可能性があります。

つまり、リレー モードとブリッジ モードはどちらも複数のネットワーク デバイスを接続する方法ですが、実装方法とアプリケーション シナリオが異なります。リレー モードは Wi-Fi 信号範囲を拡張する必要があるシナリオに適しており、ブリッジ モードは LAN 範囲を拡張する必要があるシナリオやデバイス間の通信速度を向上させる必要があるシナリオに適しています。

  • ルーターのQOS速度制限の原理の説明

QoS (Quality of Service) は、ネットワーク トラフィックの優先度に応じてネットワーク帯域幅を割り当て、制限し、優先度の高いネットワーク トラフィックが十分な帯域幅リソースを確実に受信できるようにするネットワーク テクノロジです。

ルーターに QoS レート制限を実装する原理は次のとおりです。

1. トラフィック分類: ルーターはまずネットワーク トラフィックを分類し、VoIP、ビデオ、データなどのさまざまなタイプに分類します。

2. トラフィック ポリシング: ルーターは、分類されたトラフィック タイプに基づいて異なる帯域幅制限を設定し、各トラフィック タイプの帯域幅使用を制限します。たとえば、ビデオ トラフィックの帯域幅を 1Mbps に制限します。

3. トラフィック シェーピング: バースト トラフィックの影響を回避するために、ルーターはトラフィックをシェーピングすることができます。つまり、特定のルールに従ってトラフィックを調整します。たとえば、ビデオ トラフィックの帯域幅を 1 Mbps に制限し、この 1 Mbps の帯域幅リソースを 1 秒以内にできるだけスムーズに消費できるようにします。

4. キューイングとスケジューリング: 複数の種類のトラフィックが同時にルータに流入する場合、ルータは優先度の高いトラフィックができるだけ早く処理されるようにトラフィックをキューイングしてスケジュールする必要があります。たとえば、VoIP トラフィックを優先処理のキューの先頭に置きます。

上記の手順を通じて、ルーターは QoS 速度制限を実装して、ネットワークの安定性を確保し、ネットワークの使用エクスペリエンスを最適化できます。

  • LinuxカーネルにおけるQOS速度制限の実装原理の説明

Linux カーネルでは、QOS 速度制限は主にトラフィック制御 (TC) を通じて実装されます。

トラフィック コントロールは、Linux カーネルの非常に重要なネットワーク トラフィック管理サブシステムであり、ネットワーク データ トラフィックを制御および制限できます。その実装原理は、カーネルのクラス階層とフィルター フレームワークに基づいており、ネットワーク デバイス ドライバーに TC クラスを登録し、各 TC クラスで異なるキューとフィルター ルールを定義することで、さまざまなトラフィック フローの制御と制御を実現します。

QOS レート制限を実装する場合は、まず TC クラスを作成し、その中でさまざまなキューとフィルタリング ルールを定義する必要があります。たとえば、HTB (階層トークン バケット) スケジューリング アルゴリズムを使用して、帯域幅制限を実装し、各キュー内のデータ フローを特定の帯域幅範囲に制限できます。同時に、iptables などのツールを使用してフィルタリング ルールを定義し、さまざまなデータ フローを分類し、管理のためにそれらをさまざまなキューに入れることができます。

具体的には、フロー コントローラーの HTB スケジューリング アルゴリズムは、キューごとにトークン バケットを設定して、キューの送信速度と量を計算して制限します。トークン バケットには、トークン レートとバケット サイズという 2 つの重要なパラメータが含まれています。ここで、トークン レートは 1 秒あたりに送信できるデータ パケットの数を表し、バケット サイズはトークン バケットの最大容量を表します。データ パケットを送信すると、トークン バケットは対応するトークンの数を減らし、残りのトークンをトークン バケットに保存します。トークン バケット内のトークンの数が不十分な場合、十分なトークンがトークン バケットに再蓄積されるまでデータ パケットを送信できません。

さらに、 tc qdisc コマンドを使用して、次のようなさまざまなキューとレート制限ルールを作成することもできます。

#eth0:1 という名前の仮想デバイスを作成し、qdisc tc クラスに追加します。

tc qdisc add dev eth0 ハンドル 1:0 root htb デフォルト 1

# 帯域幅制限が 1Mbps のキューを作成し、eth0:1 にマウントします

tc クラス add dev eth0 親 1:0 クラス ID 1:1 htb レート 1mbit

# 送信元 IP アドレス 192.168.1.1/24 のパケットを eth0:1 の 1Mbps 帯域幅に制限します

tc フィルター add dev eth0 プロトコル ipparent 1:0 prio 1 u32 match ip src 192.168.1.1/24 flowid 1:1

上記のコマンドにより、eth0:1 という名前の仮想デバイスを作成し、TC クラスに追加できます。次に、帯域幅制限が 1Mbps のキューを作成し、eth0:1 にマウントします。最後に、tc filter コマンドを使用して、送信元 IP アドレス 192.168.1.1/24 のデータ パケットを eth0:1 の 1Mbps 帯域幅に制限します。

つまり、QOS レート制限は主に、データ パケットを分類およびマークし、異なる優先順位とレート制限ポリシーを設定することによって、さまざまなトラフィック フローの制御と管理を実現します。Linux カーネルでは、QOS レート制限機能は主にトラフィック コントロール (TC) によって実装されており、TC はネットワーク機器のトランスポート層でデータ パケットの分類、マーク付け、レート制限などの操作を行うことができます。TC は、クラスベースの管理方法を採用して、さまざまなトラフィックをさまざまなクラスに分割し、さまざまなフィルタリング ルールとキュー スケジューリング アルゴリズムを通じてレート制限を実装します。具体的には、Linux カーネルは、ネットワーク デバイス上でさまざまな qdisc とクラスを構成することによって QOS レート制限を実装します。qdisc は主にキューのスケジューリングに使用され、クラスは主にトラフィックの分類とマーキングに使用されます。qdisc とクラスでは、HTB、TBF、PRIO などのさまざまなパラメーターとアルゴリズムを構成することによって、さまざまなレート制限戦略が実装されます。

  • Linux カーネルが QOS 速度制限を実装するための主な手順は次のとおりです。

1. qdisc を設定する

まず、レート制限が必要なネットワーク デバイス上で qdisc (キュー規律) を設定する必要があります。qdisc は、ネットワーク デバイスの送信キューにキューイングし、各パケットに優先順位を割り当て、特定のルールに従ってパケットを送信する役割を果たします。一般的に使用される qdisc には、pfifo_fast および htb が含まれます。

2. クラスを作成する

特定のトラフィック タイプを表すクラスを作成します。たとえば、VoIP トラフィックを表すクラスと、ビデオ トラフィックを表す別のクラスを作成できます。各クラスは、送信動作を制御するための異なる qdisc を持つことができます。

3. 帯域幅の割り当て

各クラスに帯域幅を割り当てて、各クラスが送信できる最大帯域幅を決定します。Linux カーネルでは、tc コマンド (トラフィック制御) を通じて帯域幅の割り当てを実行できます。たとえば、 tc コマンドを使用して、帯域幅の 20% を VoIP クラスに割り当て、帯域幅の 40% をビデオ クラスに割り当て、帯域幅の残りの 40% をデフォルト クラスで使用できます。

4. パケットにマークを付けます

Linux カーネルでは、iptables または tc コマンドを使用してデータ パケットにマークを付けることができ、後続の qdisc がそのマークに基づいてデータ パケットを処理できるようになります。たとえば、iptables コマンドを使用して VoIP パケットにマークを付け、これらのパケットを VoIP クラスに送信して、VoIP トラフィックが十分な帯域幅を受信できるようにすることができます。

5. 速度制限の実施

最後に、特定のレート制限戦略を各クラスに実装する必要があります。Linux カーネルでは、tc コマンドを使用して qdisc を構成し、さまざまなレート制限戦略を実装できます。一般的に使用されるレート制限戦略には、htb および tbf が含まれます。たとえば、htb qdisc を使用して各クラスの最大帯域幅を設定し、それによって各クラスの送信レートを制限できます。

要約すると、Linux カーネルで QOS 速度制限を実装するプロセスには、qdisc、クラス、帯域幅割り当て、マークされたパケット、速度制限戦略などの多くの側面が含まれます。

  • Linux の接続追跡は正確に何に使用されますか?

Linux の接続追跡は、ネットワーク接続内のすべてのパケットを追跡し、そのステータス、プロトコル、その他の情報を記録できるカーネル メカニズムです。その主な役割は、ネットワーク セキュリティとネットワーク管理のサポートを提供することです。

具体的には、Linux 接続追跡では次の機能を実現できます。

1. ファイアウォール ルール: 接続追跡ではネットワーク接続のステータスを追跡でき、ファイアウォール ルールではこれらのステータスに基づいてネットワーク トラフィックをフィルタリングして、ネットワーク セキュリティを保護できます。

2. 負荷分散: 接続追跡では、ネットワーク接続のステータスを追跡し、これらのステータスを使用してトラフィックを識別して負荷分散し、ネットワーク パフォーマンスを向上させることができます。

3. ネットワーク診断: 接続追跡により、送信元アドレス、宛先アドレス、ポート番号、プロトコルなどを含む詳細なネットワーク接続情報が提供され、ネットワーク診断とデバッグに使用できます。

要約すると、接続追跡は、ネットワーク セキュリティ、ネットワーク管理、およびネットワーク パフォーマンスをサポートする重要なカーネル メカニズムです。

  • Linux接続追跡の実装原理?

Linux 接続追跡 (Connection Tracking) とは、Linux カーネルでネットワーク接続ステータスの追跡と管理を実装するテクノロジを指します。接続追跡モジュールは nf_conntrack と呼ばれ、主にネットワーク アドレス変換 (NAT)、ファイアウォール、負荷分散、その他の機能を実装するために使用されます。

nf_conntrack は、ルーターを流れる IP データ パケットの接続状態をメモリに保存します。これには、接続の開始時刻、ターゲット IP アドレス、ポート番号、接続状態 (接続、切断など) およびその他の情報が含まれます。データ パケットがルーターに入ると、nf_conntrack はメモリに保存されている接続ステータス テーブルを照会して、データ パケットが確立された接続に属しているかどうかを判断し、接続ステータスに基づいてデータ パケットの処理方法 (許可するかどうかなど) を決定します。ファイアウォール経由、NAT の実行など。

nf_conntrack モジュールは次のように動作します。

1. nf_conntrack はネットワークプロトコルスタックのフック関数に登録されており、データパケットがプロトコルスタックを通過する際に nf_conntrack が呼び出されます。

2. nf_conntrack が呼び出されると、最初にパケットが IP プロトコルかどうかを確認し、そうでない場合はパケットを無視します。

3. データ パケットが IP プロトコルの場合は、データ パケットの接続ステータスを確認します。新しい接続の場合は、新しい接続ステータスを接続ステータス テーブルに追加します。既存の接続がある場合は、接続を更新します。接続ステータステーブルの状態。

4. データ パケットを NAT またはファイアウォールで処理する必要がある場合、nf_conntrack は接続ステータス テーブルから関連する接続情報を照会し、対応する処理を実行します。

5. 接続ステータステーブルの接続ステータスが削除されると、nf_conntrack は対応する接続​​ステータス情報をメモリから削除します。

接続追跡は Linux カーネルの非常に重要な部分であり、NAT、ファイアウォール、VPN などのネットワーク アプリケーションに重要な技術サポートを提供します。

  • Linux カーネル プロトコル スタックにおける skb_buff の本質は何ですか?

Linux カーネル プロトコル スタックでは、skb_buff はネットワーク データ パケットを記述するために使用されるデータ構造を指します。これは本質的に、データ パケットのプロトコル、送信元アドレス、宛先アドレス、データ長など、ネットワーク データ パケットのさまざまな情報を保存するために使用されるリンク リストです。

skb_buff は、カーネル プロトコル スタック全体で使用される非常に重要なデータ構造です。ネットワーク パケットが受信されると、パケットは skb_buff にカプセル化され、処理のためにカーネル内のさまざまなネットワーク プロトコル スタックに渡されます。処理中に、最終的にデータ パケットが送信されるまで、skb_buff 内のさまざまな情報が変更されます。

skb_buff には、ネットワーク パケットに関する情報の記述に加えて、他の用途もあります。たとえば、カーネル内のルーティング情報、ネットワーク デバイスのステータスなどの制御情報を記述するために使用できます。さらに、skb_buff はデータ パケットのキャッシュ管理にも使用でき、ネットワーク データ パケットのフラグメンテーション、マージ、コピーなどの操作を実装できます。

おすすめ

転載: blog.csdn.net/buhuidage/article/details/129097555