Как разрешить или запретить удаленные подключения в Python SocketServer?

Я создаю чрезвычайно простое средство просмотра визуализации Vega: это один файловый модуль, обслуживающий базовую HTML-страницу, содержащую только графику Vega и HTML5 EventSource обновлений . Пользователь (я) работает в оболочке Python через ssh, создает объект, представляющий средство просмотра, которое печатает свой IP-адрес и порт, чтобы пользователь мог вставить их в свой (мой) веб-браузер. Этот HTTP-сервер не обслуживает файлы и не принимает данные от клиентов, поэтому я не вижу никаких проблем с безопасностью.

Часть, в которой я не уверен, заключается в том, как установить (host, port) так, чтобы мой веб-браузер мог найти HTTP-сервер, работающий на удаленном Python. Я экспериментировал весь день и не знаю, то ли я неправильно понимаю, что должно произойти, то ли серверы, которые я использую, изменили свои политики доступа.

Вот минимальный пример:

import SimpleHTTPServer
import SocketServer
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer((host, port), Handler)
print(httpd.server_address)
httpd.serve_forever()

Если я запускаю это локально и хочу гарантировать, что сторонние зрители не смогут получить к нему доступ, нужно ли установить host на "127.0.0.1", потому что это означает, что клиент должен будет получить к нему доступ как 127.0 .0.1, что может произойти только локально? В этом случае port может быть 0 для получения любого открытого порта.

Если я запускаю это удаленно, чтобы убедиться, что сторонние зрители могут получить к нему доступ, я должен установить host на "" или "0.0.0.0", потому что это означает, что клиент может получить к нему доступ как к любому адресу, который пробирается к сервер? В этом случае я, возможно, не смогу установить port в 0, потому что многие из этих портов могут быть заблокированы, или ОС в этом отношении умнее?

По сути, как должно работать управление доступом в SocketServer Python, предполагаемое?


person Jim Pivarski    schedule 14.03.2018    source источник


Ответы (1)


Это базовый TCP. Ничего общего с питоном.

Если вы слушаете на 127.0.0.1, только клиенты, работающие на том же хосте, могут подключаться.

Если вы слушаете на 0.0.0.0, любой может подключиться, если разрешены брандмауэры.

person user207421    schedule 14.03.2018
comment
Это то, что я хотел знать, хотя я не был уверен, что эта библиотека Python не использует значения иначе, чем необработанные вызовы сокетов в C. Как насчет портов? 0 выбирает из портов, доступных для внешнего мира, или просто любой порт? - person Jim Pivarski; 14.03.2018