Открытие порта 80 с помощью Java-приложения в Ubuntu - PullRequest
6 голосов
/ 15 марта 2010

Что мне нужно сделать, так это запустить приложение Java, являющееся переписчиком на стороне сервера службы RESTful. И эта служба будет вызываться другим приложением, работающим на Google App Engine.

Из-за ограничения GAE каждый вызов http ограничен портами 80 и 443 (http и https) с классом HttpUrlConnection. В результате я должен развернуть приложение на стороне сервера на порту 80 или 443.

Однако, поскольку приложение работает в Ubuntu, и эти порты до 1024 не могут быть доступны для пользователя без полномочий root, исключение Access Denied будет выдано при запуске моего приложения.

Решения, которые пришли мне в голову, включают в себя:

  1. Изменение политики безопасности JRE, которая находится в файлах, находится в /lib/security/java.policy, чтобы grantjava.net.SocketPermission "* .80" "прослушивать, подключать, принимать, разрешать" разрешение。 Однако ни при использовании командной строки для включения этого файла, ни при переопределении содержимого в файле java.policy JRE, одно и то же исключение продолжает появляться.

  2. попробуйте войти в систему как пользователь root, однако, поскольку я не знаком с Unix, я не знаю, как это сделать.

  3. другое решение, которое я не пробовал, состоит в том, чтобы сопоставить все вызовы 80 с более высоким портом, таким как 1234, затем я могу без проблем развернуть свое приложение на 1234 и запрос вызова GAE отправить на порт 80. Но как подключить пропущенный пробел все еще проблема.

В настоящее время я использую «хакерский» метод, который заключается в упаковке приложения в файл jar, и sudo запускает файл jar с привилегией root. Это работает сейчас, но определенно не подходит для реальной среды развертывания.

Так что если у кого-нибудь есть идеи по поводу решения, большое спасибо!

Ответы [ 3 ]

6 голосов
/ 15 марта 2010

Вы можете использовать iptables для перенаправления, используя что-то вроде этого:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport http -j REDIRECT --to-ports 8080

Сделать изменения постоянными (сохраниться после перезагрузки) с помощью:

iptables-save
2 голосов
/ 15 марта 2010

Решение 1: Это ничего не изменит, это не ограничение Java, это ОС, которая не позволяет использовать привилегированные номера портов (порты ниже 1024).

Решение 2: Не очень хорошая идея IMO, есть веские причины не запускать процесс от имени пользователя root.

Решение 3: Использовать setcap или iptables.См. этот предыдущий вопрос .

1 голос
/ 15 марта 2010

Гораздо более простым решением является настройка обратного прокси-сервера в Apache httpd, который Ubuntu запустит для вас на порту 80 из /etc/init.d.

.

Есть также способы попасть сюда с iptables, но у меня нет недавнего личного опыта. У меня сейчас работает такой прокси.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...