Внедрение ограничений IP в Go gin - PullRequest
0 голосов
/ 04 октября 2018

Я настраиваю небольшое демонстрационное приложение, которое я хотел бы видеть только с моего домашнего IP-адреса, и, возможно, небольшой набор технических специалистов, с которыми я буду координировать и делиться ими.

Я просматривал readme здесь, но не смог найти: https://github.com/gin-gonic/gin

--- что это за канонический минимальный пример того, как ограничить доступ в приложении только определенными IP-адресамив джине?

(Кроме того, по какой-либо причине это особенно небезопасная идея в 2018 году?)

1 Ответ

0 голосов
/ 04 октября 2018

Прежде чем ответить на ваш вопрос, я хотел бы сказать, что было бы более практичным ограничить доступ к приложению с помощью правил брандмауэра, а не в самой программе, но я отвлекся.

Чтобы ответить на ваш вопросвопрос, просмотрев ссылку на год godoc , я обнаружил, что контекстная структура содержит метод ClientIp(), который:

реализует алгоритм наилучшего усилия длявозвращая реальный IP-адрес клиента, он анализирует X-Real-IP и X-Forwarded-For для правильной работы с такими обратными прокси, как us: nginx или haproxy.Используйте X-Forwarded-For перед X-Real-Ip, так как nginx использует X-Real-Ip с IP-адресом прокси.

Поэтому, если вы настроены на выполнение фильтрации IP в приложении, выможет фильтровать на основе значения, возвращаемого этим методом.

Используя базовый пример, приведенный на странице Github:

package main

import "github.com/gin-gonic/gin"

var Whitelist []string = []string{"1.2.3.4"}

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        whitelisted := false
        for _, v := range Whitelist {
            if v == c.ClientIP() {
                whitelisted = true
            }
        }
        if whitelisted {
            c.JSON(200, gin.H{
                "message": "pong",
            })
        } else {
            c.JSON(403, gin.H{})
        }
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}
...