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

Как сформулировать правило переадресации IP с помощью iptables

У меня две системы A и B. A является TCP-клиентом и отправляет сообщение на TCP-сервер на B.

------------------                --------------------------

  System A                        System B
  192.168.0.5 wlan0               192.168.0.3 wlan0
  127.0.0.1   lo                  127.0.0.1 lo
  TCP Client    <------------>    TCP Server on 127.0.0.1
------------------                ----------------------------

Клиент TCP отправляет сообщение на 192.168.0.3.

Это должно быть перенаправлено на локальный интерфейс B, поскольку TCP-сервер работает на 127.0.0.1 на порту 8000 системы B.

Поэтому я написал следующие правила таблицы IP, однако мой сервер в B не получает никаких сообщений. О, кстати, эти две системы являются системами Ubuntu Linux.

Вот что я сделал в системе B:

#Enable IP Forwarding for NAT
echo "1" > /proc/sys/net/ipv4/ip_forward

#Flush all iptable chains and start afresh
sudo iptables -F

#Forward incoming packets on 192.168.0.3 at wlan0 interface to 127.0.0.1
sudo iptables -t nat -A PREROUTING -p tcp -i wlan0 -d 192.168.0.3 --dport 8000 -j DNAT --to 127.0.0.1:8000

#Explicitly allow incoming connections on port 8000 
sudo iptables -A INPUT -i wlan0 -p tcp --dport 8000 -m state --state NEW,ESTABLISHED -j ACCEPT

#Explicitly allow outgoing messages from port 8000
sudo iptables -A OUTPUT -o wlan0 -p tcp --sport 8000 -m state --state ESTABLISHED -j ACCEPT

Затем я запускаю сервер на B и отправляю сообщение от TCP-клиента на A. Я вижу пакеты на wirehark из 192.168.0.5 на wlan0, но они никогда не пересылаются :(

Пожалуйста помоги.

ОБНОВИТЬ:

После комментариев экспертов я создал более реалистичный сценарий NAT для применения правил переадресации, но у меня все еще есть проблемы: я объяснил это в своем новом посте: Iptables: пересылка пакетов не работает

Вот полный отказ от ответа.
как сказал в своем комментарии Йенс Брэдлер, проще всего здесь привязать службу к общедоступному IP-адресу на порту 8000, а не через NAT для соединения. Вы можете защитить доступ к одному серверу A с помощью следующих правил iptables;

 -A INPUT -s 192.168.0.5/32 -p tcp -m tcp --dport 8000 -j ACCEPT
 -A INPUT -p tcp -m tcp --dport 8000 -j REJECT

Вы никогда не сможете выступить -j DNAT --to 127.0.0.1.

127.0.0.1 - это супер-особый адрес; он будет принимать соединения только от 127.0.0.1.

@Tom HОтвет заключается в том, как вы должны настроить свой сервер.

Ответ Tom H без ответа лучше, но если он вам не нравится, вот прямой ответ:

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

Измените направление перенаправления, как сказал Йенс Брэдлер:

echo "1" > /proc/sys/net/ipv4/ip_forward

Докажи, что это правда

cat /proc/sys/net/ipv4/ip_forward

Вывод из кота:

1

Добавьте правило в ACCEPT, используя также таблицу FORWARD.

sudo iptables -A FORWARD -i wlan0 -p tcp --dport 8000 -j ACCEPT

Удалите "-m state" из входящего правила (необязательно ... я думаю, ненужно):

sudo iptables -A INPUT -i wlan0 -p tcp --dport 8000 -j ACCEPT

Вероятно, везде, где вы добавили «ESTABLISHED», у вас также должно быть «RELATED» (не уверен, но я думаю, что ответный пакет, который запускает соединение, связан, но не установлен).

sudo iptables -A OUTPUT -o wlan0 -p tcp --sport 8000 -m state --state RELATED,ESTABLISHED -j ACCEPT

Правило FORWARD для выполнения вышеуказанного accept, обратное другому FORWARD. sudo iptables -A FORWARD -o wlan0 -p tcp -s 127.0.0.1 --sport 8000 -m state --state RELATED, ESTABLISHED -j ACCEPT

Вместо использования wirehark используйте -j LOG.

Сначала проверьте, нет ли еще правил LOG (правила по умолчанию лучше, чем следующие ... но вы использовали flush; мои будут сильно спамить ваш сервер):

sudo iptables --list --line-numbers -v
sudo iptables -t nat --list --line-numbers -v

Если нет, то добавьте их:

sudo iptables -A INPUT -j LOG
sudo iptables -A OUTPUT -j LOG
sudo iptables -A FORWARD -j LOG
sudo iptables -t nat -A PREROUTING -j LOG

Смотреть журналы

tail -F /var/log/firewall

# or if that file doesn't exist:
tail -F /var/log/messages