Skip to content

Instantly share code, notes, and snippets.

@mediocregopher
Last active June 8, 2016 17:39
Show Gist options
  • Save mediocregopher/9ba5a0fbfcfc60592fcc3cd4a25a857d to your computer and use it in GitHub Desktop.
Save mediocregopher/9ba5a0fbfcfc60592fcc3cd4a25a857d to your computer and use it in GitHub Desktop.
Example of a TLS echo server and client which also use the PROXY protocol
package main
import (
"crypto/tls"
"fmt"
"io"
"log"
"net"
"os"
)
func main() {
c, err := net.Dial("tcp", "127.0.0.1:9000")
if err != nil {
log.Fatal(err)
}
fmt.Fprint(c, "PROXY TCP4 8.8.8.8 127.0.0.1 45535 443\r\n")
tc := tls.Client(c, &tls.Config{
ServerName: "example.com",
InsecureSkipVerify: true,
})
go io.Copy(tc, os.Stdin)
io.Copy(os.Stdout, tc)
}
package main
import (
"crypto/tls"
"io"
"log"
"net"
"github.com/armon/go-proxyproto"
)
func main() {
log.Print("creating raw listen")
netln, err := net.Listen("tcp", ":9000")
if err != nil {
log.Fatal(err)
}
log.Print("wrapping listen in proxy proto")
netln = &proxyproto.Listener{Listener: netln}
log.Print("loading cert")
cert, err := tls.X509KeyPair([]byte(dummyCert), []byte(dummyKey))
if err != nil {
log.Fatal(err)
}
tlsconf := &tls.Config{
Certificates: []tls.Certificate{cert},
}
tlsconf.BuildNameToCertificate()
log.Print("wrapping listen in tls")
netln = tls.NewListener(netln, tlsconf)
log.Print("listening")
for {
c, err := netln.Accept()
if err != nil {
log.Fatal(err)
}
log.Printf("got conn from: %s", c.RemoteAddr().String())
go func() {
io.Copy(c, c)
}()
}
}
// dummyCert/Key are self-signed for example.com. They're more or less useless
// outside of testing
var dummyCert = `
-----BEGIN CERTIFICATE-----
MIID0TCCArmgAwIBAgIJAONFEUkqT73SMA0GCSqGSIb3DQEBCwUAMH8xCzAJBgNV
BAYTAlVTMQswCQYDVQQIDAJGTDEUMBIGA1UEBwwLR2FpbmVzdmlsbGUxEzARBgNV
BAoMCkxldmVuIExhYnMxFDASBgNVBAMMC2V4YW1wbGUuY29tMSIwIAYJKoZIhvcN
AQkBFhNicmlhbkBsZXZlbmxhYnMuY29tMB4XDTE1MTAxMzIwNDc1OFoXDTE1MTEx
MjIwNDc1OFowfzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkZMMRQwEgYDVQQHDAtH
YWluZXN2aWxsZTETMBEGA1UECgwKTGV2ZW4gTGFiczEUMBIGA1UEAwwLZXhhbXBs
ZS5jb20xIjAgBgkqhkiG9w0BCQEWE2JyaWFuQGxldmVubGFicy5jb20wggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCl/Rt1cYSpaJsx1ASXcOyKmU1YhVk3
Tz8QFKl57OgLSkykstMLz6+GLD667fakU+Z3m0n5cckQfcExhV3ly40ruVrDSfFw
y4mkvRaGBHVet4S+3VsQjQRFG/j8QXT7gnS5xh8ntdjd+fU5XLJDWKNkP+V8wDyQ
LtQWMg93KmEXJ3mq6efAeocraJScjWBWe0N0C4pBCFWj6AdtIeuT1rmjFXD14lag
eFsZEMgRodp9gAuWoTCNeLYlSGE3Xvy+jIHiALjMKygdyIwv2Hm69p0LP1p3o6Ag
pwJElZDEyvwLB6IyGaAWOpYGdJwtwOaHjj9Py7//hIZg2v/0kbsDC6ttAgMBAAGj
UDBOMB0GA1UdDgQWBBR9Q5dIdPSesnnzx/x49sDz2CdBfDAfBgNVHSMEGDAWgBR9
Q5dIdPSesnnzx/x49sDz2CdBfDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUA
A4IBAQB3KbsiGKsMsLqL4x8E8rVHKGj4S01GkNCg9IO9pHQK4WxyGAT4tcn5VKj7
YYsltiFlrsFwZTBriX+scntdlXAPgKW5JmV9mzuSbyRxL9aTLK9eQcIrwnEscPFz
dKjT57dvYGfgiuO2ScRgN6J4efrgmuTC8XoSovDGzvp9q2KhirITBDCxc4mbH6lv
sASSXabAYFYwMlMUtnL735pdgDkIjrl9sOb7LRUCsewaSRFOUlDvXRb++n/5f3LC
EL6G06gkl38TD0mchfJws7xlmhECkWRAIABDW4vE3Dolmgl5l/DEH3r3wmieE+lG
m7sKABXDdq4ML32CBswghUGSvt21
-----END CERTIFICATE-----`
var dummyKey = `
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCl/Rt1cYSpaJsx
1ASXcOyKmU1YhVk3Tz8QFKl57OgLSkykstMLz6+GLD667fakU+Z3m0n5cckQfcEx
hV3ly40ruVrDSfFwy4mkvRaGBHVet4S+3VsQjQRFG/j8QXT7gnS5xh8ntdjd+fU5
XLJDWKNkP+V8wDyQLtQWMg93KmEXJ3mq6efAeocraJScjWBWe0N0C4pBCFWj6Adt
IeuT1rmjFXD14lageFsZEMgRodp9gAuWoTCNeLYlSGE3Xvy+jIHiALjMKygdyIwv
2Hm69p0LP1p3o6AgpwJElZDEyvwLB6IyGaAWOpYGdJwtwOaHjj9Py7//hIZg2v/0
kbsDC6ttAgMBAAECggEBAJEtVx7ZMpaZD2P9dCagdcKjYqrRtr5RaW6/I5uoQSve
yDokzcG+3F4VxKfqCZagayqhf4nUo27xDlApvX6HEen0LBYyTiHBY5naaCC/NYiq
KkhlgohvThTD6nl3JsHzz/PL/OPWgN9lB74r/R46IG5GFImP+WiCDK19C1nGjzSX
wY+D32Dna3grASpMRzEHKy7h+KFwU6o7IZlOITc/z7to397bkRI1A0lB+y7GGyqA
0v3CJptNrk9M6YvephBbPl8tg26ozzah7aNnmsP176K2e+pNaY5WYwOJlD7zkOPW
RJfdzxP7QefdIqYI6H3sHJPIWmiINa0sbNKq9Nq2mgECgYEAz+12RSif38IAJEJg
i+ghWfpzk1/U0Z9yJ/0yH2s1iFd+50dMbNviTb132KdT9VRCYqcC1vpGcvri9WUp
5DXSJt2zk4q/fla6illo3p7b4gq3yE8yORIvB7E/5tMP7so5OrnNfsqTRAB8yW5i
1BKOwC3DWIbsEJXypknO0WohKfECgYEAzF1sR6QUMbiyraPTEkEyYG0jBlXRM6ak
Dbj37rh4kq3E73nMVEBA66xAINNOh5VgHTSNksnzOpF/EixHqpmDzXuDMTTKCJr+
1sKVM4PJm+or5VUG8qttbsInt44C3kWZBdSKIABTcAWdc+hwsZCGU92EkkVP+Tdo
bkBKCuhKfT0CgYAyptlB3bSckKjyLE1Sp7jAL5fKFfVFH39yqGZ2aup+jTn341GF
z0bgw0AXwiNcxyro12CEuDFDP0TcnMlIs6e/GhDt50Xg5AXLQB6g5LgR56R/onNM
ndZhHFfBxjbCZ/brDGo38edQEIJVm5NtsBugS0WkIjINlEmpIp/EOgNcMQKBgGcJ
CxirnwrahiuJl1dyy4VWQPxmtA0IjVnl0grnstKxDcN3cw9fPdwUgliKcONm6oiP
AHnrm9gBl0GAVbmroIovJZvfc6UXEDkS7cqFPVaAoBUF43Th/VCETyX6UXPjPx1z
ZRhxUZ//FL1libvck/0giEB+9a0+xEYh37LUHwo5AoGBAIKukJP3W1MV57niKzF6
VvG61PXboy/rpfZRnY+EU8wVi/r8eOqHAzSNEGTuSuZl84KKaL7KGU16HPuXXkZT
+zpNS1z4fBA34czW2m16C3mgWFxeWzuqPC5mOnw8Jg5DjcX4TOBt5NGnXejl0fmV
IGNFn+7hm2PmDzXt3gRWIfBf
-----END PRIVATE KEY-----`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment