2008年6月13日

[linux-users:108035] Re: 仮想NIC

早間です。

> 呂です。
> > ■ やりたいこと
> > 物理的には1つのNIC(Ethernet)に、2つのIPアドレスを振り、なおかつそれぞれ
> > 別のMACアドレスで使用したい。
> >
> 物理的にひとつのNICに二つのMACを使用するのは無理です。

> このMACがNICメーカーがHardに書き込んだ情報で、出荷した
> 時点から変更できない、設定出来ないものです。
>

検索で拾って来たプログラムですが添付のプログラムで MAC の変更は出来
ます。中にある MAC は VMware のものです。

松元さんも仰っていますが私は VMware で物理的には 一つの NIC で複数
の MAC と xx.xx.xx.00/24 に属する複数の IP アドレスを親機、仮想機
で使用しています(Bridge 機能です。)。

linux の機能として comand library として実現されているとは
思っていませんが(??)
(1) 送出するパケットの MAC と IP を書き換える。
(2) ARP の問いかけにしかるべき MAC を答える
様な機能を tcpdump と同じように Promiscast モードの NIC に対して
実行すれば可能かと思います。

VMware では NIC が wireless の場合は複数の IP に対して一つの MAC
を適用して通信を行っています。つまり、異なった2つ以上の IP に対して同じ
MAC を ARP で返しているのです。
(linux-2.6.23 まで、linux-2.6.24 以降はこの機能を確認していません)。

当然の事ですが VMware では仮想機は(まるで)独立した NIC を持って
いるように働きます。

所詮は「プログラム仕事」ですから、送出・受信パケットを制御するだけ
なのですが、
一つの OS の中では他の機能との関連もあり大変かと思います。

目的に合うか否かは別として、私なら、2以上の仮想機を作成し、必要な
OSをインストールして実現します。

---------------------------- ここから ---------------------------
#include <stdio.h>
#include <string.h> /* for strncpy */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <net/if_arp.h>
int main()
{
int fd;
struct ifreq ifr;
fd = socket(AF_INET, SOCK_DGRAM, 0);
/* ethernetである */
ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
/* 変更するMACアドレス値 */
/* 00:50:56:C0:00:01 */
ifr.ifr_hwaddr.sa_data[0] = 0x00;
ifr.ifr_hwaddr.sa_data[1] = 0x50;
ifr.ifr_hwaddr.sa_data[2] = 0x56;
ifr.ifr_hwaddr.sa_data[3] = 0xc0;
ifr.ifr_hwaddr.sa_data[4] = 0x00;
ifr.ifr_hwaddr.sa_data[5] = 0x01;
/* eth0を変更 */
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
/* MACアドレス変更 */
if (ioctl(fd, SIOCSIFHWADDR, &ifr) != 0) {
/* 失敗したら理由を表示 */
perror("ioctl");
}
close(fd);
return 0;
}
---------------------------- ここまで ---------------------------

-- 早間 yossi@xxxxx

投稿者 xml-rpc : 2008年6月13日 12:18
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/74135
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。