C、Eclipse、Ubuntu 12.04でコードを書いています。ソケットを開き、なりすましソース IP から UDP パケットを送信しています。仮想マシン (同じコード、Eclipse、Ubuntu バージョン) でコードを実行するとすべて問題ありませんでしたが、実際の Ubuntu マシンで実行しようとすると正しく動作しません。
bzero(&spoof_addr, sizeof(spoof_addr));
spoof_addr.sin_family = AF_INET;
spoof_addr.sin_port = htons(SERVERPORT);
if (inet_aton("192.168.160.240", &spoof_addr.sin_addr)==0)
{
fprintf(stderr, "inet_aton() failed\n");
exit(1);
}
if ((sockfd_spoofed = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
err("socket");
bind(sockfd_spoofed,(struct sockaddr*)&spoof_addr,sizeof(spoof_addr));
//Send the packet
if (sendto(sockfd_spoofed, buf_port, 5, 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr))==-1)
問題は、Ubuntu/カーネルがソース IP を、私が持っている唯一のインターフェイスの実際の IP に変更することです。Eclipse は、エラーや警告なしで実行されます。だから、パケットがEclipseアプリケーションを離れた後にIPが変化していることを理解しています。次のように追加の IP を追加しようとしました: ifconfig eth0:1 192.168.160.240 netmask 255.255.255.0 up (これは仮想マシンで機能しました) が、実際の PC には影響しません。