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

iptables перенаправляет локальные подключения на удаленную систему / порт

Я пытаюсь использовать SSH для перенаправления локального порта 3389 компьютеров Windows на сервер redhat на каком-то произвольном порту (в непривилегированной области), который я защищал за брандмауэром, а затем перенаправить непривилегированный порт на сервере redhat на удаленный рабочий стол пользователей. По сути, создайте узкоспециализированный VPN, который выполняет только одну задачу: подключать пользователей к их системам за брандмауэром, используя зашифрованный туннель, который я контролирую.

Я знаю, что много лет назад это было возможно с помощью команды:

iptables -A OUTPUT -t nat --dport ${LOCAL UNPRIV PORT} \
           -j DNAT ${ANOTHER SYSTEM}:${REMOTE PORT}

но из того, что я прочитал, похоже, что эта способность была удалена, и я получаю сообщение в / var / log / messages

      kernel: NAT: no longer support implicit source local NAT 

Я нашел ресурсы, которые предполагают, что в ядре 2.6.X - 2.6.10 есть способ включить это в ядре с помощью IP_NF_NAT_LOCAL, но, по-видимому, в более поздних ядрах он был удален. Я пробовал перенаправить весь локальный трафик, чтобы он вошел в цепочку PREROUTING, и имел ограниченный успех, и это просто кажется плохой идеей, потому что тогда мне нужно открыть непривилегированный порт на сервере, чтобы я мог передать его обратно в Интерфейс eth0. Я уверен, что если бы у меня было больше времени, я смогу найти какой-нибудь причудливый кладж или обходной путь, но я бы не стал так сильно взламывать свои сценарии брандмауэра. Похоже, что должен быть более простой способ сделать это, я не вижу. Любая помощь или руководство, которое может предоставить сообщество, были бы очень полезны! заранее спасибо

Я не совсем уверен, понял ли я, но думаю, что вы попали не в ту цепь. :-) Я тоже запутался, когда впервые использовал iptables. Но путь к вперед в местный порт $ {LOCAL UNPRIV PORT} - это утверждение ниже:

$IPT -t nat -A PREROUTING -i eth0 -p tcp --dport ${LOCAL UNPRIV PORT} 
     -j DNAT --to ${ANOTHER SYSTEM}:${REMOTE PORT}

Это смесь семантической проблемы и способа работы netfilter: в старые времена пересылка локального порта включала соединение с устройством, которое пересылает, а также второе соединение с пунктом назначения. Iptables делает это за один шаг. Таким образом, вместо двух соединений - вы перенаправляете трафик на этот порт непосредственно к месту назначения. Netfilter выполняет все проверки работоспособности и ведет учет: только пакеты, принадлежащие допустимому соединению, обрабатываются NAT и, следовательно, могут быть перенаправлены.

Включение DNAT не позволяет пересылать пакеты. Вы также должны добавить правило:

$IPT -N INET-PRIV
$IPT -A FORWARD -i eth0 -o eth1 -j INET-PRIV
$IPT -A FORWARD -j DROP

$IPT -A INET-PRIV -p tcp -d ${ANOTHER SYSTEM} --dport ${REMOTE PORT} -j ACCEPT

$IPT -A INET-PRIV -j DROP

И, конечно, вы должны включить пересылку.

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

Pro iptables: более безопасный, более гибкий, меньше памяти и ЦП, используемых на одно соединение

Contra iptables: перенаправление соединения с внутренней машины на внутреннюю (передать его обратно в eth0) не имеет смысла с iptables (конечно, вы всегда можете подключиться напрямую), перенаправление генерируемого локально трафика не работает (порт может помочь демон пересылки, но обычно это не имеет смысла)

Именно в этом может быть проблема: вы пытаетесь использовать NAT на не-маршрутизаторе, поэтому вам следует использовать демон переадресации или полностью пропустить эту дополнительную переадресацию портов и сделать:

ssh -L 1234:${ANOTHER SYSTEM}:${REMOTE PORT} special-vpn-box

На special-vpn-box вы можете разрешить только входящие подключения от маршрутизатора и исходящие подключения к $ {ANOTHER SYSTEM}: $ {REMOTE PORT} с помощью iptables. Таким образом, пользователи special-vpn-box смогут получить доступ только к $ {ANOTHER SYSTEM}: $ {REMOTE PORT} и не смогут делать что-либо еще, если им не доверяют.

Вот что я делаю специально для перенаправления localhost:

iptables -t nat -A OUTPUT -m addrtype --src-type LOCAL --dst-type LOCAL -p tcp --dport 3306 -j DNAT --to-destination ip.ip.ip.ip
iptables -t nat -A POSTROUTING -m addrtype --src-type LOCAL --dst-type UNICAST -j MASQUERADE

sysctl -w net.ipv4.conf.all.route_localnet=1

Убедитесь, что вы заменили ip.ip.ip.ip для вашего реального общедоступного IP-адреса, а также --dport 3306 для порта, который вы хотите перенаправить.

Наконец, запустите команду sysctl, а также обновите свой /etc/sysctl.conf

Вы можете обновить sysctl.ctl чтобы разрешить маршрутизацию localhost с помощью следующей команды:

echo "net.ipv4.conf.all.route_localnet=1" >> /etc/sysctl.conf

Теперь все это кажется простым и хорошим, но потребовалось некоторое исследование и поиск. Будьте осторожны и поймите, что для пересылки localhost / 127.0.0.1 требуется этот метод, а другие типичные примеры не работают. Некоторые примеры решений, которые не работают с localhost:

iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to ip.ip.ip.ip:3306
iptables -t nat -A POSTROUTING -d ip.ip.ip.ip -j MASQUERADE

http://realtechtalk.com/iptables_how_to_forward_localhost_port_to_remote_public_IP-1788-articles

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

iptables -t nat -A PREROUTING  -p tcp \
--dport ${LOCAL UNPRIV PORT} -j DNAT --to-destination ${ANOTHER SYSTEM}:${REMOTE PORT}

iptables -t nat -A POSTROUTING -p tcp \
--dst ${ANOTHER SYSTEM} --dport ${REMOTE PORT} -j SNAT --to-source ${LOCAL SYSTEM}