Accessing Ports Between Crostini and ChromeOS

I recently purchased an Acer Chromebook so I can develop while on the go. My larger, main laptop is bulky. When I’m sitting waiting for my son’s practice to end or need to take a laptop with me along with other gear the Chromebook makes a good companion.

My ultimate goal was to install Linux application support via Crostini, so I could have access to tools like VS Code, Node.JS, Angular and other technologies. While this was quite easy to pull off, my first roadblock was accessing ports between ChromeOS and Crostini.

The way Google pulls off Crostini is by running a Linux container with a light weight Linux install, and performing magic behind the scenes so you can click and launch Linux apps along side your Chrome and Android apps. While this is a neat trick, it poses a problem when you are trying to access a bound port in Crostini from an app or browser in ChromeOS.

An example would be running a Jupyter Notebook on the Linux host and accessing from Chrome on ChromeOS. Your first step is generating your Jupyter config file.  This is as easy as running

jupyter notebook --generate-config

This places a file called in your ~/.jupyter directory.  Open the config file and find the c.NotebookApp.ip line and enter the address as ‘’. The IP, also known as INADDR_ANY, forces the server or service to bind to any and all addresses available on the host.



Start up Juypter notebook and you should see something similar to the below. Notice URL line contains “(penguin or” as the hostname.

Now from your browser on ChromeOS, launch into the URL. The URL will take the form of <VM>.linux.test for the default container, or <VM>.<Container>.linux.test for a newly ramped up container. You can also access the server or service using the container IP.

And there you have it! This should work with any server or service you build and run.