@@ -203,6 +203,28 @@ func server() *cobra.Command {
203203 _ , _ = fmt .Fprintln (cmd .ErrOrStderr ())
204204 }
205205
206+ // Warn the user if the access URL appears to be a loopback address.
207+ isLocal , err := isLocalURL (cmd .Context (), accessURL )
208+ if isLocal || err != nil {
209+ var reason string
210+ if isLocal {
211+ reason = "appears to be a loopback address"
212+ } else {
213+ reason = "could not be resolved"
214+ }
215+ _ , _ = fmt .Fprintf (cmd .ErrOrStderr (), cliui .Styles .Wrap .Render (
216+ cliui .Styles .Warn .Render ("Warning:" )+ " The current access URL:" )+ "\n \n " )
217+ _ , _ = fmt .Fprintf (cmd .ErrOrStderr (), " " + cliui .Styles .Field .Render (accessURL )+ "\n \n " )
218+ _ , _ = fmt .Fprintf (cmd .ErrOrStderr (), cliui .Styles .Wrap .Render (
219+ reason + ". Provisioned workspaces are unlikely to be able to " +
220+ "connect to Coder. Please consider changing your " +
221+ "access URL using the --access-url option, or directly " +
222+ "specifying access URLs on templates." ,
223+ )+ "\n \n " )
224+ _ , _ = fmt .Fprintf (cmd .ErrOrStderr (), "For more information, see " +
225+ "https://github.com/coder/coder/issues/1528\n \n " )
226+ }
227+
206228 validator , err := idtoken .NewValidator (cmd .Context (), option .WithoutAuthentication ())
207229 if err != nil {
208230 return err
@@ -803,3 +825,24 @@ func serveHandler(ctx context.Context, logger slog.Logger, handler http.Handler,
803825
804826 return func () { _ = srv .Close () }
805827}
828+
829+ // isLocalURL returns true if the hostname of the provided URL appears to
830+ // resolve to a loopback address.
831+ func isLocalURL (ctx context.Context , urlString string ) (bool , error ) {
832+ parsedURL , err := url .Parse (urlString )
833+ if err != nil {
834+ return false , err
835+ }
836+ resolver := & net.Resolver {}
837+ ips , err := resolver .LookupIPAddr (ctx , parsedURL .Hostname ())
838+ if err != nil {
839+ return false , err
840+ }
841+
842+ for _ , ip := range ips {
843+ if ip .IP .IsLoopback () {
844+ return true , nil
845+ }
846+ }
847+ return false , nil
848+ }
0 commit comments