2016-04-30 14 views
2

iptablesのTPROXYターゲットを使用して、一部のUDPパケットを未処理のソケット にリダイレクトする予定ですが、パケットはソケットで受信されません。 UDP ソケットで動作します。私が何かを紛失していたり​​、生のソケットがデータを受け取れない場合は レベルのTPROXYが動作しますか?リダイレクトされたパケットを消費するためiptablesでRawソケットにリダイレクトするTPROXY

 
iptables -A PREROUTING -t mangle -p udp --dport 8816 --dst 127.0.0.1 -j 
TPROXY --on-port 0 --on-ip 127.0.0.2 

コード:私はnetcatを用いて試験し

#include <stdlib.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <stdio.h> 

char _errstr[100]; 
#define CHECK(X) \ 
if (! (X)) {\ 
    sprintf(_errstr, "%d: check failed", __LINE__);\ 
    perror(_errstr);\ 
    exit(1);\ 
} 

int main() { 
    int r; 
    int fd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP); 
    CHECK(fd != 0); 
    int val = 1; 
    CHECK(setsockopt(fd, SOL_IP, IP_TRANSPARENT, &val, sizeof(val))== 0); 
    char buff[1500] = {0}; 

    struct sockaddr_in addr; 
    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = inet_addr("127.0.0.2"); 
    r = bind(fd, (struct sockaddr*)&addr, sizeof(addr)); 
    CHECK(r == 0); 

    r = read(fd, buff, 1500); 
    CHECK(r >= 0); 

    int c; 
    for (c=0; r>c; c++) 
     printf("%02X ", 0xFF & *(buff + c)); 

    return 0; 
} 

を(NC -u 127.0.0.1 8816)とiptablesを見ましたが 試合を支配したが何のパケットがrawソケットに送信されません。

答えて

1

問題はr = bind(fd, (struct sockaddr*)&addr, sizeof(addr));です。あなたは生のソケットにbindを渡すべきではありません。代わりに、をSO_BINDTODEVICEでインタフェースにバインドする必要があります。あなたのケースでは、アドレスは127.0.0.2です。このオプションを使用する方法の詳細については

http://linux.die.net/man/7/socket

+0

感謝をチェックしてください。バインドコールを 'setsockopt(fd、SOL_SOCKET、SO_BINDTODEVICE、devname、strlen(devname))'に置き換えました。まだパケットはrawソケットには到着しません。パケットを別のIP(127.0.0.1)にリダイレクトすることは、厳密に必要なものではないことに注意してください。私はちょうどパケットが私に知っているIPにリダイレクトされていることを確認したかったのです。私は127.0.0.2へのリダイレクトをスキップし、パケットを "127.0.0.1"でバインドすることはできませんが、リダイレクトIPtablesルールを削除すると動作します。 – Reith

+0

@ 0x2c52インターフェイス上で 'tcpdump'をランチすると、プロキシのパケットが表示されますか? – fluter

+0

いいえ、ここにパケットがありません – Reith

関連する問題