Как сделать простую переадресацию SSH x11

Пытаюсь реализовать форвардинг ssh x11 в Go, ссылаясь на источник Paramiko, но не получается.

Запрос x11-req кажется успешным, но не работает с OpenChannel. Нет ли лучшего способа?

https://tools.ietf.org/html/rfc4254#section-6.3. 2

Полный код здесь.

https://gist.github.com/blacknon/6e2e6e2c0ebcd64c381925f0e3e86e42

package main

(omit)

func main() {
    // Create sshClientConfig
    sshConfig := &ssh.ClientConfig{
        User: user,
        Auth: []ssh.AuthMethod{
            ssh.Password(pass),
        },
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    }

    // SSH connect.
    client, err := ssh.Dial("tcp", host+":"+port, sshConfig)

    // Create Session
    session, err := client.NewSession()
    defer session.Close()

    // NOTE:
    // x11-req Payload
    payload := x11request{
        SingleConnection: false,
        AuthProtocol:     string("MIT-MAGIC-COOKIE-1"),
        AuthCookie:       string("d92c30482cc3d2de61888961deb74c08"),
        ScreenNumber:     uint32(0),
    }

    // NOTE:
    // send x11-req Request
    ok, err := session.SendRequest("x11-req", true, ssh.Marshal(payload))
    if err == nil && !ok {
        fmt.Println(errors.New("ssh: x11-req failed"))
    }
    fmt.Printf("x11-req: %v\n", ok)
    fmt.Println("-----")

    // x11 OpenChannel (Not working...)
    x11Data := x11channel{
        Host: "localhost",
        Port: uint32(6000),
    }

    sshChan, req, x11err := client.OpenChannel("x11", ssh.Marshal(x11Data))
    fmt.Println(sshChan) // DEBUG
    fmt.Println(req)     // DEBUG
    fmt.Println(x11err)  // DEBUG

    (omit)
}

Я добавил журнал отладки стороны sshd.

sshd[1811]: debug1: server_input_channel_req: channel 0 request x11-req reply 1
sshd[1811]: debug1: session_by_channel: session 0 channel 0
sshd[1811]: debug1: session_input_channel_req: session 0 req x11-req
sshd[1811]: debug1: channel 1: new [X11 inet listener]
sshd[1811]: debug1: channel 2: new [X11 inet listener]
sshd[1811]: debug1: server_input_channel_open: ctype x11 rchan 1 win 2097152 max 32768
sshd[1811]: debug1: server_input_channel_open: failure x11

Спасибо, парни! Благодаря этому я смог безопасно реализовать его. Иметь рабочий код.

https://gist.github.com/blacknon/9eca2e2b5462f71474e1101179847d2a


person Naofumi Uesugi    schedule 09.07.2019    source источник
comment
... но не работает с OpenChannel. Это не очень информативно. Что именно тогда происходит? Регистрирует ли сервер какие-либо полезные сообщения об ошибках?   -  person Kenster    schedule 09.07.2019
comment
Извините. Я добавил журнал отладки стороны sshd.   -  person Naofumi Uesugi    schedule 09.07.2019


Ответы (1)


// x11 OpenChannel (Not working...)
x11Data := x11channel{
    Host: "localhost",
    Port: uint32(6000),
}

sshChan, req, x11err := client.OpenChannel("x11", ssh.Marshal(x11Data))

Фундаментальная проблема здесь заключается в том, что каналы пересылки X11 инициируются с сервера SSH на клиент SSH. Вы пытаетесь открыть канал X11 от клиента к серверу. Это не поддерживается вашим сервером, и это не обычный способ использования переадресации X.

Я не программист на ходу. Но после просмотра документации после отправки x11-req это выглядит так: вы должны вызвать client.HandleChannelOpen() для получения канала X11 запросов, поступающих с сервера.

Дополнительная информация: чтобы внести ясность, начнем с терминологии. Ваша программа является ssh-клиентом и подключается к ssh-серверу. В X сервер — это программа, которая управляет дисплеем, клавиатурой и мышью. X-клиенты — это такие программы, как xterm и xeyes, которые подключаются к серверу для отображения окон и выполнения аналогичных действий.

Если вы хотите перенаправить X11 через SSH, клиент ssh отправит запрос X11 на сервер ssh. Это сообщает серверу, что клиент хочет переадресацию X11 для соединения. Сервер выполнит некоторую настройку и откроет порт прослушивания TCP для приема соединений от X-клиентов.

Когда X-клиент подключается к прослушивающему порту X11 ssh-сервера, ssh-сервер открывает обратный канал для ssh-клиента. Клиент ssh будет подключаться к локальному X-серверу, а клиент ssh и сервер ssh будут передавать данные между X-сервером (локальным для хоста ssh-клиента) и X-клиентом (локальным для хоста ssh-сервера). Каждый канал обрабатывает один X-клиент.

Таким образом, такая программа, как ваша, должна отправить запрос на сервер, сигнализируя, что ваша программа хочет перенаправить X11 через соединение ssh. Фактические каналы x11 будут открываться по запросу от сервера ssh к клиенту ssh, когда X-клиент попытается использовать перенаправленный сервис X11.

person Kenster    schedule 09.07.2019
comment
Большое спасибо! Кажется, я неправильно понял это! Можно было реализовать на основе того, чему вы учили! - person Naofumi Uesugi; 10.07.2019