#java #rmi #iptables
#java #rmi #iptables
Вопрос:
Я хочу получить доступ к RMI-сервису с удаленного сервера. Локально все работает нормально. Но с удаленной стороны я получаю следующее исключение:
java.net.ConnectException: время ожидания соединения истекло
Я использовал IP-таблицы, которые, по мнению сервера, отправляют запрос на 127.0.0.1, а не на общедоступный IP-адрес xx.yy.zz
iptables -t nat -ПРЕДВАРИТЕЛЬНАЯ МАРШРУТИЗАЦИЯ -p tcp -d xx.yy.zz —dport 1099 -j DNAT —to-destination 127.0.0.1:1099
Сервер запускается с «-Djava.rmi.server.hostname=127.0.0.1» в качестве аргумента JVM.
С уважением, Маркус
Ответ №1:
Для меня это выглядит как неправильное использование iptables. Выполните следующее:
- Убедитесь, что ваше приложение привязано к общедоступному адресу. Например, удалив «-Djava.rmi.server.hostname=127.0.0.1».
- Если вы все еще не можете связаться со своим приложением. Добавьте правило брандмауэра в iptables что-то вроде:
$iptables -A INPUT -p tcp --dport 1099 -j ACCEPT
Комментарии:
1. просто добавлена опция -s для ограничения исходного IP-адреса в вашем решении, и это работает!
Ответ №2:
Я подозреваю, что DNAT изменяет только назначение пакета, а не источник. Не было бы намного разумнее заставить сервер RMI принимать пакеты из доверенной локальной сети или VPN вместо того, чтобы пытаться переписать пакеты с помощью iptables?
Комментарии:
1. если я удалю свои iptable-правила, я получу следующее исключение. java.rmi.AccessException: Registry.Registry.rebind запрещен; origin / xx.yy.zz является нелокальным хостом