Назад | Перейти на главную страницу

Iptables - перенаправить исходящий трафик на порт на входящий трафик на 127.0.0.1

Есть ли способ перенаправить трафик, настроенный для выхода с сервера на другой IP-адрес, обратно на сервер на локальном хосте (предпочтительно, как если бы он исходил из исходного пункта назначения)?

В принципе, я хотел бы иметь возможность настроить свое собственное программное обеспечение, которое прослушивает, скажем, порт 80 и принимает трафик, который был отправлен, скажем, 1.2.3.4.

Итак, в качестве примера с некоторым кодом. Вот будет сервер:

my $server = IO::Socket::INET->new(

    LocalAddr => '127.0.0.1',
    LocalPort => '80',
    Listen => 128,

);

И это будет получать трафик от следующего клиента:

my $client = IO::Socket::INET->new(

    PeerAddr => 'google.com',
    PeerPort => '80',

)

Таким образом, вместо того, чтобы клиент подключался к google.com, он будет подключаться к серверу, который я прослушиваю на localhost для того же сервера.

Я намерен использовать это для обнаружения вредоносных программ, подключающихся к удаленным хостам.

Мне не нужно перенаправлять трафик на 127.0.0.1, но его нужно перенаправить на IP-адрес, который может прослушивать тот же компьютер.

Изменить: я пробовал следующее, и это не работает -

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:80
iptables -t nat -A POSTROUTING -j MASQUERADE

Вы хотите использовать цель iptables REDIRECT.

iptables -t nat -A OUTPUT -p tcp -d 1.2.3.4 --dport 80 -j REDIRECT

На странице руководства iptables указана единственная опция REDIRECT, которая позволяет вам изменить порт.

Этот вариант --to-ports.

Насколько я понимаю, вы можете использовать функцию TPROXY iptables и сокеты IP_TRANSPARENT для достижения полностью прозрачного перенаправления (без использования NAT). Таким образом, ваше приложение создаст специальный сокет, который будет принимать трафик, даже если IP-адрес назначения был другим ящиком, а затем использовать правила iptables для перенаправления трафика с порта назначения 80 на порт 80 первого локального интерфейса, не изменяя его на все.

iptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp -d 1.2.3.4 --dport 80 -j TPROXY --on-port 80

Это используется в Squid Proxy для работы в полностью прозрачном режиме без преобразования NAT, таким образом не изменяя ни одного байта пакета. Помните, что для этого нужно использовать специальную розетку, иначе ничего не получится!

На всякий случай извлеките из документации ядра, как открыть сокет tproxy:

fd = socket(AF_INET, SOCK_STREAM, 0);
/* - 8< -*/
int value = 1;
setsockopt(fd, SOL_IP, IP_TRANSPARENT, &value, sizeof(value));
/* - 8< -*/
name.sin_family = AF_INET;
name.sin_port = htons(0xCAFE);
name.sin_addr.s_addr = htonl(0xDEADBEEF);
bind(fd, &name, sizeof(name));