2013-07-05 59 views
4

我正在嘗試更改tcp數據包的源IP地址。給出波紋管tcp客戶端中的bind()調用

bzero(&clientaddr,sizeof(clientaddr)); 
clientaddr.sin_family = AF_INET; 
clientaddr.sin_addr.s_addr=inet_addr("172.16.2.10"); 
clientaddr.sin_port=htons(8080); 
if (bind(sockfd, (struct sockaddr *) &clientaddr, 
    sizeof(clientaddr)) < 0) 
{ 
    perror("bind"); 
} 

綁定特定端口的代碼段工作正常, 但是當我試圖用不同勢IP地址綁定,綁定與錯誤

bind: Cannot assign requested address 

我也試過失敗設置套接字選項如下,]

setsockopt (sockfd, SOL_IP, IP_TRANSPARENT, &n1, sizeof(int));* 

然後也失敗,同樣的錯誤。

我怎麼能改變我的源IP地址的數據包,源自我的電腦。 請幫助我,它的代理應用程序。

OS:Linux的2.6.37-tproxy#1 SMP星期三04月03日23點34分〇〇秒IST 2013 x86_64的x86_64的x86_64的GNU/Linux的

預先感謝。

+0

請提及你的內核和操作系統版本.. – VoidPointer

+0

不知道,但你可能必須使用原始套接字來做到這一點 – Barmar

+0

@Barmar如果沒有錯,我已經在CentOS/RHEL 6.0中以同樣的方式看到了這種可能OP did – VoidPointer

回答

0

只能將bind()設置爲本地計算機的IP地址,即通過其中一個網絡接口實現。

+0

您是否熟悉Linux透明代理功能?請參閱內核文檔中的tproxy.txt和IP_TRANSPARENT選項中的「man 7 ip」。 – thuovila

1

您需要使用原始套接字,並創建了IP和TCP報頭(在這裏您將能夠設置所需的IP地址(欺騙)。

raw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); 

您可以檢查在Linux手冊頁man 7 raw