При прослушивании порта (taskserver) локальный адрес должен быть `localhost` или` 0.0.0.0`?

367
bertalanp99

Я пытался заставить taskdсервер работать на моем компьютере (Arch Linux) в течение нескольких дней. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что в taskdдокументации по конфигурации ( https://taskwarrior.org/docs/taskserver/troublesho-sync.html ) сказано, что я должен использовать выходные данные hostname -fв качестве адреса (я не знаю, что 'CN' сокращений). Я также пытался с моим локальным IP-адресом, начиная с192.168 но это дало мне ошибку рукопожатия, которую вы можете найти в руководстве по устранению неполадок, которое я связал.

Я начал немного заниматься расследованиями, потому что не мог получить доступ к своему серверу задач с других машин. Я нашел это:

Когда я слушаю порт, который я использую, пусть это будет 54000, используя nc -l -p 54000, я вижу это как вывод ss -lntu | grep 54000:

tcp LISTEN 0 10 0.0.0.0:54000 0.0.0.0:* 

Принимая во внимание, что когда я запускаю taskd, который слушает на том же порте, ssдает мне:

tcp LISTEN 0 4 127.0.0.1:54000 0.0.0.0:* 

Теперь с другой машины я попытался проверить порт во время прослушивания nc -vv 192.168.x.y 54000(с IP-адресом сервера) и обнаружил, что при локальном адресе 0.0.0.0порт отображается как открытый. В противном случае он отображается как закрытый. Я думаю, что это потому, что 127.0.0.1по сути, localhostи я не могу видеть это из моей сети?

taskdтакже есть файл конфигурации с опцией сервера, где я ввел вывод hostname -f, что watermelon.localdomain, как я указывал в документации. Я полагаю, это то, что переводится localhost, верно?

Буду очень признателен за вашу помощь, заранее спасибо!


ОБНОВЛЕНИЕ 2018/04/21

Мне удалось решить проблему, установив serverпеременную в конфигурации 0.0.0.0:54000, таким образом, я получил taskdвозможность прослушивать любой адрес порта 54000. Теперь все работает прекрасно. taskdДумаю, документация была немного расплывчатой.

3
«CN» - это аббревиатура от «Common Name» (обычно полное доменное имя). Поэтому, если `hostname -f` возвращает * watermelon.localdomain *, в инструкциях говорится, например, использовать` CN = watermelon.localdomain`. Согласно веб-сайту taskd, `CN = localhost` является значением по умолчанию и, следовательно, недопустимо. Что касается `127.0.0.1` против` 0.0.0.0`, `127.0.0.1` является локальным адресом обратной связи и обычно указывает, что порт доступен только процессам на одном компьютере. Напротив, в данном случае «0.0.0.0» фактически означает «все адреса IPv4 на локальном компьютере» (включая любой IP-адрес, доступный по сети). Anaksunaman 6 лет назад 2
Что касается файлов конфигурации, я понимаю, что запись должна выглядеть примерно так: `taskd.server = watermelon.localdomain: 54000` (но я могу ошибаться). Anaksunaman 6 лет назад 1
@ Anaksunaman Я думаю, что вы правы ... Но почему тогда сервер прослушивает адрес обратной связи? Я не понимаю bertalanp99 6 лет назад 0
Я предполагаю, что `127.0.0.1`, вероятно, является первым (или единственным) IPv4-адресом, доступным для * watermelon.localdomain * (предполагается, что вы используете его в своей конфигурации). Веб-сайт `taskd` действительно указывает, что вы можете использовать, например, * your_network_ip: 54000 * (против, например, * watermelon.localdomain: 54000 *) - https://taskwarrior.org/docs/taskserver/protocol.html Anaksunaman 6 лет назад 1
@ Anaksunaman Мне удалось решить эту проблему - кажется, я был действительно тупым (см. Обновленный вопрос). Спасибо за вашу помощь! bertalanp99 6 лет назад 0
Пожалуйста. Я рад, что у вас все работает правильно. знак равно Anaksunaman 6 лет назад 0

1 ответ на вопрос

4
Andrew

Сокеты настроены на прослушивание по конкретному IP и порту. Обычно есть две основные конфигурации, которые вы бы использовали для Socket, и третья, которая не столь распространена, но удобна.

1) Разрешить связь только с машины, на которой запущена служба

Это настраивается, когда вы видите 127.0.0.1:54000. Только хост-машина может получить доступ к этой услуге. Вы можете использовать что-то вроде обратного прокси-сервера, чтобы разрешить доступ извне, но ничто в сети не сможет подключиться к нему.

2) На все машины в любой сети, доступные с сервера

Это настраивается, когда вы видите 0.0.0.0:54000. Это позволяет любому разговаривать с этой службой, пока пакеты могут добраться до нее.

3) Только к определенной сети, к которой подключен сервер

Это настраивается, когда вы видите 192.168.0.2:54000(или любой другой IP). Это означает, что ТОЛЬКО к этой подсети этой сети разрешен доступ.

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

Спасибо за ваш подробный ответ! Есть ли у вас идеи, как мне заставить `taskd` слушать` 0.0.0.0`? bertalanp99 6 лет назад 0
скорее всего, в конфиге для `taskd`. Найдите какую-нибудь запись, указывающую «порт связывания» или «адрес связывания». Возможно, он уже указан как `127.0.0.1: 54000`. Но лучше всего проверить документы на `taskd` Andrew 6 лет назад 0
Я нашел этот актуальный вопрос только сейчас: https://stackoverflow.com/questions/44902884/taskwarrior-port-not-opening-externally Ответчик упоминает, что «обеспечение / etc / hosts было установлено с внешними IP-адресами». Не могли бы вы объяснить, что это значит и является ли это хорошей идеей? Кажется, это сработало на ФП этого вопроса. bertalanp99 6 лет назад 0
`/ etc / hosts` не влияет на способность службы подключаться другими хостами. Это позволяет локальной машине правильно ссылаться на iteslf, но не должно быть никаких причин изменять его, если имя хоста все еще совпадает с настроенным системным именем хоста. Andrew 6 лет назад 1
С тех пор мне удалось решить проблему (см. Обновленный вопрос). Вы очень помогли, хотя, спасибо. bertalanp99 6 лет назад 0