LINUX.ORG.RU
ФорумAdmin

Iptables в роли прокси-сервера

 ,


0

1

Приветствую участников форума) Была поставлена задача создать прокси сервер по такому принципу ПК1(он же клиент, ОС Linux) На 127.0.0.1:6666 стоит bind исходящего трафика (TCP), а далее перенаправляет его на 192.168.1.110, модифицируя перед этим (шифрует и тд) Проблема возникла в написании правила для iptables - использовал следующее правило

sudo iptables -t nat -A OUTPUT -p tcp -s 192.168.1.110 !  --destination 192.168.1.103 -j REDIRECT --to-ports 6666
Версия iptables: 1.8.2 Трафик летит на забинденный порт, но ПАКЕТ МОДИФИЦИРУЕТСЯ - теряется адрес назначения и порт назначения, после чего сервер не знает, куда его переслать. Научите, пожалуйста, как решить данную задачу без модификации пакета - читал про TPROXY, но правила написать не смог. Благодарю за внимание:)


читал про TPROXY, но правила написать не смог

Даже мана не осилили?

   TPROXY
       This  target is only valid in the mangle table, in the PREROUTING chain
       and user-defined chains which are only called from this chain. It redi‐
       rects  the  packet to a local socket without changing the packet header
       in any way. It can also change the mark value which can then be used in
       advanced routing rules.  It takes three options:

       --on-port port
              This  specifies  a  destination  port  to  use. It is a required
              option, 0 means the new destination port  is  the  same  as  the
              original.  This  is only valid if the rule also specifies -p tcp
              or -p udp.

       --on-ip address
              This specifies a destination address  to  use.  By  default  the
              address  is  the  IP  address of the incoming interface. This is
              only valid if the rule also specifies -p tcp or -p udp.

       --tproxy-mark value[/mask]
              Marks packets with the given value/mask. The  fwmark  value  set
              here  can be used by advanced routing. (Required for transparent
              proxying to work: otherwise these packets  will  get  forwarded,
              which is probably not what you want.)

anc ★★★★★ ()

Нет особой разницы через что редиректить ( REDIRECT, DNAT, TPROXY )

Все равно это NAT и адрес назначения меняется, а getsockname() говорит локальный адрес.

Но если программа знает про магическое заклинание getsockopt(SO_ORIGINAL_DST), то она может узнать настоящий адрес назначения.

vel ★★★★★ ()
Ответ на: комментарий от vel

Пока что не заветное заклинание не поддается, пишу на python 2.7.15 Нашел такой код:

dst = conn.getsockopt(socket.SOL_IP, socket.SO_ORIGINAL_DST, 16)
Заместо socket.SO_ORIGINAL_DST ставил значение 80, результата не дало... Что-то не так protocol not avaliable... У вас случайно нет кода?

trix0 ()
Ответ на: комментарий от trix0

PS, решил попробовать переставить бинд с порта 6666 на 80 - протокол стал узнаваемым, это радует, данный код дал мне реальный порт назначения, благодарю, вы гений)

разумеется #define SO_ORIGINAL_DST отсутствует в библиотеках, но вот код можно ввести вручную, что я и сделал. Остался вопрос, где найти документацию по этим кодам и какой код для ip_dst, благодарю за наводку)

trix0 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.