0

poxコントローラーを使用してワーム検出コードを書いています。コントローラーがパケットをホストに直接送信する関数を作成する方法を誰か教えてください。つまり、ホスト A がホスト B にフロー ルールとして ****TCPSYN**** パケットを送信すると仮定します。スイッチがコントローラーにパケットを送信するよりも利用できません.****コントローラー****がフロールールをインストールせずにホストBにパケットを送信する関数を書きたい.私はパケット処理コードを書いています.

def _handle_PacketIn (自己、イベント):

packet = event.parsed
log.info("Packet come in %s"%packet.type)
dpidstr = dpid_to_str(event.dpid)
# updating out mac to port mapping
self.macToPort[(event.connection,packet.src)] = event.port
dst_port = self.macToPort.get((event.connection,packet.dst))

tcpp = packet.find('tcp')
if tcpp and tcpp.SYN:
        #here i want to write code where my controller will send tcp syn packet received from host A to the destination host(B) with installing any flow rules
if tcpp and tcpp.ACK:
        #here i want to write code where my controller will receive tcp synack packet and send this syn ack packet to the sender(A) which has sent syn packet to host (B) 

実際、私のアルゴリズムは

  1. 内部ホスト A が新しい外部ホスト B に TCP SYN を送信するとします。スイッチにはこのパケットに一致するフローがないため、POX コントローラに送信されます。
  2. POX コントローラで実行されている TRW-CB インスタンスは、フローを設定せずに、スイッチを介してこのパケットを転送するだけです。同時に、アルゴリズムは通常の処理も行います (つまり、A が以前に接続したホストのリストに B を追加し、接続要求を A のキューに追加します)。
  3. B からの 2 つの可能な応答は次のとおりです。SYNACK を受信すると、コントローラの TRW-CB インスタンスはスイッチに 2 つのフローをインストールします。最初のフローは、A から B に送信されたすべてのパケットに一致します。これには、IP src フィールドに A の IP アドレスが含まれ、IP dst フィールドに B の IP アドレスが含まれます。Ether タイプ (IP に設定されている) を除いて、フロー内の他のすべてのフィールドはワイルドカードです。2 番目のフローは最初のフローと似ていますが、B から A に送信されたすべてのパケットに一致します。各フローには、一致するパケットをスイッチの関連するポートから転送するアクションが含まれています。さらに、TRW-CB は通常の処理も行います (つまり、この接続要求を A のキューから削除し、A の尤度比を減らします)。
4

1 に答える 1

0

パケットを処理するためのコードをいくつか用意しておくと役立ちますが、とにかく、最も単純で一般的な状況をカバーしてみます。

メインクラスの init 関数のイベントにパケットのリスナーがあると仮定すると、次のようになります。

core.openflow.addListenerByName("PacketIn", self._handle_PacketIn)

そして、イベントを処理する関数で

def _handle_PacketIn (self, event): msg = of.ofp_packet_out(data=event.ofp) msg.actions.append(of.ofp_action_output(port=of.OFPP_FLOOD)) event.connection.send(msg)

したがって、メッセージはコントローラーがスイッチに送信するものであり、すべてのポートをカバーするために、着信パケットをどこにでもフラッディングするだけです。宛先がわかっている場合は、ここで調整して、目的のポートにのみパケットを送信できます。これは閉ループでは失敗しますが、出発点になります。http://archive.openflow.org/wk/index.php/OpenFlow_Tutorial#ofp_action_output_classで ofp_action_output クラスの詳細を確認してください。

于 2016-04-20T15:22:36.893 に答える