5

2 つのイーサネット アダプターを備えた Linux デバイス (実際にはプロトタイプ用の BeagleBoard) があります。私が欲しいのはこれです:

  • プライマリ イーサネット インターフェイス (eth0) は、クライアントのネットワークに接続します (DHCP または静的 IP が割り当てられている場合があります)。

  • 2 番目のイーサネット インターフェイス (eth1) は、別の Linux ボードに直接接続します。

  • Beagle 上のユーザーレベルの C プログラムは、クライアントのネットワーク (eth0 上) からの着信接続をリッスンし、必要に応じて応答し、場合によっては eth1 上の他のデバイスに接続できます。

  • 2 番目のデバイスをネットワークの残りの部分から完全に隠して、Beagle 上のプログラムだけが接続できるようにします。

私は、2 つのインターフェースが完全に分離され、私のコードが接続をリッスン/オープンするインターフェースを選択できることを望んでいました。典型的なコード:

socket_desc = socket(AF_INET, SOCK_STREAM, 0);

memset(&client_addr, 0, sizeof(client_addr)); 
client_addr.sin_family = AF_INET;
inet_pton(  AF_INET, address, (void *)(&(client_addr.sin_addr.s_addr))  );
client_addr.sin_port = htons(port);   

/* Connect to remote on TCP port: */
connect(*socket_desc, (struct sockaddr*) &client_addr, sizeof(client_addr) );
...

接続するアドレスとポートを設定できますが、イーサネット インターフェイスは設定できません。私はこの答えを見つけました。これは、私が達成しようとしていることはカーネルルーティングに任せなければならないということですか?

eth1 を独自のサブネットに設定できることはわかっていますが、これには問題があります。クライアントのネットワークについて何も知らない場合、使用するサブネットが競合しないことをどのように確認できますか?クライアントのネットワークと?たとえば、ここでは 192.168.1.0 を使用しているので、eth1 を 192.168.0.0 に配置できます... しかし、クライアントがその範囲を使用するとどうなるでしょうか? eth0 を構成する必要があるかもしれませんが、展開ごとに eth1 とそれに接続されたデバイスの設定を再構成する必要はありません。

これを行うためのより良い方法はありますか?それとも、クライアントのネットワークと競合しないことが保証されている eth1 のサブネットに使用できる予約済みの IP アドレス範囲 (例: 169.254.1.x)?

申し訳ありませんが、これは少しあいまいですが、私はこれを何日もグーグルで検索しており、おそらく混乱が減るどころか、ますます混乱しています。

編集 - 2013-08-29:

部分的な答えを提供するこの質問を見つけました。setsockopt(...)SO_BINDTODEVICEと共に使用して、特定のデバイス/インターフェイスにバインドできます。これは機能しているようですが、「内部」ネットワークがたまたま eth0 に接続された「外部」ネットワークと同じ IP アドレス範囲を持っている状況で確実に動作するようにルーティング テーブルを設定する方法がわかりません。

4

1 に答える 1

1

プロジェクトに同じ要件があり、最終的に LXC を使用することになりました。これにより、コンテナーに物理インターフェイスを割り当てることができるため、たとえば、同じ IP アドレス サブネットを持つコンテナーを作成できました。

http://lxc.sourceforge.net/で確認してください。

于 2013-09-06T20:42:20.390 に答える