Я пытаюсь использовать 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}