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ソケットに送信されません。
感謝をチェックしてください。バインドコールを '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
@ 0x2c52インターフェイス上で 'tcpdump'をランチすると、プロキシのパケットが表示されますか? – fluter
いいえ、ここにパケットがありません – Reith