Streaming your Kodi library over the Internet

Even if you’re leaving your media centre behind while you travel this Christmas, you don’t have to be without all your media. I’m going to show you that in just a few steps you can access all your TV and movies remotely on an Android device over a nice, secure SSH connection.

Published 2014-12-19. Read 22,703 times. Comments. Tagged: kodi ssh ubuntu

I recorded a short demo showing me play a video from Kodi over HDSPA. It’s boring to watch but it’s proof this is possible.

Before we get too carried away, you need a few things:

  • A fast internet connection is essential. There’s a fair amount of overhead in SSH so anything under 5Mbit upload is going to be unbearable. You need cable, VSDL or another good, low latency connection.

  • A stable remote connection. 3G won’t cut it. HDSPA+ works. Good wifi is best. Also check you’re not going to destroy your mobile data allowance.

  • An Ubuntu-based media centre. You can probably do this with any *nix but Ubuntu’s the best, right?

  • Android. This isn’t just my bigotry, iOS cuts the connection after a few minutes making it useless for long viewing.

If you have all that, let’s get started.

Install a SSH server on your Kodi machine

So you’ve got an media centre running Ubuntu. If you haven’t already, let’s install the SSH server:

sudo apt-get install ssh

Before we make this accessible on the internet, we need to make the SSH server secure. Use key-based auth, disable password auth, use a non-standard port, install fail2ban, etc. Do not skip this.

If SSH can be insecure, why are we using it at all? We could just forward ports through to Kodi… But I just wouldn’t want to risk exposing it directly to the internet. OpenSSH has millions of active deployments. It’s battle-tested in a way that Kodi could only dream. I trust it.

Expose SSH to the internet

Almost all of you will be behind a NAT router. These split a public IP into a subnetwork of private IPs. One side effect is computers on the outside can’t directly address internal computers. We need to tell the router where to send our connection when we try to log in with SSH.

The process is subtly different for every router but if you don’t know what you’re doing, there’s a guide for just about every router on portforward.com. We just want to forward a port for whatever port you assigned to your SSH server when hardening it above.

Now you can connect to your public IP from outside the network on your SSH port. However most consumer routers won’t do port forwarding from inside the internal network. You’ll need another connection to test it or you could use an online port tester to probe your SSH port.

Using dynamic DNS to keep track of our network

If you have a static IP, skip this but most home connections are assigned an IP address that frequently changes. This makes it hard to know where we’re going to SSH to once we’re outside the network. But we can use a “dynamic DNS” service to make sure there’s a domain name that always points to our external IP address.

No-IP has a free service and a Linux client. There are many other services out there.

By the end of this step you should have a domain name (eg myaccount.no-ip.info) and something running regularly on the media centre that keeps this DNS updated to our latest IP.

Install Android packages

We need a few things on our client phone:

ConnectBot is completely free while Yaste and MX Player both have free versions with unlockable features. You shouldn’t need to pay any money to test this out though I do recommend paying for Yaste because it’s that good.

Connect to SSH and set up our tunnels

We’ll start in ConnectBot. We need to start by generating a keypair. This is what will allow us to log into the SSH server. This guide has the full process but in short: generate a keypair, email yourself the public key and copy that into ~/.ssh/authorized_keys2 on the server.

Then we can create a new connection. On the ConnectBot home screen just punch user@myaccount.no-ip.info:12345 (obviously replacing each bit with your actual username, domain and port respectively). Assuming that all works, disconnect and long press the new connection on the home screen and select “Edit port forwards”. We want to add two ports:

  • HTTP, port 8080 mapped to localhost:8080
  • DLNA, port 9777 mapped to localhost:9777

Reconnect and leave it in the background. We’ll connect to this now with Yaste.

Create a Yaste host using our tunnels

Open Yaste and open the Host Manager. Create a new host. It probably won’t detect the tunnels so skip the wizard. When asked, use localhost as the IP and 8080 as the port. It will test the connection before it lets you add it.

Sync your library (long press the item on the sidebar), select the “Play locally” toggle and then you’ll be able to stream things over the internet! It may buffer a little if you’re on a slow connection but it should work. Alternatively, you can download files from the Kodi server using Yaste which might be a little more predictable on a spiky connection.

About Oli: I’m a Django and Python programmer, occasional designer, Ubuntu member, Ask Ubuntu moderator and technical blogger. I occasionally like to rant about subjects I should probably learn more about but I usually mean well.

Stay updated: Subscribe by RSS or Subscribe by Email.