Linux telnet connection closed by foreign host

telnet doesn’t prompt «Connection closed by foreign host.» when connection is cut off

When I do the same thing to other unit from my computer, there’s no such problem.

Why is that? Is this a problem of telnet, my computer or the embedded unit? How can I fix it?

@MarkPlotnick Yes. Hardware is a little different though, the problem unit has no Bluetooth, the good unit has it. And some other minor hardware differences..

Ordinarily, when the telnet server exits or is killed, the TCP connection is closed cleanly and the client politely gets sent a FIN packet. But if the server shuts down without killing off individual processes, the TCP connections aren’t closed. (Same thing if the server crashes/panics). When the server comes back up, then when the client sends a packet to it (because you typed something), the server sends the client an RST packet because it doesn’t recognize this packet as a part of a valid TCP connection. The below answers give you some workarounds.

@MarkPlotnick that sounds reasonable but this same problem happens every time, not sure if race condition is the cause

2 Answers 2

Most likely, your client system (the one you’re running telnet from) does not have TCP keepalive enabled globally (and it arguably should not), and the embedded system isn’t closing the connection gracefully.

This is a common problem with network services that spawn separate processes for each user session, and then don’t terminate them when the main process gets shut down (on the other side of the coin though, you can restart the service for an upgrade without affecting connected users, which is why they do this in the first place).

Thanks for your answer, Austin! I checked TCP Keepalive parameters on my computer they are all set to standard values on ubuntu, which are 7200( tcp_keepalive_time ), 75( tcp_keepalive_intvl ), 9( tcp_keepalive_probes ) and I would like to keep it that way, just dont touch it since only this unit has this problem. So do you know how to make the embedded linux close the connection gracefully?

You can enable keepalive for just your telnet connection by applying some options on the socket. Rather than code this and recompile the program, you can simply use an existing library libkeepalive.

Download the source tar file, libkeepalive-0.3.tar.gz , and compile the library with the command make .

tar xvzf libkeepalive-0.3.tar.gz cd libkeepalive-0.3 make 

You will have a file libkeepalive.so . You can now run your telnet with the library pre-loaded. It will do the appropriate changes to the socket() function. You have 3 values you can set in the environment, as for the global keepalive. For example,

LD_PRELOAD=$PWD/libkeepalive.so \ KEEPCNT=2 KEEPIDLE=2 KEEPINTVL=4 telnet hostname 

Now, when the remote stops responding to the keepalive packets, the telnet command will exit with Connection closed by foreign host.

See the README file in the sources:

KEEPCNT net.ipv4.tcp_keepalive_probes KEEPIDLE net.ipv4.tcp_keepalive_time KEEPINTVL net.ipv4.tcp_keepalive_intvl 

After KEEPIDLE seconds a keepalive packet will be sent every KEEPINTVL seconds. After KEEPCNT packets with no reply, disconnect.

Читайте также:  Условный оператор if linux

Источник

Ошибка при загрузке страницы через telnet -Linux

Всем привет! Сразу говорю, как вы наверняка можете заметить, я далеко не мастер в этой теме. Проблема заключается в том, что когда я хочу запустить какой-то сайт в терминале с помощью telnet(я использую ubuntu), происходит что-то такое:

$ telnet en.wikipedia.org 80 Trying 91.198.174.192. Connected to dyna.wikimedia.org. Escape character is '^]'. GET Connection closed by foreign host. 

То есть соединение устанавливается, но как только я хочу что-то ввести, выходит надпись «Connection closed by foreign host» и всё заканчивается. При этом. когда я запускаю свой сервер, он прекрасно работает:

$ telnet 127.0.0.1 30000 Trying 127.0.0.1. Connected to 127.0.0.1. Escape character is '^]'. Internet Knock-knock Protocol Server Version 1.0 Knock-knock! >Who is there? Doctor. >Doctor Who? Ha-ha. Connection closed by foreign host. 
$ netstat -tapnl | grep 443 (Не все процессы были идентифицированы, информация о процессах без владельца не будет отображена, вам нужны права суперпользователя (root), чтобы увидеть всю информацию.) tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN - 

Я не изменял никаких настроек telnet и даже понятия не имею с чем это может быть связано. Пробовал с другими сайтами, пробовал менять порт, но ничего не помогало. С чем это может быть связано, и, самое главное, как решить эту проблему?

Как по мне лучше не запускать сетевую программу телнет и долбится в закрытый порт , а намного интересней создать клиент серверное приложение. Лично по мне ты просто запутался . Пока я вижу картину, именно так. Предлагаю для начала собрать сервер-клиент программу , а не лезь на питушинный сетевой ресурс википедия. Просто после создания клиент-серверного приложения своего, многое станет на своё место в голове.

2 ответа 2

То есть соединение устанавливается, но как только я хочу что-то ввести, выходит надпись «Connection closed by foreign host» и всё заканчивается.

у http-сервера, от которого вы пытаетесь получить информацию по протоколу http, очень маленькая пауза ожидания информации от клиента. программу telnet для подобных экспериментов лучше заменить на что-то более подходящее. например, netcat. этой программе информацию, которую она отправит серверу, можно передать на её стандартный ввод (stdin).

$ echo -ne 'GET / HTTP/1.0\r\nHost: en.wikipedia.org\r\n\r\n' | nc en.wikipedia.org 80 

на что получим вполне разумный ответ от http-сервера:

HTTP/1.1 301 TLS Redirect Date: Sat, 27 Jun 2020 19:43:24 GMT Server: Varnish X-Varnish: 531026174 X-Cache: cp3056 int X-Cache-Status: int-front Server-Timing: cache;desc="int-front" Set-Cookie: WMF-Last-Access=27-Jun-2020;Path=/;HttpOnly;secure;Expires=Wed, 29 Jul 2020 12:00:00 GMT Set-Cookie: WMF-Last-Access-Global=27-Jun-2020;Path=/;Domain=.wikipedia.org;HttpOnly;secure;Expires=Wed, 29 Jul 2020 12:00:00 GMT X-Client-IP: 188.134.16.218 Location: https://en.wikipedia.org/ Content-Length: 0 Connection: close 

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

nmap -p 80 en.wikipedia.org Starting Nmap 7.60 ( https://nmap.org ) at 2020-06-27 23:29 MSK Nmap scan report for en.wikipedia.org (91.198.174.192) Host is up (0.045s latency). Other addresses for en.wikipedia.org (not scanned): 2620:0:862:ed1a::1 rDNS record for 91.198.174.192: text-lb.esams.wikimedia.org « PORT STATE SERVICE 80/tcp open http Почему нмапс даёт такую ошибку ??

если у вас появился новый вопрос, задайте его, пожалуйста, с помощью кнопки «задать вопрос» в правом вернем углу страницы. если надо указать контекст, можете привести ссылку на данный вопрос

Читайте также:  Finding java version on linux

Ответ несовсем по вопросу ябы сказал по реализации моего совета.

Мой пример реализации клиента и сервера на СИ .

/* определяет типы данных */ #include /* "Главный" по сокетам */ #include /* sockaddr_in struct, sin_family, sin_port, in_addr_t, in_port_t, . */ #include #include #include #include #include /**@brief Получает от клиента последовательность байт, не длиннее 30 и печатает её на экран по * завершении соединения. Клиенту отправляет "Hi, dear!"*/ int main(int argc, char * argv) < /*создаём сокет*/ int s = socket(AF_INET, SOCK_STREAM, 0); if(s < 0) < perror("Error calling socket"); return 0; >/*определяем прослушиваемый порт и адрес*/ struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(18666); addr.sin_addr.s_addr = htonl(INADDR_ANY); if( bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0 ) < perror("Error calling bind"); return 0; >/*помечаем сокет, как пассивный - он будет слушать порт*/ if( listen(s, 5) ) < perror("Error calling listen"); return 0; >/*начинаем слушать, для соединения создаём другой сокет, в котором можем общаться.*/ int s1 = accept(s, NULL, NULL); if( s1 < 0 ) < perror("Error calling accept"); return 0; >/*читаем данные из сокета*/ char buffer[31]; int counter = 0; for(;;) < memset(buffer, 0, sizeof(char)*31); /*следует помнить, что данные поступают неравномерно*/ int rc = recv(s1, buffer, 30, 0); if( rc < 0 ) < /*чтение может быть прервано системным вызовом, это нормально*/ if( errno == EINTR ) continue; perror("Can't receive data."); return 0; >if( rc == 0 ) break; printf("%s\n", buffer); > char response[] = "Hi, dear!"; if( sendto( s1, response, sizeof(response), 0, (struct sockaddr *)&addr, sizeof(addr) )
include #include #include /* hton, ntoh и проч. */ #include #include #include int main(int argc, char * argv[]) < /*объявляем сокет*/ int s = socket( AF_INET, SOCK_STREAM, 0 ); if(s < 0) < perror( "Error calling socket" ); return 0; >/*соединяемся по определённому порту с хостом*/ struct sockaddr_in peer; peer.sin_family = AF_INET; peer.sin_port = htons( 18666 ); peer.sin_addr.s_addr = inet_addr( "172.16.8.169" ); // тут замени на свой адрес адрес можно узнать командой sudo ifconfig int result = connect( s, ( struct sockaddr * )&peer, sizeof( peer ) ); if( result ) < perror( "Error calling connect" ); return 0; >/*посылаем данные * * Если быть точным, данные не посланы, а записаны где-то в стеке, когда и как они будут * отправлены реализации стека TCP/IP виднее. Зато мы сразу получаем управление, не * дожидаясь у моря погоды.*/ char buf[] = "Hello, world!"; result = send( s, "Hello, world!", 13, 0); if( result /* закрываем соединения для посылки данных */ if( shutdown(s, 1) < 0) < perror("Error calling shutdown"); return 0; >/* читаем ответ сервера */ fd_set readmask; fd_set allreads; FD_ZERO( &allreads ); FD_SET( 0, &allreads ); FD_SET( s, &allreads ); for(;;) < readmask = allreads; if( select(s + 1, &readmask, NULL, NULL, NULL ) if( FD_ISSET( s, &readmask ) ) < char buffer[20]; memset(buffer, 0, 20*sizeof(char)); int result = recv( s, buffer, sizeof(buffer) - 1, 0 ); if( result < 0 ) < perror("Error calling recv"); return 0; >if( result == 0 ) < perror("Server disconnected"); return 0; >if(strncmp(buffer, "Hi, dear!", 9) == 0) printf("Got answer. Success.\n"); else perror("Wrong answer!"); > if( FD_ISSET( 0, &readmask ) ) < printf( "No server response" ); return 0; >> return 0; > 

Собираем сервер и запускаем его

dima@komp:~/mita/TCP_IP$ gcc client.c -o client dima@komp:~/mita/TCP_IP$ ./client 

В создаём отдельный терминал и там собираем клиент :

dima@komp:~/mita/TCP_IP$ gcc client.c -o client dima@komp:~/mita/TCP_IP$ ./client 
Hello, world! Response send 
Got answer. Success. Server disconnected: Success 

Источник

Читайте также:  Межсетевой экран linux фстэк

telnet.

telnet 46.158.5.204 4899 Trying 46.158.5.204. Connected to 46.158.5.204. Escape character is ‘^]’.

Connection closed by foreign host.

Такое всегда, со всеми айпи, со всеми портами. Бывает после надписи коннектед терминал просто встает и ни на что не реагирует.Пробывал также и к локальному пк, итог тот же. В чем вообще может быть проблема?

Порт 4899, по умолчанию, закреплен за богомерзким виндовым radmin, телнет висит на 23-им порту.

я это знаю. Просто пример привел. Любые порты включая 23 приводят к тому же итогу.

Значит .bash_profile кривой на твоем пользователе.

коннекться радмином, пароли обычно вполне тривиальные (123456789 и тд)

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

недавно установил, сижу с root пользователя. как это можно исправить или что делать?

.bash_profile нужно смотреть на сервере это он обрубает соединение,твоя машина не причём, и не работай под рутом, это плохо.

# This script file is executed by bash(1) for login shells. By default, # it does nothing, as ~/.bashrc is already sourced by /etc/profile. # # [JNZ] Modified 23-Sep-2004 # # Written by John Zaitseff and released into the public domain.

> В чем вообще может быть проблема?

в твоем непонимании отсутствия проблемы.

Сотри его нафиг и попробуй зайти.

тогда почему не заходит ни на один адресс?

Ещё версия: таймаут на соединение в конфиге сервера прописан очень маленький, ваш IP в hosts или dns (если поднят на сервере) не добавлен, есть большая задержка между инициализацией входа и запросом имени и пароля, когда вы набираете логин или пароль сервер сбрасывает соединение по таймауту.

а в чем проблема? вы чего-то ожидавете, но результат вас не устраивает?

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

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

> сижу с root пользователя
ССЗБ. Жду треда «Всё сломалось, ничего не работает :(»

о это что-то новенькое! script-kiddy на моём лоре! =)

Starting Nmap 5.59BETA1 ( http://nmap.org ) at 2011-11-08 23:39 GST Nmap scan report for 46.158.72.36 Host is up (0.23s latency). Not shown: 994 closed ports PORT STATE SERVICE 21/tcp open ftp 23/tcp open telnet 80/tcp open http 139/tcp open netbios-ssn 1720/tcp filtered H.323/Q.931 5431/tcp open park-agent Nmap done: 1 IP address (1 host up) scanned in 17.94 seconds

Trying 46.158.72.36. Connected to 46.158.72.36. Escape character is ‘^]’. Connection closed by foreign host.

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

Источник

Оцените статью
Adblock
detector