Проброс портов через бастион с использованием Golang / Go - PullRequest
0 голосов
/ 07 мая 2020

Я хочу подключиться к MySQL экземпляру БД, размещенному на AWS, с помощью программы Go на локальном хосте с использованием туннелирования. Мы подключаемся к AWS через экземпляр Bastion. Это правила в файле .ssh / config:

User user1
Host bastion
HostName {ipaddress}
User user1
ForwardAgent yes
.... 
Host *.amazonaws.com
ProxyCommand ssh -qax bastion nc %h %p

Я использую команду ниже для перенаправления портов, и я могу подключиться к экземпляру mysql на 127.0.0.1:3307, используя локальный mysql клиент или даже с помощью программ в Go.

ssh -f user1@aws-instance1.amazonaws.com -L 3307:127.0.0.1:3306 -N

Однако возможно ли достичь полной функциональности использования сервера перехода и последующего подключения к удаленному экземпляру базы данных в Go? Я нашел этот ответ: { ссылка } Однако я не могу понять, как перенаправить на экземпляр mysql на узле aws, который прослушивает 127.0.0.1:3306. Я считаю, что могу подключиться к экземпляру aws, поскольку все подключения и клиентские объекты были успешно созданы в программе ниже, но я не знаю, как перенаправить на сервер mysql.

func main() {

    config := &ssh.ClientConfig{
        User: "user1", // replace this
        Auth: []ssh.AuthMethod{
            ssh.KeyboardInteractive(func(user, instruction string, questions []string, echos []bool) ([]string, error) {
                // Just send the password back for all questions
                answers := make([]string, len(questions))
                for n, q := range questions {
                    a, err := getAnswer(q)
                    if err != nil {
                        log.Fatal(err)
                    }
                    answers[n] = a
                }
                return answers, nil
            }),
        },
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    }

    bastionHost := "bastion-ip:22"
    awsDBNode := "aws-instance1.amazonaws.com:22"

    bClient, err := ssh.Dial("tcp", bastionHost, config)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("client: %v", bClient)
    defer bClient.Close()
    // Dial a connection to the service host, from the bastion
    conn, err := bClient.Dial("tcp", awsDBNode)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("conn: %v", conn)
    defer conn.Close()

}
func getAnswer(quest string) (string, error) {
    fmt.Printf("please enter %s: ", quest)
    reader := bufio.NewReader(os.Stdin)
    name, err := reader.ReadString('\n')
    if err != nil {
        return name, err
    }
    return clean.ReplaceAllString(name, ""), nil
}

var clean = regexp.MustCompile("[\r\n,]")
...