Access a Web Service on a Ubuntu Server from Windows with Port forwarding.
Using a standard port (needs root), but still use the users ssh configuration (needs the user, not root).
Server Setup
Docker container is binded to 127.0.0.1:4200->4200/tcp
nginx as a reverse proxy: redirect traffic from :80 -> to :4200
/etc/hosts contains: 127.0.0.1 my-domain.local to access webservice using this domain
we need to access all request using this domain, because the web app, uses the same domain for the rest API
Extension to access the same from another host
C:\Windows\System32\drivers\etc\hosts: add 127.0.0.1 my-domain.local
to have the same domain name locally available
Because we would like to use a non-root port for ssh -> so that we can use the users .ssh/config (and keys) we add a simple local redirect using socat (which runs as root)
setup a simple redirect as systemd service
sudo apt install socat
cat /etc/systemd/system/domain-local-80.service
[ Unit]
Description = Expose domain.local:80 inside WSL
After = network.target
[ Service]
ExecStart = /usr/bin/socat TCP-LISTEN:80,bind= 127.0.0.1,fork,reuseaddr TCP:127.0.0.1:4200
Restart = always
AmbientCapabilities = CAP_NET_BIND_SERVICE
[ Install]
WantedBy = multi-user.target
manage service
sudo systemctl daemon-reload
sudo systemctl enable --now domain-local-80.service
# verify
sudo systemctl status domain-local-80.service
SSH Tunnel: finally we can redirect socats output to the remote server
# params
# -N: No remote command -> no shell start up, no command injection TTY
# -f: **f**ork -> Background
# ServerAliveInterval=60: Prevents timeout (resend every 60s)
ssh -L 4200:my-domain.local:80 -N -f -o ServerAliveInterval = 60 ssh-config-entry
# to exit the background process
## simple classic way
ps aux | grep "ssh"
kill x
## simple easy way
pgrep -f "ssh -L"
pkill -f "ssh -L"
## or other ways
ss -ltnp | grep ":4200"
sudo lsof -iTCP :4200 -sTCP :LISTEN
Whole setup overview
eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1cXNly2khcdTAwMTR9z1dQnteg6X3xw1R535PYOCb2ZMqlgDAyWMJIeJvKv89tbKslJDFgSMxcdTAwMDNQ5ULdWno599xzu6/874dKZSV+7Hkrq5VcdTAwMTXvoeF2/WbfvV/5aMrvvH7kh1x1MDAwMVSR4XFcdTAwMTRcdTAwMGX6jeGZ7TjuRat//mmvcFx1MDAxYeHN81Ve17vxgjiC8/6G40rl3+FfqPGb5lq3vlx1MDAxMbZcdTAwMDbnlPe2xPHaQ/P82zq5XHUwMDFlXjo86bUxfa9cdTAwMTG7wVXXs1VcdTAwMGZQrrlIjlx1MDAxZuG4ijlKXG7u/WbchkKmZFLW9vyrdlxmhVSTpPD5xqtcdTAwMTV7aVx1MDAxNPfDjrdcdTAwMTF2w755+lx1MDAxZtgzX/vsXHUwMDFmbqNz1Vx1MDAwZlx1MDAwN0EzOSfuu0HUc/vQWXtey+92a/Hj8O4wYDA4KyPPqL80koyUl11cdTAwMDVcdTAwMGa9alx1MDAwN15kXHUwMDA2XHUwMDE0J6Vhz234sVx1MDAxOVx1MDAwMYxsL0xcdTAwMGJ7e83h2P9j29R3b7w9M/jBoNtNiv2g6T1cZmdcdTAwMDRlnlx1MDAxNjRfnvY6cXZW6EvJT9t2zzM3lkgxyjilSYVcdTAwMDWP1qOFn8JgiCOspaBcXGmhbKOiTVx1MDAwMFA8vGnL7UaenVx1MDAwMdOyrVx1MDAxNLhsXHUwMDA3XHUwMDA3vab7fFx0loJoyoXAWNu2dP2gM9r7btjo2Kd8SPVqXHUwMDA0r/vVXd3aXHUwMDBma7W2bPPOp8+HZ4Mrnsdr7D3EI1CVo1BlJFx1MDAwN1UuXHUwMDFjhLmWXFxzgpliLFx1MDAwZlxcxpe4LcYtLsZt5uxcdTAwMTeAKikl4oJcdTAwMTfhU5bhU1OlkFx1MDAxNOjd4WnRZlBcdTAwMDZdr/tBau7CIK75T0NcdTAwMDNcdTAwMTWZ0m33xu+aweaZO6x1/SvT85Wu10phXHUwMDAwelx1MDAxZvtA6El1XHUwMDFj9mxtXHUwMDAz7uf6gdfPz0jY96/8wO2eXHUwMDE2tc5cdTAwMWTE4YlcdTAwMTc9ty/uXHUwMDBmvHS/vd1XlGOH8DFWePTYY1/D2mVN19Su/+XTw3pUPZ7IXG617fuzXHUwMDE15v1cdTAwMDWh1Fx1MDAxMYJKXCJcdTAwMTRcdTAwMTKCIWExbq3QXra0woxcdTAwMTWSya1cdTAwMTBcdTAwMTPNsVA0Z3GmTpHR0sRPXHUwMDAwN1LwXHUwMDE02J6xKIbYXHUwMDBlozha/Vx1MDAxZZhCTKSD4IvNwc1jtVx1MDAxOd6AwThwXHUwMDA3t1torXghrHX6LszHpFx1MDAwZntB5/BcXIVnnVx1MDAxZNw6v3O32pvNy8mFoLZwNmPG7DQmMpDYgUzsXHUwMDE4p7zy0pAzhkxnloFYaFx1MDAwMeKb81wiXHUwMDAzJyk/OmrgTCNFsE7JnylcZjxpn21pXHUwMDAyMv+geVx1MDAxMLmb33bE3vlBfPE1+rJ3d5P0M1x1MDAwMzS331x1MDAwZu9XkpqfXHUwMDFmx913m7j3XHUwMDAztlW/3lONVn9wd3pLou5k93359ZvkKz76dnLZa7b93U+6drt3eHzXvlWTOE5cdTAwMDBUVr9cdTAwMTZcdTAwMDRaVIN6XHUwMDA1XHUwMDBmq5hcdTAwMTZIU1lgb2SpXkvMjU3jN1x1MDAxMeGqOLxS5VbFXHUwMDExoVxiS754brNeOyz0iFx1MDAwNGVK30u/pls3XHUwMDFmZ9dsXHUwMDFk67B+17mM7+snV18vfpw1j3uTmSGxpGiGXCKlZ1x1MDAxM/2qpcO1lpowhZhQRXaYXHUwMDA27NJcdTAwMTAzhsinMERMIVAnVFx1MDAxNllcIsF4tDQxRYK5XHUwMDAwcUXeXHUwMDE0Sv5cIkc01sHdd4KLp+rWxcblQT368rmqP/tcdTAwMTdcdTAwMTfv5uByXHUwMDA0XHUwMDEygVwijSurXG5VqtW/KquMIPQ9MN8oaleq21x1MDAxNVOwXG5cdTAwMDI28vowXHUwMDE1z1x1MDAwMlx1MDAxNs5eYNKZuUfzIarHo6fdi+2t29tcdTAwMWGqqa+bp4+H7KKZJ6pcdTAwMTJVrrBcdTAwMDW4XHUwMDE5QoryokFcbjvzlp74kp5K6EnMLstcdTAwMTlcdTAwMDKBRpkuYi1G0WjpK2tRisGdMDlv/cA1oqk1gJn0rfvIvPr+XHUwMDE1bsVcdTAwMWXa3mqu1dZqT1x1MDAwNdtcdHnHqih1tCbIaCuqQV6NXHUwMDAwlzt5R6uUQyTWXFxSLVx1MDAxOSje5WrtXHUwMDE0OJbT6F1cImB8Sc6fmpmR5etEXGamhlOp3lx1MDAxNEaOXHUwMDAzrCCK4ylcdTAwMDCb81eHfjB4WOAl25H2zWnRlu/SXHUwMDFk3jjmtXb1/Mtm7TjqNfzJbNPO8dBcdTAwMWGFZYsk9lTUUVgrwlxiLlS8y8izzFx1MDAxMtVcdTAwMTSWaJiacIB/kSmyUtdcdTAwMDEuh0pcdTAwMDHhyNxcdTAwMDXvXtXdOursxqdVfnZ78Fx1MDAxOPNcdTAwMTa6ri664OWMXHQxk+BcdTAwMWTqPbNUO1SIf1VcdTAwMDIw31x1MDAwN/PDVlx1MDAxOIW4wFx1MDAwMnfqXHUwMDFlzIeEbtYv72+qrn96Xr9aI1tPP261jydcdTAwMTa0mDC7fT2kolRcdTAwMDJCQkWkQNGmnNCSfjL0o2dcdTAwMTa0XGYsXG5zrnKZXHUwMDA1w7ryXHUwMDA1MU1cdTAwMTiWdO7rYVx1MDAxY+L61NbyTHr2on65vdY5uvRCcnZcXO3sd4VXp5P4TExJdkeEqjxSzU6npiB7XHUwMDA1ZmVcbnZcdTAwMTmJlVx1MDAwMXdtcr9JIHBcdTAwMDLfWVxm0XRUnFuzXHUwMDE1mlPNUme8v9+c0L+xKSwg5982TXW/svHqT75cdTAwMDfJXuTQLVReXHUwMDE3RVx1MDAxNtjDvaFcdTAwMGbz8XHj53ZkXkf8XHUwMDFitFBhKkGqXHUwMDEx4EeUXWymXG47imsphVx1MDAwNExcbm5rk5BcdTAwMTg7WFx0wrGWXG5J+JMnXHUwMDE0ylx1MDAxZCSwVFx1MDAxMiMshFx1MDAxNtY6l/yS4Zf1SVx1MDAxZCMpc4ySXCLGlCxcXJ6WojTRXHRzhlx1MDAxNFx1MDAwMZFvPca8PCNcdTAwMDRcdTAwMGZv4oVe6I+Smv1VsYhcdTAwMTlcdTAwMWUkv//5WHh2KUjNJ1x1MDAwN097t1x1MDAxY/F13SjeXGJvbvxcdTAwMTi6+cU0Mcf/sduP12FO/eAqO3cvibF7XHUwMDEzhMZDXHUwMDFha1xmTPeryFFacYyJgplcdTAwMTVI2NxWXHUwMDAzNLdnXHUwMDA2XHUwMDFiO1x1MDAxYbw6oVxuUSxcdTAwMDFcdTAwMDFcIodcdTAwMGYvaP5/o8Zrj2yjOINWXHUwMDAx51x1MDAwYqaZXHUwMDE2Slx1MDAxNTfKflx1MDAwMJN50JqxWjOk1PbcnF1Ak9N1o+zldX+E91x1MDAxM0mq+Egq/ONhcOI/xuqgXHUwMDE1+Of7tc7kXHUwMDExXHUwMDAwxtZunjPIUovcibBSXHUwMDA1IYBcXCqpXHUwMDEyptuYQ6pcdNdaMFxcuCdOcHlcZoBMoi3Db1sjXHUwMDFjJ7DitTX/4HxcdTAwMTA2j5921JbfqW2Tq6O57pjNKcQ4eDq9fqyenp2pbeSd+NfknK/riUJcZkzxiCkgnTdcdTAwMDVcIlx1MDAxY6SBXHUwMDFkKMRooihcdTAwMDdrXHUwMDE5YZTZxeZcdTAwMTQrc0rDfFx1MDAxMJ1PX1x1MDAxZVx1MDAxYcCYlTnKXHUwMDEwXHUwMDA2P/KmXGJjnlx1MDAxMM3FXHUwMDAw62BcdTAwMTWRkc2mdCT78O9Vhf5ZYO0/Rdvno/nH081YzY91dk2rWpA8aVx1MDAwMW63tpbCvcRst2ZcdTAwMTbu2pAlT9NpKjM6lbKa82bKJKSwuVx1MDAwYnchiHibMc9VuOP02ey3KPPxajElgpHDXGJTRHBcYqFcdTAwMTmTWthpSkQwXHUwMDFmL8Tz7fv1anh8Rux43kBZ3sB5549cdTAwMGLi/6W3L6GN7ZlpXHUwMDAzXHUwMDAyVqqxsdhcIt5IZVx1MDAwZY7yXHUwMDA2XFyDILAh81x1MDAxN1x1MDAwMVx1MDAwYsFcdTAwMWJVrErO/3XEMf59hlx1MDAxNHGAY5fZb443XGJbPOJcdTAwMTifaTiWOFBqQcrYXHUwMDBlyVx1MDAwN9CYOFpJQlx1MDAxNGJaa4J50c6EvcuSSTJMsjM7k3DwY1xuS1SUc1x1MDAwMyFdXHUwMDE5k0hcbp6PXHT8S1x1MDAwNIi96btcdJBSWJpcdTAwMGan9vpcdTAwMDUgllTXXlx1MDAxN+H+R4CUPXJ8unols1x1MDAxMshcdTAwMThcdTAwMTZcXFx1MDAwMVx1MDAwNChggYm8XGLCeTL7TZR1u9Nv7J9vn4nwhFTvr93rVnPn64RaR1GHc6ZB3lGKXHUwMDEwy75cdTAwMGKDiXBMXHUwMDE2IGOcK0HSq39JmqvMXl/wTilVICFcdTAwMDUyu2cweFx1MDAxMrNlykBcdL/tzsxvoNOxYIVcdTAwMTmF6XFcdTAwMWZhN6KYVEi8bTf2l6yVzFcmlYLUfPLwnCfbjVr8+4qb8dlfY5mCXCLlmNffhEJaKsGyqYtcdTAwMDRJXHUwMDA3vFx1MDAwN1xidUG4lkLk/1x1MDAwN4TZZEVcZkmGQJJTgVxuX99h3JFYK0qBY1x1MDAxMcyWVVBLqshQxd7MVMFcdTAwMTjVXHUwMDFhxEdRyiPn5TtcdTAwMGLUbJCbN9XnT1x1MDAxNlxmvb9cdTAwMTSqluPUfPJcYv1cdTAwMWTaaHKhXHUwMDAybTdzKqV5Q04oVVx1MDAxMHWB2EubKtc4XHUwMDA3kYnU0zSbu5LCYyS0TFNmUn/eRz19eJmcXHUwMDE1t9erxVx1MDAwML+kdyt3vne/nieMP1rDj9nEXHUwMDFhNsyQhTc0tJ9cdTAwMWZ+/lx1MDAwN/8sWp0ifQ== Win hosts: 127.0.0.1 my-domain.local WSL socat :80 --> :4200 ssh -F 4200:my-server.local:80 Linux localhost:80 -> nginx -> localhost:4200 Docker Container 127.0.0.1:4200 -> :4200 Browser my-domain.local[:80]