0

リモート ユーザーの 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() return: 5

getnameinfo() は EAI_FAMILY である err=5 で失敗します /* ai_family はサポートされていません */ Family は AF_UNIX である 1 です。

はい、getnameinfo() は AF_INET と AF_INET6 に対してのみ機能します。

telnetリモートポートを取得するためのAPIまたはとにかくありますか。

ありがとう

4

1 に答える 1

1

ピアのアドレスはaccept()、サーバー側の呼び出しによって返されます。これは telnet デーモンによって行われるため、コードからアクセスすることはできません ( Stevens の Vol.1 p.118を参照)。

したがって、考えられるアプローチは、着信接続を受け入れ、ピアアドレス情報をログに記録し、実際の telnet デーモンへの接続をセットアップして、それに沿って接続を渡す、ある種のプロキシを作成することです。

于 2012-11-23T08:32:09.397 に答える