| package main | 
 |  | 
 | import ( | 
 | 	"context" | 
 | 	"fmt" | 
 | 	"net" | 
 |  | 
 | 	"source.monogon.dev/metropolis/pkg/socksproxy" | 
 | 	"source.monogon.dev/metropolis/pkg/supervisor" | 
 | ) | 
 |  | 
 | // ONCHANGE(//metropolis/test/launch/cluster:cluster.go): port must be kept in sync | 
 | const SOCKSPort uint16 = 1080 | 
 |  | 
 | // socksHandler implements a socksproxy.Handler which permits and logs | 
 | // connections to the nanoswitch network. | 
 | type socksHandler struct{} | 
 |  | 
 | func (s *socksHandler) Connect(ctx context.Context, req *socksproxy.ConnectRequest) *socksproxy.ConnectResponse { | 
 | 	logger := supervisor.Logger(ctx) | 
 | 	target := net.JoinHostPort(req.Address.String(), fmt.Sprintf("%d", req.Port)) | 
 |  | 
 | 	if len(req.Address) != 4 { | 
 | 		logger.Warningf("Connect %s: wrong address type", target) | 
 | 		return &socksproxy.ConnectResponse{ | 
 | 			Error: socksproxy.ReplyAddressTypeNotSupported, | 
 | 		} | 
 | 	} | 
 |  | 
 | 	addr := req.Address | 
 | 	switchCIDR := net.IPNet{ | 
 | 		IP:   switchIP.Mask(switchSubnetMask), | 
 | 		Mask: switchSubnetMask, | 
 | 	} | 
 | 	if !switchCIDR.Contains(addr) || switchCIDR.IP.Equal(addr) { | 
 | 		logger.Warningf("Connect %s: not in switch network", target) | 
 | 		return &socksproxy.ConnectResponse{ | 
 | 			Error: socksproxy.ReplyNetworkUnreachable, | 
 | 		} | 
 | 	} | 
 |  | 
 | 	con, err := net.Dial("tcp", target) | 
 | 	if err != nil { | 
 | 		logger.Warningf("Connect %s: dial failed: %v", target, err) | 
 | 		return &socksproxy.ConnectResponse{ | 
 | 			Error: socksproxy.ReplyHostUnreachable, | 
 | 		} | 
 | 	} | 
 | 	res, err := socksproxy.ConnectResponseFromConn(con) | 
 | 	if err != nil { | 
 | 		logger.Warningf("Connect %s: could not make SOCKS response: %v", target, err) | 
 | 		return &socksproxy.ConnectResponse{ | 
 | 			Error: socksproxy.ReplyGeneralFailure, | 
 | 		} | 
 | 	} | 
 | 	logger.Infof("Connect %s: established", target) | 
 | 	return res | 
 | } | 
 |  | 
 | // runSOCKSProxy starts a SOCKS proxy to the nanoswitchnetwork at SOCKSPort. | 
 | func runSOCKSProxy(ctx context.Context) error { | 
 | 	lis, err := net.Listen("tcp", fmt.Sprintf(":%d", SOCKSPort)) | 
 | 	if err != nil { | 
 | 		return fmt.Errorf("failed to listen on :%d : %v", SOCKSPort, err) | 
 | 	} | 
 |  | 
 | 	h := &socksHandler{} | 
 | 	supervisor.Signal(ctx, supervisor.SignalHealthy) | 
 | 	return socksproxy.Serve(ctx, h, lis) | 
 | } |