Доступ к порту RMI удаленно с помощью iptables

#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. Выполните следующее:

  1. Убедитесь, что ваше приложение привязано к общедоступному адресу. Например, удалив «-Djava.rmi.server.hostname=127.0.0.1».
  2. Если вы все еще не можете связаться со своим приложением. Добавьте правило брандмауэра в 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 является нелокальным хостом