Как я могу перенаправить исходящий трафик на порт 80, используя iptables локально?

19

Я пытаюсь локально перенаправить порты на моей машине с Ubuntu, используя iptables. Похоже на прозрачное проксирование. Я хочу поймать что-нибудь, пытаясь оставить мою систему на порту 80 и перенаправить ее на удаленный хост и порт.

Могу ли я добиться этого с помощью функций NAT и предварительной маршрутизации iptables?

PJF
источник

Ответы:

30

Попробуйте это iptablesправило:

$ sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination IP:80

Выше сказано:

  • Добавьте следующее правило в таблицу NAT ( -t nat).
  • Это правило будет добавлено ( -A) к исходящему трафику ( OUTPUT).
  • Нас интересует только TCP-трафик ( -p tcp).
  • Нас интересует только трафик, чей порт назначения - 80 ( --dport 80).
  • Когда у нас будет совпадение, перейдите к DNAT ( -j DNAT).
  • Направьте этот трафик на IP-порт другого сервера 80 ( --to-destination IP:80).

Что такое ДНАТ?

DNAT
    This target is only valid in the nat table, in the PREROUTING and OUTPUT 
    chains, and user-defined chains which are only called from those chains.
    It specifies that the destination address of the packet should be modified 
    (and all future packets in  this  connection will also be mangled), and
     rules should cease being examined.

Ссылки

SLM
источник
спасибо за это, но это не похоже на работу. Однако с тех пор я обнаружил, что это работает.
pjf
sudo iptables -t nat -A ВЫХОД -p tcp --dport 80 -j DNAT - к месту назначения xx.xx.xx.xx: 3128
pjf
Это потому, что это локально, а не через шлюз? ваш SNAT будет работать через шлюз?
pjf
@pjf - я верю в это. Я обновил свой ответ.
Slm
@pjf - я нашел оба правила и обновлял свой ответ обоими. Я не был уверен, в какой ситуации ты находился.
SLM
6

Это можно сделать более конкретным, чтобы работать только с трафиком к конкретному хосту назначения. Например, когда postfix допустил ошибку и письма в очереди хотят быть отправлены на старый IP-адрес.

iptables -t nat -A OUTPUT -p tcp -d {ONLY_TO_THIS_DESTINATION} --dport 25 -j DNAT --to-destination {NEW_IP}:25
Widmo
источник
4

Это может позволить вам переводить порты на все IP-адреса. Основным отличием здесь является отсутствие IP-адреса в --to-destinationполе.

iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination :80
Фелипе Альварес
источник
Очень полезный совет; именно то, что мне было нужно. Есть ли способ увеличить номер порта? Допустим, у меня есть диапазон из 100 портов, и я хочу увеличить их все на определенную сумму.
Зденек
Не уверен, что вы имеете в виду. Не могли бы вы написать цикл для Bash?
Фелипе Альварес
Будет работать цикл, добавляющий 100 правил iptables, но он замедлит его. Я бы предпочел, чтобы можно было увеличить число последовательных портов в одном правиле.
Зденек
@ Zdenek Я не знаю, возможно ли это с iptables. Вы смотрели firewalld?
Фелипе Альварес