У меня две системы 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