Check if user is behind a VPN or proxy via simple HTTP request.
This app is using X4BNet's list of IPs. GrOxyP checks if queried IP is on this list.
Sources of code are mentioned in the comments.
Ran on Windows 11 22631.2262, AMD Ryzen 7 3700X, 32GB RAM 3200MHz, Go 1.21.
go-wrk benchmark:
- 100 connections, 20 seconds:
$ go-wrk -c 100 -d 20 "http://localhost:5656/ip?q=194.35.232.123&token=token"
Running 20s test @ http://localhost:5656/ip?q=194.35.232.123&token=token
100 goroutine(s) running concurrently
1356936 requests in 18.422209262s, 197.99MB read
Requests/sec: 73657.62
Transfer/sec: 10.75MB
Avg Req Time: 1.357632ms
Fastest Request: 0s
Slowest Request: 18.6332ms
Number of Errors: 0
Stats (Task Manager, eyeballing): ~30% CPU, ~40MB RAM
- 1 connection, 20 seconds:
$ go-wrk -c 1 -d 20 "http://localhost:5656/ip?q=194.35.232.123&token=token"
Running 20s test @ http://localhost:5656/ip?q=194.35.232.123&token=token
1 goroutine(s) running concurrently
243087 requests in 19.0139044s, 35.47MB read
Requests/sec: 12784.70
Transfer/sec: 1.87MB
Avg Req Time: 78.218µs
Fastest Request: 0s
Slowest Request: 4.6746ms
Number of Errors: 0
Stats (Task Manager, eyeballing): ~11% CPU, ~38MB RAM
- Clone:
git clone https://github.com/BOOMfinity/GrOxyP
. - Go to directory:
cd GrOxyP/cmd/groxyp
. - Build:
go build
. - Set environmental variables as in example:
GROXYP_DB_URL = "https://raw.githubusercontent.com/X4BNet/lists_vpn/main/output/datacenter/ipv4.txt"
GROXYP_DB_UPDATE_INTERVAL = "4h0m0s"
GROXYP_PORT = 5656,
GROXYP_TOKEN = "such_a_token_wow"
GROXYP_DEBUG = false
Note
Port and token are only needed, when you want to spin up an HTTP server.
Important
Always refer to X4BNet's repo for more information about IP lists. You might
want to replace datacenter
with vpn
in the example above.
- Run!
HTTP server will be waiting for requests at default port 5656. Query ip
endpoint like so:
$ curl http://localhost:5656/ip?q=194.35.232.123&token=such_a_token_wow
{"ip":"194.35.232.123","proxy":true,"rule":"194.35.232.0/22"}
Invalid token will cause 401 Unauthorized
messages. Other endpoints will respond with 404
message.
Use example code below:
package main
import (
"fmt"
groxyp "github.com/BOOMfinity/GrOxyP/pkg/client"
"net"
)
var ipChecker, _ = groxyp.NewClient(groxyp.Config{
DatabaseDownloadURL: "https://raw.githubusercontent.com/X4BNet/lists_vpn/main/output/datacenter/ipv4.txt",
DatabaseUpdateInterval: "8h0m0s",
})
func main() {
found, reason := ipChecker.FindIP(net.ParseIP("8.8.8.8"))
fmt.Printf("IP found in the list: %v. IP block: %v", found, reason)
}
Because why not?