У меня два вопроса.
Вопрос 1: У моей машины debian есть интерфейс eth3 с ip 192.168.57.28. Если кто-то пытается подключиться к 192.168.57.28:1234, как мне перенаправить запрос на другой компьютер: 192.168.57.25:80?
Вопрос 2: Если моя машина debian имеет два интерфейса: eth3 с 192.168.57.28 и ppp0 с некоторым динамическим IP, и кто-то пытается подключиться через ppp0 на порт 1234, как мне перенаправить запрос на 192.168.57.25:80?
Я пробовал это:
$ iptables -t nat -A PREROUTING -p tcp --dport 1234 -j DNAT --to-destination 192.168.57.25:80
$ echo 1 > /proc/sys/net/ipv4/ip_forward
но это не работает.
iptables -A PREROUTING -t nat -i eth3 -p tcp --dport 1234 -j DNAT --to-destination 192.168.57.25:80
iptables -A FORWARD -p tcp -d 192.168.57.25 --dport 80 -j ACCEPT
iptables -A POSTROUTING -t nat -s 192.168.57.25 -o eth3 -j MASQUERADE
Первый указывает, что все входящие TCP-соединения на порт 1234 должны быть отправлены на порт 80 внутренней машины 192.168.57.25. Само по себе это правило не завершает работу, потому что iptables запрещает все входящие соединения. Затем мы принимаем входящее соединение с портом 1234 от eth3, который подключается к Интернету с публичным IP по второму правилу. Мы добавляем второе правило в цепочку FORWARD, чтобы разрешить пересылку пакетов на порт 80 из 192.168.57.25.
РЕДАКТИРОВАТЬ: Добавлен POSTROUTING.
Чтобы отслеживать соединение. в противном случае внешний хост увидит внутренний IP-адрес 192.168.57.25, о котором он понятия не имеет.
РЕДАКТИРОВАТЬ2: Только что получил подсказку, что это должно быть --to-destination вместо --to (простите)
Спасибо Daywalker и Dánjal Salberg Adlersson. После нескольких часов ругани переадресация портов с помощью iptables наконец заработала. (проверено на Debian)
bash-скрипт
#!/bin/bash
IPTBL=/sbin/iptables
IF_IN=eth0
PORT_IN=40022
IP_OUT=172.16.93.128
PORT_OUT=22
echo "1" > /proc/sys/net/ipv4/ip_forward
$IPTBL -A PREROUTING -t nat -i $IF_IN -p tcp --dport $PORT_IN -j DNAT --to-destination ${IP_OUT}:${PORT_OUT}
$IPTBL -A FORWARD -p tcp -d $IP_OUT --dport $PORT_OUT -j ACCEPT
$IPTBL -A POSTROUTING -t nat -j MASQUERADE