mirror of
https://github.com/cloudflare/cloudflared.git
synced 2026-05-14 19:40:41 +00:00
TUN-4017: Add support for using cloudflared as a full socks proxy.
To use cloudflared as a socks proxy, add an ingress on the server
side with your desired rules. Rules are matched in the order they
are added. If there are no rules, it is an implicit allow. If
there are rules, but no rule matches match, the connection is denied.
ingress:
- hostname: socks.example.com
service: socks-proxy
originRequest:
ipRules:
- prefix: 1.1.1.1/24
ports: [80, 443]
allow: true
- prefix: 0.0.0.0/0
allow: false
On the client, run using tcp mode:
cloudflared access tcp --hostname socks.example.com --url 127.0.0.1:8080
Set your socks proxy as 127.0.0.1:8080 and you will now be proxying
all connections to the remote machine.
This commit is contained in:
@@ -10,6 +10,7 @@ import (
|
||||
"sync"
|
||||
|
||||
"github.com/cloudflare/cloudflared/config"
|
||||
"github.com/cloudflare/cloudflared/ipaccess"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"github.com/rs/zerolog"
|
||||
@@ -26,6 +27,7 @@ var (
|
||||
|
||||
const (
|
||||
ServiceBastion = "bastion"
|
||||
ServiceSocksProxy = "socks-proxy"
|
||||
ServiceWarpRouting = "warp-routing"
|
||||
)
|
||||
|
||||
@@ -175,6 +177,23 @@ func validate(ingress []config.UnvalidatedIngressRule, defaults OriginRequestCon
|
||||
service = &srv
|
||||
} else if r.Service == "hello_world" || r.Service == "hello-world" || r.Service == "helloworld" {
|
||||
service = new(helloWorld)
|
||||
} else if r.Service == ServiceSocksProxy {
|
||||
rules := make([]ipaccess.Rule, len(r.OriginRequest.IPRules))
|
||||
|
||||
for i, ipRule := range r.OriginRequest.IPRules {
|
||||
rule, err := ipaccess.NewRuleByCIDR(ipRule.Prefix, ipRule.Ports, ipRule.Allow)
|
||||
if err != nil {
|
||||
return Ingress{}, fmt.Errorf("unable to create ip rule for %s: %s", r.Service, err)
|
||||
}
|
||||
rules[i] = rule
|
||||
}
|
||||
|
||||
accessPolicy, err := ipaccess.NewPolicy(false, rules)
|
||||
if err != nil {
|
||||
return Ingress{}, fmt.Errorf("unable to create ip access policy for %s: %s", r.Service, err)
|
||||
}
|
||||
|
||||
service = newSocksProxyOverWSService(accessPolicy)
|
||||
} else if r.Service == ServiceBastion || cfg.BastionMode {
|
||||
// Bastion mode will always start a Websocket proxy server, which will
|
||||
// overwrite the localService.URL field when `start` is called. So,
|
||||
|
||||
Reference in New Issue
Block a user