Ignition Designer with SOCKS

Accessing a public facing Ignition Gateway through a SOCKS proxy

Created: July 21, 2019 Updated: October 31, 2021

We'll kick this post off by saying it's an addendum to this post describing one way to host an Ignition Gateway publicly. In that post we discuss how to limit access to the root gateway url to increase security for the gateway configuration page, the designer, and vision client access. This post assumes you've gone through that and you have an Ignition gateway running in an LXD container on a virtual private server.

In that post we discuss how to limit access to the root gateway url to increase security for the gateway configuration page, the designer, and vision client access. Here we will show you how to increase security even more by demonstrating how to completely deny gateway root url access in NGINX and use a SOCKS proxy to provide an encrypted, RSA keyed tunnel to access gateway development features. This is much more secure than just using IP address filtering in NGINX plus, anecdotally, I've been having reliability issues when trying to access the gateway through an NGINX HTTPS reverse proxy anyway.



We'll show you how to do this from an Ubuntu client machine, but you can also do this from Windows using Putty (ignoring all the LXD steps). This guide has some relevant instructions for configuring Putty. This Windows 7 proxy guide also has some information about where to configure Windows proxies. You could also run Ubuntu desktop in a virtual machine and follow along.

If you're doing Ignition development from a linux computer. The best way to get a secure connection over SSH with SOCKS that you don't have to initialize every time is to create a development environment in LXD. In this environment we'll set up a permanent SOCKS proxy and configure it so all http(s) connections use it.

If you want to know how to initialize an LXD environment you can view my previous post. Or there is also some great info on Digital Ocean.

LXD containers by default are headless, so we need to add a profile allowing lxd to launch GUI (graphical user interface) applications. To do that, create a text file with the following content called lxdguiprofile.txt:

config:
  environment.DISPLAY: :0
  raw.idmap: both 1000 1000
  user.user-data: |
    #cloud-config
    runcmd:
      - 'sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf'
      - 'echo export PULSE_SERVER=unix:/tmp/.pulse-native | tee --append /home/ubuntu/.profile'
    packages:
      - x11-apps
      - mesa-utils
      - pulseaudio
description: GUI LXD profile
devices:
  PASocket:
    path: /tmp/.pulse-native
    source: /run/user/1000/pulse/native
    type: disk
  X0:
    path: /tmp/.X11-unix/X0
    source: /tmp/.X11-unix/X0
    type: disk
  mygpu:
    type: gpu
name: gui
used_by:

Then create the gui profile and insert the configuration:

lxc profile create gui
 cat lxdguiprofile.txt | lxc profile edit gui

Now we'll be able to create our ignition-client container:

lxc launch --profile default --profile gui ubuntu:18.04 ignition-client #use any container name you prefer

Then start a shell for you container:

lxc exec ignition-client -- su --login ubuntu

You can test the ability to launch GUI applications from your new container by typing the command glxgears. If it's successful, you'll see some animated gears that look like this:

Now we'll create a permanent SOCKS connection that starts and stops with the container. To do this we create a systemd service file:

sudo vim /etc/systemd/system/socks-proxy.service

Edit the file to look like this:

[Unit]
Description=Socks proxy via SSH
ConditionPathExists=|/usr/bin
After=network.target

[Service]
User=ubuntu
ExecStart=/usr/bin/ssh -D 1080 -NTC -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no user@ignition.jarautomation.io #Use your username and domain

# Restart every >2 seconds to avoid StartLimitInterval failure
RestartSec=5
Restart=always

[Install]
WantedBy=multi-user.target

Then use the following to start the service:

sudo systemctl start socks-proxy.service

You can check the service with:

sudo systemctl status socks-proxy.service

If everything is working well you can enable the socks-proxy.service to start and stop swith the system:

sudo systemctl enable socks-proxy.service

If you ever need to make changes to the service file, you can make the changes and then reload systemd with:

sudo systemctl daemon-reload

Now lets install the chromium browser so we can test the SOCKS proxy, plus the Perspective module in the Ignition Designer will require all of the dependencies that are installed with the chromium browser.

sudo apt update
sudo apt install chromium-browser

We'll also have to update some environment variables to tell chrome to use our reverse proxy for all http(s) requests. To make these permanent we'll put the environment variable assignments in our /etc/environment file. Add the following to the bottom of it:

SOCKS_SERVER=localhost:1080
SOCKS_VERSION=5

Then exit your container and run the following to restart it.

lxc restart ignition-client

Then start the shell for the ignition client again:

lxc exec ignition-client -- su --login ubuntu

Now start chromium by typing chromium-browser. You'll need the lxd IP address of the remote Ignition server container, not to be confused with your local Ignition client container. You can get this by running lxc list on the server (I describe this more in this previous post. Type that ip address and make sure to include the port in the url (the default is 8088 for Ignition). You'll see something like the below image if your Gateway is successfully running and the proxy is working.

Congratulations! You successfully, securely accessed your gateway through an encrypted SSH tunnel!

While you're at the gateway home page, go ahead and download the designer. Chromium will put it in /home/ubuntu/Downloads. Unpack the directory:

tar xvzf Downloads/designerlauncher.tar.gz

Now we need to edit the designer launcher configuration file to make it use our socks proxy. The network properties configuration file will be located at /home/ubuntu/designerlauncher/runtime/conf/net.properties. Add the following line to the configuration file. I like to add it just below the commented section titled: HTTP Proxy Settings.

socksProxyHost=localhost

We don't need to specify the port if using 1080. If you use a different port then you need to add another line to specify socksProxyPort.

I also like to add an alias so I can just type designer to launch the designerlauncher. To do that we create a .bash_aliases file in our home directory, if one doesn't exist already, and the default .bashrc file will create the alias upon starting the container terminal shell. Add the following to .bash_aliases:

alias designer=/home/ubuntu/designerlauncher/app/designerlauncher.sh

Then tell your current terminal to use the new settings:

source .bashrc

Now type designer and the designer launcher window will open like shown below:

Click Add Designer, then Manually Add Gateway and enter the IP address and port number for the Ignition server container (again, not to be confused with your Ignition client contaner):

We need to tell the designer launcher to launch designer applications that use our new SOCKS proxy. To do this, click on the three vertical dots in the upper right hand corner of the card for the gateway you just added. Select Manage from the drop down menu.

Enter -DsocksProxyHost=localhost in the JVM Arguments entry like shown below. To reiterate, since we're using the default port 1080 we don't need to add a -DsocksProxyPort argument here, but if you want to use a different port you'll have to add it.



Save the changes and select Launch on the card for your Ignition gateway. Enter your login information and select the project you want to work with.



There you have it! Persistent, secure SOCKS tunnel access to the gateway web page and designer without exposing it to the public!