Автор Тема: Помогите настроить ретрансляцию трафика IPTABLES  (Прочитано 3033 раз)

Оффлайн Meatcoins

  • Участник
  • *
  • Сообщений: 320
Мне нужно, чтобы http-пакеты, приходящие на localhost:9999 (172.16.1.192) ретранслировались на 172.16.4.6:8888.
То есть чтобы любой другой host, видящий 172.16.1.192 и шлющий ему http-запросы не знал, что он на самом деле обращается к 172.16.4.6:8888.
То есть, чтобы 172.16.1.192 с порта 9999 перенаправлял трафик на 172.16.4.6:8888 и возвращал пакеты, которые получает, тому host'у который обращается по порту 9999.
Пытаюсь этого достичь следующим правилом:
iptables -t nat -I PREROUTING --dst 172.16.1.192 -p tcp --dport 9999 -j DNAT --to-destination 172.16.4.6:8888
Добавляю правило изменяем входящие пакеты на host 172.16.1.192, протокол tcp и порт назначения 9999. Далее DNAT - преобразуем адрес места назначения на host 172.16.4.6 и порт 8888.
По идее параметр --dst 172.16.1.192 можно выкинуть, так как у меня один сетевой интерфейс.
Ну, короче, проблема в том, что это не работает.
В браузере с 172.16.1.250 захожу на 172.16.1.192:9999 и получаю connection time out.
Что тут не так? Или что ещё надо сделать?

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 152
Не силён в этой области, но может так:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 9999 -j DNAT --to-destination 172.16.4.6:8888eth0 -- входящий.
« Последнее редактирование: 24.07.2013 10:13:21 от berkut_174 »
Сноси Винду, переходи на Линукс ! :)

Оффлайн Meatcoins

  • Участник
  • *
  • Сообщений: 320
Не. Что-то не работает.
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 9999 -j DNAT --to-destination 172.16.4.6:8888
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 7777 -j DNAT --to-destination 172.16.1.1:80
Я в wireshark смотрю. Запросы идут на 172.16.1.192, а он в свою очередь запросы к 172.16.1.1 не шлёт.

Оффлайн Andrey

  • Участник
  • *
  • Сообщений: 734
Если мне не изменяет память, то даже если один интерфейс, то форвардинг в ядре должен быть включен.
Цитировать
# sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1
а еще у вас перенаправление в другую сеть, при определенных условиях.

Оффлайн Meatcoins

  • Участник
  • *
  • Сообщений: 320
Тренируюсь в одной подсети:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 7777 -j DNAT --to-destination 172.16.1.1:80

Вот вывод от root:
# sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1

Не работает.

Оффлайн Meatcoins

  • Участник
  • *
  • Сообщений: 320
Э-э-э.... глупый вопрос.
Я забыл... а после изменения правил надо ли перестартовать сетевой интерфейс или какого-то демона?
Или изменения вступают в силу мгновенно?
« Последнее редактирование: 24.07.2013 15:20:14 от Meatcoins »

Оффлайн Meatcoins

  • Участник
  • *
  • Сообщений: 320
На примере 2-х команд:
iptables -A INPUT -p icmp -j DROP
iptables -D INPUT -p icmp -j DROP
я выяснил, что правила применяются мгновенно.

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 152
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 7777 -j DNAT --to-destination 172.16.1.1:80
Ну а если расписать для 1 клиента, например:
iptables -t nat -A PREROUTING -s 172.16.1.123 -d 172.16.1.192 -p tcp --dport 9999 -j DNAT --to-destination 172.16.1.1:8888Вообще должно работать...
Сноси Винду, переходи на Линукс ! :)

Оффлайн Meatcoins

  • Участник
  • *
  • Сообщений: 320
Я выполнил следующую последовательность команд:
iptables -A INPUT -s 172.16.1.0/24 -d 172.16.1.192 -j ACCEPT
iptables -A FORWARD -s 172.16.1.0/24 -d 172.16.1.192 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -d 172.16.1.192 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -d 172.16.1.0/24 -j ACCEPT

Получилось это:
# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  172.16.1.0/24        172.16.1.192       

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  172.16.1.0/24        172.16.1.192       

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  172.16.1.0/24        172.16.1.192       
ACCEPT     all  --  172.16.1.0/24        172.16.1.0/24

Далее выполняю это:
iptables -t nat -A PREROUTING -s 172.16.1.250 -d 172.16.1.192 -p tcp --dport 9999 -j DNAT --to-destination 172.16.1.1:80
Получаю это:
# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  172.16.1.250         172.16.1.192        tcp dpt:9999 to:172.16.1.1:80

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Я ещё картинку приложил.
Это протокол обмена пакетами.
Применил вот такой фильтр, чтоб не мешали другие сетевые пакеты:
(ip.dst_host==172.16.1.192&&ip.src_host==172.16.1.250)||(ip.dst_host==172.16.1.250&&ip.src_host==172.16.1.192)||(ip.dst_host==172.16.1.1&&ip.src_host==172.16.1.192)||(ip.dst_host==172.16.1.192&&ip.src_host==172.16.1.1)||(ip.dst_host==172.16.1.1&&ip.src_host==172.16.1.250)||(ip.dst_host==172.16.1.250&&ip.src_host==172.16.1.1)
Смотрю сессию взаимодействия только между 172.16.1.250, 172.16.1.1 и 172.16.1.192
Из него я вижу, что
Первый пакет - вначале 172.16.1.250 шлёт 172.16.1.192 пакет на установку соединения (SYN).
Второй пакет - 172.16.1.250 шлёт 172.16.1.1 пакет на установку соединения (SYN).
Третий пакет - 172.16.1.1 шлёт 172.16.1.250 пакет подтверждения установки соединения (SYN, ACK).
Четвёртый пакет - 172.16.1.250 шлёт 172.16.1.1 RST - пакет разрыва соединения.
Вывод:
Второй пакет на самом деле шлёт 172.16.1.192 от имени 172.16.1.250, а не сам 172.16.1.250, то есть 172.16.1.250 об этом пакете ничего не знает.
То есть 172.16.1.192 не подменяет адрес 172.16.1.250 на свой 172.16.1.192.
Далее 172.16.1.1 думает, что 172.16.1.250 пытается с ним установить соединение, а тот в свою очередь ничего не знает о 172.16.1.1 - он с ним не пытался установить никаких соединений.
Вот к какому выводу я пришёл.
Что не так с настройкой iptables?
Может надо MASQUERADE куда-то воткнуть?

Оффлайн Meatcoins

  • Участник
  • *
  • Сообщений: 320
Кажется, додумался!
Надо было ещё написать так:
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
То есть у исходящих маршрутизируемых пакетов подменять адрес на свой.
И заработало!

Оффлайн Andrey

  • Участник
  • *
  • Сообщений: 734
Кажется, додумался!
Надо было ещё написать так:
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
То есть у исходящих маршрутизируемых пакетов подменять адрес на свой.
И заработало!
конечно не очевидно, но я Вам на это намекал. Условия разные, разбираться в вашей инфраструктуре, это ....