【问题标题】:How to get telnet session's remote port number?如何获取 telnet 会话的远程端口号?
【发布时间】:2012-11-11 12:09:43
【问题描述】:

我正在尝试获取远程用户的 telnet 连接使用的 TCP 端口号。

在 ssh 连接的情况下,我可以从 SSH_CLIENT 环境变量中获取它,但是在 telnet 连接的情况下如何获取它。是否有任何 C/Unix API 来获取它。

我尝试了以下代码:

u_int32_t 
port_session_connected (void)
{
    struct sockaddr_storage from;
    char *ssh_client;
    char *remote_port;
    char *temp;
    static char remoteport[1024];
    int socklen;
    int rv = 0, err; 

    if ((ssh_client = getenv("SSH_CLIENT")) != NULL) {
        syslog("(%s): Have SSH_CLIENT: %s", __func__, ssh_client);
        if ((temp = strtok(ssh_client, " \t")) != NULL) {
            remote_port = strtok(NULL, " \t");
            syslog("(%s): Remote port: %s", __func__, remote_port);
            if (remote_port) rv = atoi(remote_port);
            return rv;
        }
    } /* For ssh sessions */

    socklen = sizeof(from);
    if (getpeername(STDIN_FILENO, (struct sockaddr *)&from, &socklen) == 0) { 
        struct sockaddr_in *sck;
        sck = (struct sockaddr_in *)&from;
        syslog("(%s): getpeername() success", __func__);
        syslog("(%s): Remote IP: %s\n", __func__, inet_ntoa(sck->sin_addr));
        syslog("(%s): Remote Port: %d\n", __func__,  (int)ntohs(sck->sin_port));
        syslog("(%s): Family: %d\n", __func__,  (int)(sck->sin_family));

        err = getnameinfo((struct sockaddr *)&from, socklen, NULL, 0, 
                          remoteport, sizeof(remoteport),NI_NUMERICSERV);
        syslog("(%s): getnameinfo() return: %d", __func__, err);
        if (err == 0) { 
            syslog(LOG_NOTICE, "(%s): getnameinfo() success", __func__);
            syslog(LOG_NOTICE, "(%s): Remote port: %s", __func__, remoteport);
            rv = atoi(remoteport);
            return rv;
        }
    } /* For telnet session*/

    return 0;
}

该功能适用​​于 ssh 连接。 但是对于 telnet 连接,我无法获取会话中使用的远程端口号。

登录Telnet案例:

(port_session_connected): getpeername() 成功 (port_session_connected): 远程 IP: 0.0.0.0 (port_session_connected): 远程端口:0(port_session_connected):家庭:1 (port_session_connected): getnameinfo() 返回: 5

getnameinfo() 失败,错误为 err=5,这是 EAI_FAMILY /* ai_family not 支持 */ Family 为 1,即 AF_UNIX。

是的,getnameinfo() 仅适用于 AF_INET 和 AF_INET6。

是否有任何 API 或无论如何获取 telnet 远程端口。

谢谢

【问题讨论】:

  • 如果你在 linux 中使用 nmap 命令可能会对你有所帮助
  • 貌似是个工具,难道没有freebsd/unix API来获取需要的端口吗?
  • 出于好奇:为什么重要?
  • 这有助于在建立多个会话的情况下关闭特定用户的连接。 (除了端口号,还保存了其他字段,如用户名、远程 IP 等)。
  • 您必须在对getpeername 的调用中使用连接的套接字,而不是描述符中的标准。此外,所有 telnet 或 SSH 连接 AF_INET of AF_INET6 连接。

标签: c unix freebsd unix-socket


【解决方案1】:

对等体的地址由服务器端的accept() 调用返回。由于这是由 telnet 守护进程完成的,因此无法从您的代码中访问它(请参阅Stevens, Vol.1 p.118)。

因此,一种可能的方法是编写某种代理,它接受传入的连接,记录对等地址信息,然后建立与真正的 telnet 守护程序的连接并将连接传递给它。

【讨论】:

  • 或者更确切地说是inetd,它启动了一个telnet-进程。
猜你喜欢
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 2014-11-16
相关资源
最近更新 更多