mrkeyoor.com_
Sun 13 Sept 17:42 UTC
Dev Toolsevaluationupdated 13 Sept 2026

ligolo-ng review

Ligolo-ng gives penetration testers routed access to a remote network through an agent that calls back over TLS. It creates a TUN interface on the operator's machine, so familiar tools can reach the remote network without sending their traffic through proxychains.

trackingstars / 7d
Verdict

Our Ligolo-ng run installed 198 packages and built successfully, but 3 of 9 test targets failed, so pentesters should trial the exact routing and scanning workflow before adopting it. The TUN design is easier to work with than per-tool SOCKS settings, and the unprivileged agent is a practical advantage. Hold it back from a time-sensitive engagement until certificate handling, host routes, and sustained scans pass on the operating systems you will use.

We ran it

Lab card: what happened when we ran ligolo-ngScreenshot of ligolo-ng (docs.ligolo.ng)
Install✓ · 43s198 packages
Build✓ · 42s
Tests✗ · 11s6 passed · 3 failed of 9 (go test)
Repo133 files~12,390 lines of source · 1 MB · 1 CI workflows

Answers from our run

Does ligolo-ng build from source?

Dependencies installed in 43 seconds (198 packages), and the build succeeded in 42 seconds. We cloned commit bec34a6 into a clean Debian container with 3 CPUs and no project-specific setup.

Do ligolo-ng's tests pass?

Not all of them: 6 of 9 passed and 3 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use ligolo-ng?

Operators who cannot create a TUN interface on the proxy host: the README says the agent needs no elevated rights, while the relay does.

What are the alternatives to ligolo-ng?

Chisel, sshuttle, frp. Our Ligolo-ng run installed 198 packages and built successfully, but 3 of 9 test targets failed, so pentesters should trial the exact routing and scanning workflow before adopting it.

Setup3/5Build passed; TUN, routes, TLS, and platform files still need care
Docs4/5Quickstart covers routes, certificates, platforms, and scan limits
Community4/54,967 stars with issue and pull request activity in September
Maturity3/5v0.9.1 is current, but our test run and open bugs need attention

Who it’s for

Penetration testers who want to run network tools through a pivot without adapting each tool to SOCKS.
Red teams that can place an unprivileged agent on a target and control a TUN-capable proxy host.
Operators who need several agent sessions, reverse connections, listeners, or saved tunnel configuration.
Teams willing to pin certificates and test their exact scan patterns before an engagement.

Who it’s NOT for

Operators who cannot create a TUN interface on the proxy host: the README says the agent needs no elevated rights, while the relay does.
Anyone who needs raw-packet fidelity: Ligolo-ng converts a SYN scan into remote connect() calls and documents possible Nmap false positives.
macOS users expecting autoroute to work unchanged: open issue 178 reports network is unreachable while adding routes on Apple Silicon.
Deployments that connect by bare hostname on the measured commit: issue 195 reports failed TLS validation and missing SNI, with a fix still in an open pull request.
Teams that require a fully passing Go test run before adoption: 3 of 9 test targets failed in our sandbox.

Setup reality

Our sandbox install succeeded in 43 seconds and pulled 198 Go packages. The build passed in 42 seconds, then tests failed after 11 seconds: 6 passed and 3 failed out of 9. The log tail identifies pkg/agent/smartping as failed, while protocol, netstack, and relay targets passed.

Running a tunnel needs a proxy host that can create a TUN interface, an agent that can reach it, routes to the remote network, and a TLS choice. Let's Encrypt requires port 80, while custom certificates or a fingerprint-checked self-signed certificate avoid that service.

Windows needs the matching wintun.dll; macOS needs a utun device. Raw packets do not cross the tunnel, so Nmap SYN behavior changes. Our unprivileged container verified the 1 MB Go checkout and its build, not a live privileged tunnel or network throughput.

Ligolo-ng v0.9.1 turns one TLS callback into routed access

Ligolo-ng v0.9.1 connects a small remote agent to a proxy and presents the far network through a local TUN interface. The proxy uses a gVisor user-space network stack to translate packets into socket operations on the agent. That gives Nmap, RDP clients, and other ordinary network programs a route to the target subnet without individual SOCKS settings. For a pentester moving through a segmented environment, that is a cleaner working model than wrapping every command in proxychains.

The agent is unprivileged, while the proxy owns the TUN interface

In v0.9.1, the agent does not require administrator or root access. The proxy side must be allowed to create a TUN interface and install routes. On Linux, the CLI can create the interface, or the operator can use ip tuntap and ip route. Windows requires the correct wintun.dll beside the program. The official quickstart tells macOS users to choose a utun device and provides a separate route command. Those are operational prerequisites, not optional tuning.

TLS also needs a deliberate choice. The proxy can request a Let's Encrypt certificate, use supplied certificate and key files, or generate a self-signed certificate. Automatic issuance needs port 80 reachable for validation. With self-signed TLS, the docs recommend copying the proxy's certificate fingerprint into the agent command. The -ignore-cert flag exists for labs and debugging, and the documentation warns about man-in-the-middle attacks. A production engagement should carry the fingerprint or a trusted certificate in its deployment procedure.

What happened when we ran it

Our sandbox installed 198 Go packages in 43 seconds, and the build finished successfully in 42 seconds. We tested commit bec34a6, which is the commit named in the v0.9.1 release history. The checkout contained 133 files and about 12,390 lines of source, occupying 1 MB before dependencies. Our test method used a fresh unprivileged Debian container with 3 CPUs and 8 GB of RAM, so these results cover repository setup and compilation rather than a privileged TUN session.

The Go test step failed with exit code 1 after 11 seconds. The supplied summary counted 6 passed and 3 failed out of 9. Its tail names pkg/agent/smartping as a failed target, while pkg/protocol, pkg/proxy/netstack, and pkg/relay passed. Several other packages reported that they had no test files. The log does not show why smartping failed, so it would be wrong to blame missing privileges, networking, or a dependency. The useful result is simply that this commit did not pass its full test command in our sandbox.

Our scan found 1 CI workflow, no Dockerfile, and no separate tests directory. Go projects commonly keep test files beside source, and the passing targets show that tests do exist here. The absence of a Dockerfile matters in a different way: operators who want a containerized proxy must own the image, TUN device mapping, capabilities, and route setup themselves. Our run did not measure tunnel speed, packet loss, or scan accuracy, so the README's performance example remains the project's result rather than ours.

SYN scans become connect scans because raw packets stay local

Ligolo-ng v0.9.1 carries TCP and UDP traffic plus ICMP echo requests, but the unprivileged agent cannot forward raw packets. A SYN sent into the TUN interface becomes a connect() call on the remote host, and the proxy synthesizes the corresponding answer. The README tells Nmap users to select --unprivileged or -PE to avoid false positives. This is the central tradeoff: normal tools gain routed access, while low-level packet behavior is approximated.

That tradeoff rules out some reconnaissance methods. Scanners that depend on unusual TCP flags, raw ICMP types, or exact packet responses will not see the same network that a privileged routed host would. The README's supported list is narrow enough to make the boundary clear. Treat service discovery and ordinary TCP connections as the good fit. If an engagement depends on packet craft or forensic fidelity, place a suitable relay inside the network or choose a path that forwards raw traffic.

Two open reports affect macOS routes and hostname TLS

Issue 178 reports that autoroute created a macOS utun interface but route additions returned network is unreachable on Apple Silicon. The reporter documented manual interface addressing and routing that worked around the failure, while leaving the diagnosis to the maintainers. Issue 195, filed September 11 against commit bec34a6, says a bare hostname such as tunnel.example.com:443 leaves the TLS server name empty. The report describes failed certificate validation and missing SNI; pull request 196 proposes a fix.

These reports deserve a pre-engagement check because they touch reachability rather than cosmetic behavior. Use the exact agent connection syntax, certificate mode, proxy operating system, and route layout planned for the job. A 5-minute lab connection can expose the hostname parsing problem, while a route check on macOS can confirm whether autoroute works on that host. Long scan sessions also deserve soak testing: a September pull request discusses connection leaks during repeated short-lived connections, though that change was still open when researched.

The August release and September activity show ongoing maintenance

Release v0.9.1 and the last repository push both landed on August 11, 2026. The release contains fixes for denial-of-service issues reported to the maintainer. GitHub showed 4,967 stars and 20 combined issues and pull requests when fetched. New issue and pull request activity continued on September 11, including the SNI report and its proposed patch. That mix points to an active project with visible defects under discussion, rather than a frozen utility.

Alternatives

ProjectWhat it isPick it when
Chisel gh↗A TCP and UDP tunnel carried over HTTP and secured with SSH.pick this instead when HTTP transport and explicit port forwarding fit better than routed TUN access.
sshuttleA transparent proxy that forwards traffic and DNS over SSH.pick this instead when SSH access already exists and Linux or macOS transparent proxying is enough.
frp gh↗A reverse proxy for exposing services behind NAT or a firewall.pick this instead when publishing selected internal services matters more than exploring a routed network.

What people are saying

  1. [github-trending] nicocha30/ligolo-ng

Sources

  1. Ligolo-ng repository and README
  2. Ligolo-ng quickstart
  3. Ligolo-ng v0.9.1 release
  4. macOS autoroute issue 178
  5. hostname TLS and SNI issue 195
  6. connection leak pull request 197

More dev tools reviews

Kingfisher · mypy · act · stremio-core · cool-retro-term · agent-skills · the whole board →