A number of years ago, I created a fully open source (MIT) project called sish [0] that does just this.
sish is a SSH server written specifically for tunneling. You get all of the benefits of SSH, but also automatic TLS, a web console of requests a tunnel has received, and various other features. You can also tunnel more than just HTTP(S). You can tunnel websockets, TCP connections, and even have internal alias connections for using ProxyJump within the tunnel. All stateless and all protected with SSH auth.
If you’re not interested in self hosting, there’s a hosted version at tuns.sh [1] that has multi region support and a few other cool features (including UDP tunneling) as part of the pico.sh [2] membership ($2/mo). Happy to answer any questions in this space!
Thank you, I’ve been using sish for the past month or so to expose my dev severs over the network when it time to review changes. It means I can review from my second laptop or my phone as if I were sitting at the computer running the dev server.
No port forwarding. No public IP required. No special proxy to set up.
Iroh already runs public relays. Your two computers will signal through those, and then port-knock and form a direct connection to each other, perfectly encrypted.
We just need to define a new https:// url, like ... let's call it "irohttps://" maybe, so then you could contact my laptop with "irohttps://<hash>/path?query".
This is one of the core things I've been working towards with DNTLS [1]. I love the idea of tunnels, especially for sharing between private parties. The SaaS providers (Tailscale, Cloudflare, etc.) have done a good job making it really easy on their infra, but it really blurs the line of "self-hosted" to me. Ideally we end up with solutions like this that can be run entirely without an intermediary.
If that's all that was necessary then I feel like a lot of these SaaS tools wouldn't be as popular. I suspect a lot of Tailscale's success is because wireguard is not easy nor does it solve the full problem space (i.e. discovery). With `tailscale serve` I can get a private HTTPS endpoint to my local machine in almost no time.
This is wildly over-complicated and also has a bunch of footguns and security risks.
For example, that very first NGINX section allows an attacker to direct their incoming traffic to any arbitrary listening port on localhost. They can even write a simple for loop in bash that would use curl to test all of the different ports. This also bypasses any firewall rules that you might have blocking traffic from the outside world.
be very careful following the instructions in this article.
It's already using a high port. Forwarding a high port directly with SSH prevent exposing the service through a virtual host and provide HTTPS (but I didn't think of it until your mentioned it). And it would open the service to be discovered by enumerating all possible ports, like you mentioned in your first comment.
sish and ngrok are mentioned in the intro along with the reasons I didn't go this way (specific SSH server to run for the first and not self-hosted for the later).
This domain is crowded with solutions. I only explored that myself because the "free" solutions only requiring an SSH client were unreliable, including the free tier of ngrok (broken SSH tunnel).
I don't have the code at hand, but I think it's better to just have a nginx server that only serves content if the browser has a specific certificate installed.
That way you generate a key pair, share the public key with anyone that you want to share the content with and that's it.
Downside is that some browsers don't handle the certificates properly (especially on phones)
I like that the design composes existing tools instead of creating a new daemon, but what threat model covers leaked URLs, tunnel enumeration, forwarded credentials, and abandoned sessions?
I forward port 80/443 on my router to port 80/443 on my home LAN nginx webserver and point my domain name to my home IPv4. Then I put files in directories. It works great and has worked great for a couple decades. While the number of static nginx vulnerabilities that have come out since AI became good at coding has increased I still haven't run into one that applies to my simple static nginx setup. All this tunneling and secrecy and credentials is... well, it applies to some cases and I don't want to dismiss those. But it really doesn't apply to most human person's use cases. Just host a normal server on your home IPv4. There's nothing to break.
> Just host a normal server on your home IPv4. There's nothing to break.
There is a privacy aspect. For example you seem to have watched Meet Joe Black and Six Days Seven Nights recently. Do you care that we know that? Maybe not, but I can also see the porn you enjoyed.
I don't understand how you would know that. If you mean those sites where you put in an ip address and get a list of torrents that IPv4 has been associated with then I guess you aren't aware that those things are wildly inaccurate in the false positive sense. Because of this I am not sure if you were just giving a made up example of information you might find on those sites, or if you actually checked my profile and pinged superkuh.com to get my ipv4 and ran it and got fake results. An IP address is not private info. It's how we participate with each other on the internet. In either case I'm not worried because I know those site's purported results don't mean anything. If you mean nation state level actors or the like, well, yeah. That threat model is a bit beyond this.
It is much more private to host on your static webserver and link your friend to http(s)://my.ip.goes.here/orwhatever.jpg than it is to use a third party corporate services that both establish third party doctorine of no assumption of privacy and who have a profit-motive to sell your info. Do it yourself and you have a legal assumption of privacy and no one's continued existence is dependent upon selling information about you.
While I do appreciate very much the "we already have the technology, let's just use it!" approach + the self hosting aspect, one of the downsides of self hosting without a proxy is having to expose your endpoint and likely having minimal defensive tools.
It seems like every day there's some new "expose your laptop to the internet!!!111" service (or protocol or methodology) that I have to block or otherwise disable at work.
Users and their agents are constantly trying to make all sorts of horrible things forward-facing, and what sucks is that there's not a comprehensive way to block this stuff categorically without severely impacting a ton of legitimate usage.
(And yes, we have _very_ easy sanctioned ways for users to deploy things onto actual managed hosts and make them forward-facing)
A number of years ago, I created a fully open source (MIT) project called sish [0] that does just this.
sish is a SSH server written specifically for tunneling. You get all of the benefits of SSH, but also automatic TLS, a web console of requests a tunnel has received, and various other features. You can also tunnel more than just HTTP(S). You can tunnel websockets, TCP connections, and even have internal alias connections for using ProxyJump within the tunnel. All stateless and all protected with SSH auth.
If you’re not interested in self hosting, there’s a hosted version at tuns.sh [1] that has multi region support and a few other cool features (including UDP tunneling) as part of the pico.sh [2] membership ($2/mo). Happy to answer any questions in this space!
[0] https://github.com/antoniomika/sish
[1] https://tuns.sh
[2] https://pico.sh
sish does get a mention: "Some only require a plain SSH client but rely on a specific SSH server, like sish.:
Thank you so much for this! I self-host sish and we used it extensively at my previous company for engineers to integrate with others.
Thank you, I’ve been using sish for the past month or so to expose my dev severs over the network when it time to review changes. It means I can review from my second laptop or my phone as if I were sitting at the computer running the dev server.
For this stuff, I'm most excited about https over iroh.
- https://github.com/aflin/iroh-webproxy
- https://github.com/n0-computer/iroh-proxy-utils
No port forwarding. No public IP required. No special proxy to set up.
Iroh already runs public relays. Your two computers will signal through those, and then port-knock and form a direct connection to each other, perfectly encrypted.
We just need to define a new https:// url, like ... let's call it "irohttps://" maybe, so then you could contact my laptop with "irohttps://<hash>/path?query".
>and then port-knock and form a direct connection to each other, perfectly encrypted.
so... ICE/TURN/STUN ? Sorry I forgot which one of them actually works, but they do work
Yes, and TLS/QUIC/Wireguard all offer encryption.
What toomim is excited about is this combination of technologies, and that's more than just NAT punching or encryption.
iroh-ssh works today: https://github.com/rustonbsd/iroh-ssh
Not perfectly, but good enough for port forwarding web interfaces through cgnat
Where doesn't Iroh work well?
"Iroh already runs public relays."
That's not "self-hosting"
Last I checked this project also automatically forwards traffic through their servers when direct connections fail
It's not even peer-to-peer
You can run your own relay server, see "Setup Relay Server" below
https://github.com/rustonbsd/iroh-ssh/blob/main/CUSTOM_RELAY...
This is one of the core things I've been working towards with DNTLS [1]. I love the idea of tunnels, especially for sharing between private parties. The SaaS providers (Tailscale, Cloudflare, etc.) have done a good job making it really easy on their infra, but it really blurs the line of "self-hosted" to me. Ideally we end up with solutions like this that can be run entirely without an intermediary.
[1]: https://dntls.substack.com/p/the-new-internet
So like wireguard then?
If that's all that was necessary then I feel like a lot of these SaaS tools wouldn't be as popular. I suspect a lot of Tailscale's success is because wireguard is not easy nor does it solve the full problem space (i.e. discovery). With `tailscale serve` I can get a private HTTPS endpoint to my local machine in almost no time.
Yeah, and Dropbox is just rsync and scp :)
Dropbox orginally used an rsync library
And windows could originally fit on five 5.25" disks.
Re Dropbox: https://news.ycombinator.com/item?id=9224
presumably somewhat more like nebula
This is wildly over-complicated and also has a bunch of footguns and security risks.
For example, that very first NGINX section allows an attacker to direct their incoming traffic to any arbitrary listening port on localhost. They can even write a simple for loop in bash that would use curl to test all of the different ports. This also bypasses any firewall rules that you might have blocking traffic from the outside world.
be very careful following the instructions in this article.
Read the man page for SSH, and especially the remote forward section. https://man7.org/linux/man-pages/man1/ssh.1.html
The attack you mention is solved in the second part of the article.
I did notice that you tried to mitigate the risk, but why not just pick a high port rather than this complex redirection?
Your scheme is smart and creative but unnecessarily risky.
SSH can do remote listens to the world by itself, no second nginx needed, but sish or ngrok might be a better solution for the general case.
Anytime you punch holes, you're taking a risk, so make it as narrow as you can.
It's already using a high port. Forwarding a high port directly with SSH prevent exposing the service through a virtual host and provide HTTPS (but I didn't think of it until your mentioned it). And it would open the service to be discovered by enumerating all possible ports, like you mentioned in your first comment.
sish and ngrok are mentioned in the intro along with the reasons I didn't go this way (specific SSH server to run for the first and not self-hosted for the later).
This domain is crowded with solutions. I only explored that myself because the "free" solutions only requiring an SSH client were unreliable, including the free tier of ngrok (broken SSH tunnel).
You could also use the SSH SOCKS5 proxy if you don't want to hardcode ports in your ssh config.
I don't have the code at hand, but I think it's better to just have a nginx server that only serves content if the browser has a specific certificate installed. That way you generate a key pair, share the public key with anyone that you want to share the content with and that's it.
Downside is that some browsers don't handle the certificates properly (especially on phones)
An HTPS server always hands out its public key. Do you mean client secrets or something?
Sounds like he's talking about mTLS/client certificates. https://blog.mozilla.org/security/2021/07/28/making-client-c...
I like that the design composes existing tools instead of creating a new daemon, but what threat model covers leaked URLs, tunnel enumeration, forwarded credentials, and abandoned sessions?
I'm working on something similar with userspace wireguard, will share it soon.
Instead of tunneling, why aren't there easier ways to develop and deploy to publicly accessible servers (for mere mortals)?
Just install pangolin and call it a day
If self-hosted, then why do you need a third-party service *.ssh.luffy.cx ?
You replace it with your domain.
This is what I needed, but I didn't know it
Everything old is new again. Reminds me of patching apache 2.2 to properly support tunneling ssh over https with mod_proxy_connect and proxytunnel
i think my ai found your article because it did just this
I forward port 80/443 on my router to port 80/443 on my home LAN nginx webserver and point my domain name to my home IPv4. Then I put files in directories. It works great and has worked great for a couple decades. While the number of static nginx vulnerabilities that have come out since AI became good at coding has increased I still haven't run into one that applies to my simple static nginx setup. All this tunneling and secrecy and credentials is... well, it applies to some cases and I don't want to dismiss those. But it really doesn't apply to most human person's use cases. Just host a normal server on your home IPv4. There's nothing to break.
ISP ToS become an issue. Certainly depends on how rabidly one’s ISP enforces the rule …
> Just host a normal server on your home IPv4. There's nothing to break.
There is a privacy aspect. For example you seem to have watched Meet Joe Black and Six Days Seven Nights recently. Do you care that we know that? Maybe not, but I can also see the porn you enjoyed.
I don't understand how you would know that. If you mean those sites where you put in an ip address and get a list of torrents that IPv4 has been associated with then I guess you aren't aware that those things are wildly inaccurate in the false positive sense. Because of this I am not sure if you were just giving a made up example of information you might find on those sites, or if you actually checked my profile and pinged superkuh.com to get my ipv4 and ran it and got fake results. An IP address is not private info. It's how we participate with each other on the internet. In either case I'm not worried because I know those site's purported results don't mean anything. If you mean nation state level actors or the like, well, yeah. That threat model is a bit beyond this.
It is much more private to host on your static webserver and link your friend to http(s)://my.ip.goes.here/orwhatever.jpg than it is to use a third party corporate services that both establish third party doctorine of no assumption of privacy and who have a profit-motive to sell your info. Do it yourself and you have a legal assumption of privacy and no one's continued existence is dependent upon selling information about you.
"There's a privacy aspect."
But the OP made no mention of "privacy"
It refers to "self-hosted"
While I do appreciate very much the "we already have the technology, let's just use it!" approach + the self hosting aspect, one of the downsides of self hosting without a proxy is having to expose your endpoint and likely having minimal defensive tools.
It seems like every day there's some new "expose your laptop to the internet!!!111" service (or protocol or methodology) that I have to block or otherwise disable at work.
Users and their agents are constantly trying to make all sorts of horrible things forward-facing, and what sucks is that there's not a comprehensive way to block this stuff categorically without severely impacting a ton of legitimate usage.
(And yes, we have _very_ easy sanctioned ways for users to deploy things onto actual managed hosts and make them forward-facing)