echoip/README.md

179 lines
4.2 KiB
Markdown
Raw Normal View History

2018-08-27 20:33:29 +02:00
# echoip
2012-11-19 19:11:03 +01:00
A simple service for looking up your IP address. This is the code that powers
2023-10-04 18:01:09 +02:00
https://ip.level.io.
2012-11-19 19:11:03 +01:00
2015-09-17 21:14:09 +02:00
## Usage
2012-11-21 13:58:06 +01:00
2015-09-17 21:14:09 +02:00
Just the business, please:
2012-11-21 13:58:06 +01:00
2015-09-17 21:14:09 +02:00
```
2023-10-04 18:01:09 +02:00
$ curl ip.level.io
2015-09-17 21:14:09 +02:00
127.0.0.1
2023-10-04 18:01:09 +02:00
$ http ip.level.io
2015-09-17 21:14:09 +02:00
127.0.0.1
2023-10-04 18:01:09 +02:00
$ wget -qO- ip.level.io
2016-04-15 20:57:35 +02:00
127.0.0.1
2023-10-04 18:01:09 +02:00
$ fetch -qo- https://ip.level.io
2015-09-17 21:14:09 +02:00
127.0.0.1
2023-10-04 18:01:09 +02:00
$ bat -print=b ip.level.io/ip
127.0.0.1
2015-09-17 21:14:09 +02:00
```
2016-04-17 11:52:37 +02:00
Country and city lookup:
2015-09-17 21:14:09 +02:00
```
2023-10-04 18:01:09 +02:00
$ curl ip.level.io/country
2016-04-17 11:52:37 +02:00
Elbonia
2023-10-04 18:01:09 +02:00
$ curl ip.level.io/country-iso
2018-02-09 20:41:30 +01:00
EB
2023-10-04 18:01:09 +02:00
$ curl ip.level.io/city
2016-04-17 11:52:37 +02:00
Bornyasherk
2019-07-05 15:01:45 +02:00
2023-10-04 18:01:09 +02:00
$ curl ip.level.io/asn
2019-07-05 15:01:45 +02:00
AS59795
2022-09-04 00:08:14 +02:00
2023-10-04 18:01:09 +02:00
$ curl ip.level.io/asn-org
2022-09-04 00:08:14 +02:00
Hosting4Real
2015-09-17 21:14:09 +02:00
```
As JSON:
```
2023-10-04 18:01:09 +02:00
$ curl -H 'Accept: application/json' ip.level.io # or curl ip.level.io/json
2015-09-17 21:14:09 +02:00
{
2016-04-17 11:52:37 +02:00
"city": "Bornyasherk",
"country": "Elbonia",
2018-02-09 20:41:30 +01:00
"country_iso": "EB",
2016-07-06 23:44:33 +02:00
"ip": "127.0.0.1",
2019-07-05 15:01:45 +02:00
"ip_decimal": 2130706433,
"asn": "AS59795",
"asn_org": "Hosting4Real"
2023-10-10 22:40:50 +02:00
} ```
2012-11-19 19:11:03 +01:00
2018-03-21 22:04:53 +01:00
Port testing:
```
2023-10-04 18:01:09 +02:00
$ curl ip.level.io/port/80
2018-03-21 22:04:53 +01:00
{
"ip": "127.0.0.1",
"port": 80,
"reachable": false
}
```
Pass the appropriate flag (usually `-4` and `-6`) to your client to switch
between IPv4 and IPv6 lookup.
2015-09-17 21:14:09 +02:00
## Features
2023-10-04 18:01:09 +02:00
- Easy to remember domain name
- Fast
- Supports IPv6
- Supports HTTPS
- Supports common command-line clients (e.g. `curl`, `httpie`, `ht`, `wget` and `fetch`)
- JSON output
- ASN, country and city lookup using the MaxMind GeoIP database
- Port testing
- All endpoints (except `/port`) can return information about a custom IP address specified via `?ip=` query parameter
- Open source under the [BSD 3-Clause license](https://opensource.org/licenses/BSD-3-Clause)
- Supports IP Stack API or GeoIP
2023-10-10 22:40:50 +02:00
- JWT Authentication
### Installation from Release
- Download release file.
- Install `./echoip` binary ( `sudo install echoip /usr/local/bin/echoip` )
- Install configuration file( `sudo install -D etc/echoip/config.toml /etc/echoip/config.toml` )
- Point `config.TemplateDir` to release `html/`
### Installation from Source
- Install Go 1.18
- `$ cd echoip/`
- `$ make install`
2015-09-17 21:14:09 +02:00
### Usage
```
$ echoip
```
### Configuration
Configuration is managed in the `etc/echoip/config.toml` file. This file should be located in the `/etc` folder on your server ( /etc/echoip/config.toml ). If you have the project on your server, you can run `make install-config` to copy it the right location.
```toml
Listen = ":8080"
TemplateDir = "html" # The directory of the template files ( eg, index.html )
RedisUrl = "redis://localhost:6379" # Redis Connection URL, leave blank for no Cache
CacheTtl = 3600 # in seconds
ReverseLookup = true
PortLookup = true
ShowSponsor = true
Database = "ipstack" # use "IP Stack" or "GeoIP"
TrustedHeaders = [] # Which header to trust, eg, `["X-Real-IP"]`
Profile = false # enable debug / profiling
2023-10-10 22:40:50 +02:00
[Jwt]
Enabled = false
Secret = ""
[IPStack]
ApiKey = ""
UseHttps = true
EnableSecurity = true
[GeoIP]
CountryFile = ""
CityFile = ""
AsnFile = ""
2015-09-17 21:14:09 +02:00
```
### Environment Variables for Configuration
2023-10-10 21:52:05 +02:00
You can also use environment variables for configuration, most likely used for Docker. Configuration file takes precedence first, and then environment variables. Remove the value from the config file if you wish to use the environment variable.
```
ECHOIP_LISTEN=":8080"
ECHOIP_TEMPLATE_DIR="html/"
ECHOIP_REDIS_URL="redis://localhost:6379"
ECHOIP_DATABASE="ipstack"
ECHOIP_TRUSTED_HEADERS="X-Real-IP,X-Forwaded-For"
ECHOIP_IPSTACK_API_KEY="askdfj39sjdkf29dsjfk39sdfkj3"
ECHOIP_GEOIP_COUNTRY_FILE="/full/path/to/file.db"
ECHOIP_GEOIP_CITY_FILE="/full/path/to/file.db"
ECHOIP_GEOIP_ASN_FILE="/full/path/to/file.db"
ECHOIP_CACHE_TTL=3600
ECHOIP_REVERSE_LOOKUP=true
ECHOIP_PORT_LOOKUP=true
ECHOIP_SHOW_SPONSOR=true
ECHOIP_PROFILE=false
ECHOIP_IPSTACK_USE_HTTPS=true
ECHOIP_IPSTACK_ENABLE_SECURITY=true
2023-10-10 22:40:50 +02:00
ECHOIP_JWT_AUTH=false
ECHOIP_JWT_SECRET=""
```
2023-10-10 22:40:50 +02:00
### Authenticate each API request with JWT
You can authenticate each API request with JWT token.
Just enable `config.Jwt.Enabled` and add your JWT secret to `config.Jwt.Secret`.
Requests will be accepted if a valid token is provided in `Authorization: Bearer $token` header.
A `401` will be returned should the token not be valid.
### Caching with Redis
You can connect EchoIP to a Redis client to cache each request per IP. You can configure the life of the key in `config.CacheTtl`.
### Running with `systemd`
There is a systemd service file you can install in `/etc/systemd`.