มอบการเชื่อมต่อที่ SOCKS เปิดให้กับ SSH client ของ Go
Dial ปลายทาง SSH ด้วย x/net/proxy แล้วเริ่มต้น x/crypto/ssh บน net.Conn ที่ได้
ไดอาเลอร์ SOCKS จัดหาการรับส่ง ส่วนแพ็กเกจ SSH ทำการจับมือ SSH บนการรับส่งนั้น การเรียก ssh.Dial ภายหลังจะสร้างการเชื่อมต่อแยกต่างหากแทนที่จะใช้การรับส่งนั้น
ฟังก์ชันช่วยในแอปพลิเคชันที่ใช้ x/net/proxy และ x/crypto/ssh อยู่แล้วสามารถคืนค่า SSH client ที่กำหนดค่าไว้ได้:
func dialSSHViaSOCKS(proxyAddr, sshAddr string,
config *ssh.ClientConfig) (*ssh.Client, error) {
dialer, err := proxy.SOCKS5("tcp", proxyAddr, nil, proxy.Direct)
if err != nil {
return nil, err
}
conn, err := dialer.Dial("tcp", sshAddr)
if err != nil {
return nil, err
}
transport, channels, requests, err :=
ssh.NewClientConn(conn, sshAddr, config)
if err != nil {
conn.Close()
return nil, err
}
return ssh.NewClient(transport, channels, requests), nil
}ชื่อแพ็กเกจตรงนี้คือ golang.org/x/net/proxy และ golang.org/x/crypto/ssh proxyAddr ระบุตัวรับฟัง SOCKS ส่วน sshAddr ระบุเซิร์ฟเวอร์ปลายทางในรูปแบบ host:port
ระบุผู้ใช้ SSH ตามปกติของแอปพลิเคชัน วิธีการยืนยันตัวตน และ HostKeyCallback ใน config แพ็กเกจ knownhosts สร้าง callback นั้นจากไฟล์ known_hosts ที่เชื่อถือได้ ส่งชื่อโฮสต์ปลายทางไปยัง NewClientConn เพื่อให้การจับคู่คีย์โฮสต์ใช้ตัวตน SSH ที่ตั้งใจไว้
อาร์กิวเมนต์ nil ไม่เลือกข้อมูลรับรอง SOCKS ใด ๆ สำหรับปลายทาง SSH สาธารณะที่อนุญาต รายการที่ไม่มีบัญชีจากรายการพร็อกซี SOCKS5สามารถให้ proxyAddr ได้หากอนุญาตโฮสต์และพอร์ต SSH จริง เมื่อจำเป็น ให้ส่ง proxy.Auth ที่มีบัญชีพร็อกซี การยืนยันตัวตน SSH ยังอยู่ใน config
NewClient รับสตรีมช่องทางและคำขอขาเข้าที่ NewClientConn คืนมา และจัดการกลไกไคลเอนต์นั้น ปิด SSH client ที่คืนมาเมื่องานเสร็จ การจัดการการเชื่อมต่อในระบบจริงยังต้องมีการ dial แบบจำกัดเวลาและนโยบายการจับมือ ฟังก์ชันช่วยนี้เพียงแสดงการส่งต่อการรับส่งเท่านั้น