Сервер clojure swank открывает публичный порт?
(Этот вопрос был опущен, что я нахожу странным. Как я обиделся?)
Правильно ли я считаю, что запуск сервера-подзарядки обычно открывает миру порт 4005, не связанный только с локальными соединениями?
Таким образом, любой, кто взламывает кафе, не только позволяет прохожим выполнять произвольный код на своем компьютере, но и дает им приятный интерфейс для этого.
Похоже, что когда я запускаю сервер swank с помощью 'mvn clojure:swank', или 'lein swank', или (swank.swank/start-server "/tmp/yo")
тогда я получаю что-то вроде (спасибо Майк!)
$lsof -i -P
java 11693 john 13r IPv6 6701891 0t0 TCP *:34983 (LISTEN)
и действительно, я могу подключиться к emacs, работающему на другой машине в той же сети.
(swank.swank/start-server "/tmp/yo")
Если я запускаю сервер вручную, он выдает следующий вывод
Connection opened on local port 34983
#<ServerSocket ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=34983]>
В то время как:
(swank.swank/start-server "/tmp/yo" :host "localhost")
производит:
Connection opened on local port 40368
#<ServerSocket ServerSocket[addr=localhost/127.0.0.1,port=0,localport=40368]>
Который кажется больше, чем я ожидал.
Есть ли веская причина для этого?
Любые идеи о том, как можно убедить более традиционные способы его запуска принимать соединения только от локальных процессов?
3 ответа
Абсолютно правильный вопрос.
После открытия сервера слизи вы заметите:
eames:~:% lsof -i -P | grep 4005
java 41477 mjd 33u IPv6 0x0b8956d0 0t0 TCP [::127.0.0.1]:4005 (LISTEN)
Соединение прослушивает локальный адрес в порту 4005. Этот интерфейс не доступен для сети, поэтому другие устройства в сети не могут подключиться к вашему серверу слизи.
редактировать:
Это был мой результат запуска swank с использованием leiningen, который предоставляет "localhost" в качестве аргумента swank.swank/start-server
, Вы можете дважды проверить, что плагин leiningen открывает нелокальные порты.
Вы правы, что swank открывает соединение по каждому адресу, если хост явно не указан. Соответствующий код swank.util.net.sockets/make-server-socket
и это поведение задокументировано. Я согласен, это похоже на неправильный дефолт.
Он принимает только одно соединение, поэтому даже если он находится в мире, он перестает слушать, когда вы подключаетесь.
Если вы используете clojure-maven-plugin, недавно была выпущена версия 1.3.4, которая теперь запускает сервер swank против localhost для предотвращения этой проблемы.
Это поведение может быть настроено в вашем файле pom.xml с помощью:
<configuration>
<swankHost>someotherhostname</swankHost>
</configuration>
или из командной строки с помощью:
mvn clojure:swank -Dclojure.swank.host=someotherhostname