Golang+EchoのAPIにIPアドレスによるアクセス制限を設ける
概要
Golang + Echo の API に IPアドレスによるアクセス制限を設けたのでメモ。
実装
ほぼほぼこちらを参考にさせていただいた。
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