kawabatas技術ブログ

試してみたことを書いていきます

Golang+EchoのAPIにIPアドレスによるアクセス制限を設ける

概要

Golang + EchoAPIIPアドレスによるアクセス制限を設けたのでメモ。

実装

ほぼほぼこちらを参考にさせていただいた。

package main

import (
    "net"
    "os"
    "strings"

    "github.com/labstack/echo"
)

// InternalIpFilter returns an middleware which allow internal access only.
func InternalIpFilter() echo.MiddlewareFunc {
    return func(next echo.HandlerFunc) echo.HandlerFunc {
        return func(c echo.Context) error {
            internalIps := strings.Split(os.Getenv("INTERNAL_IPS"), ",")
            requestIp := net.ParseIP(c.RealIP())

            for _, ip := range internalIps {
                _, ipnet, err := net.ParseCIDR(ip)
                if err != nil {
                    return err
                }

                if ipnet.Contains(requestIp) {
                    return next(c)
                }
            }

            return echo.ErrUnauthorized
        }
    }
}
package main

import (
    "net/http"
    
    "github.com/labstack/echo"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    }, InternalIpFilter())
    e.Logger.Fatal(e.Start(":1323"))
}

環境変数 INTERNAL_IPS にアクセスを許可するIPアドレス( CIDR 形式)をカンマ区切りで指定する。 export INTERNAL_IPS=xxx.xxx.xxx.xxx/xx,127.0.0.0/8