0

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 には影響しません。

4

1 に答える 1

2

UDP パケットを送信すると、カーネルの UDP スタックは常にヘッダーを正しい値に設定します。

送信されるものをさらに制御したい場合は、生のソケットを使用する必要があります。

ウィキペディアの生のソケット

raw sockest の linux man ページ

これは難しく、root 権限が必要であることに注意してください。

于 2013-08-08T18:27:33.663 に答える