Как я могу внешне подключиться к службе, работающей на 127.0.0.1 (а не на 0.0.0.0)? - PullRequest
7 голосов
/ 31 октября 2011

Я пытаюсь подключиться к сервису, и для его отладки я запустил

netstat -nap | grep LISTEN

Результаты должны содержать строки двух типов:

tcp 0 0 127.0.0.1:8020 0.0.0.0:*     LISTEN      
tcp 0 0 0.0.0.0:57140  0.0.0.0:*     LISTEN      
tcp 0 0 0.0.0.0:11000  0.0.0.0:*     LISTEN      
tcp 0 0 0.0.0.0:8088   0.0.0.0:*     LISTEN 
unix 2 [ ACC ]  STREAM LISTENING     4512   -                   
unix 2 [ ACC ]  STREAM LISTENING     9760   -                   

У меня 3 вопроса:

1) Я хочу подключиться к процессу, работающему на 127.0.0.1 --- как я могу сделать это внешне? В другом месте я читал, что процессам 127.0.0.1 разрешено взаимодействовать только с другими процессами localhost.

2) В чем разница между записями netstat "tcp 0" и "unix 2"? Я немного наивен в сетевом взаимодействии, так что не стесняйтесь переосмыслить это :)

Ответы [ 4 ]

8 голосов
/ 31 октября 2011

Короче говоря, ваш процесс связан с интерфейсом обратной связи, который не может получать пакеты из внешней сети. Вам нужно будет перенастроить процесс, связанный с портом 8020, для связи с внешним интерфейсом, чтобы иметь возможность подключаться к нему с другого хоста.

Длинный ответ заключается в том, что два адреса вашего сайта (127.0.0.1 и 0.0.0.0) являются особыми в определенных отношениях, и полезно понимать, что вы видите.

Адреса в блоке адресов Интернет-протокола 127.0.0.0/8 (из которых 127.0.0.1 - один) зарезервированы для внутреннего использования на хосте. Подробности см. rfc5735 , но в этих адресах нет ничего особенного, кроме того, что все IP-хосты используют одинаковые правила и не настроены для маршрутизации этих адресов за пределы хоста или маршрутизатора.

На вашем компьютере вы обычно видите специальный «петлевой» сетевой интерфейс, которому назначено 127.0.0.1.

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0

Этот интерфейс является специальным и никогда не подключается к внешней сети. Он используется, когда программа хочет подключиться к службе на локальном компьютере, так как 127.0.0.1 почти всегда будет настроен как активный сетевой интерфейс. Пакеты будут поступать на этот интерфейс только в том случае, если они отправлены из локального процесса.

Другой адрес вашего сайта, 0.0.0.0, является специальным и обычно представляет все IP-адреса, сопоставленные с любым сетевым интерфейсом на вашем компьютере. Когда программа хочет прослушивать соединения, поступающие через любой сетевой интерфейс или IP-адрес, она привязывает порт TCP / UDP к 0.0.0.0 для прослушивания соединений.

Тем не менее, в вашем случае вы сообщаете о выводе netstat, содержащем 0.0.0.0 в строках, описывающих сокеты TCP в состоянии LISTEN. В этом случае netstat выводит список сокетов, прослушивающих соединения, и использует 0.0.0.0:* в качестве заполнителя для поля внешнего адреса своего вывода. В этом случае 0.0.0.0:* означает, что сокет ожидает подключения с любого хоста.

Что касается вашего вопроса о "tcp 0" против "unix 2", это первые два столбца вашего вывода netstat. Полезно взглянуть на заголовки столбцов вашей команды netstat:

# netstat -nap | head -2
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name 

То, что вы сообщаете как «tcp 0», просто означает, что сокет, использующий протокол TCP, имеет нулевые байты в полученной очереди, ожидая, пока программа, подключенная к этому сокету, будет использовать. Точно так же "unix 2" - это то, что называется сокетом unix с двумя байтами, ожидающими в своей очереди приема для того, чтобы подключенный процесс использовал.

Сокеты TCP являются частью стека TCP / IP, который может использоваться локально или в IP-сетях для взаимодействия процессов. Сокеты UNIX, с другой стороны, проще и используются только для того, что называется IPC или межпроцессным обменом данными, который происходит только между двумя процессами, работающими в локальной системе, и при этом не используется сеть (в любом случае, нет адресов и портов). Сокеты UNIX считаются более эффективными, чем сокеты TCP, но они, очевидно, более ограничены в функциональности. В UNIX-подобных системах сокеты UNIX реализованы в виде файла в файловой системе специального типа «сокет», который оба процесса используют для чтения и записи сокета в качестве канала связи.

5 голосов
/ 09 ноября 2011

1) Без привязки к 0.0.0.0 вы все равно можете получить доступ к сервису через туннель. Это похоже на использование прокси, как упоминал Дэвид Шварц. Для этого примера я сделаю несколько предположений:

  1. На сервере запущена служба, привязанная к 127.0.0.1:8020, мы назовем ее «myservice».
  2. На сервере запущен сервер OpenSSH 'sshd' на порте по умолчанию TCP 22, и пользователь может войти с именем пользователя 'myusername'.
  3. На клиенте запущена система с установленным клиентом OpenSSH.
  4. Сервер доступен через IP-адрес 10.20.30.40.

На клиенте SSH к серверу с помощью следующей команды:

ssh -L 12345:localhost:8020 myusername@10.20.30.40

После входа сверните окно SSH. В другом окне на клиенте запустите netstat, чтобы найти порты прослушивания. Вы должны увидеть 127.0.0.1:12345, как на сервере.

На клиенте подключитесь к сервису по 127.0.0.1:12345. Теперь вы должны быть подключены к экземпляру «myservice» на сервере, даже если вы установили соединение с локальным интерфейсом обратной связи клиента.

Хитрость в том, что SSH туннелирует прослушивающий сокет на клиенте к прослушивающему сокету на сервере. Я сделал номера портов разными для ясности.

2 голосов
/ 31 октября 2011

1) Вы не можете (если вы имеете в виду с другой машины - 127.0.0.1 является localhost и по определению вы можете подключиться к нему только с локальной машины

2) В первом столбце показан домен сокетов - tcp - это сокеты tcp, а unix - это сокеты домена unix.

А что касается ответа на ваш вопрос 3; -)

3) 42

2 голосов
/ 31 октября 2011

1) Вам необходимо либо изменить сервер для привязки к общедоступному адресу (или 0.0.0.0), либо запустить локальный прокси-сервер для обработки соединения.

2) TCP-соединения используют протокол TCPтот, который используется для ориентированного на соединение трафика в Интернете.Соединения UNIX используют строго локальный протокол, который намного проще, чем TCP (потому что он не должен иметь дело с отброшенными пакетами, потерянными маршрутами, поврежденными данными, пакетами не по порядку и т. Д.).

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