๋ฐฑ์๋์์ ํด๋ผ์ด์ธํธ์ IP๋ฅผ ๋ก๊น ํ๋ ๋ฐฉ๋ฒ
2023. 02. 24.
์๋ง๋ ์ฌ๋ฌ๋ถ๋ค์ ์ง์ ๋ง๋ ๋ฐฑ์๋๊ฐ ํ๋ ์ฏค์ ์์๊ฑฐ๋ค.
๋์ ๊ฒฝ์ฐ์๋ api.tmpf.me ์ด ์์๋๋ฐ ํ๊ฐ์ง ์์ฌ์ด ์ ์ด ์์๋ค.
๋ฐ๋ก user access logging..
, ์ ์ํ๋ ์ ์ ๋ค์ ๊ธฐ๋ก์ ๋จ๊ธฐ๋ ์์
์ด ๋ถ์กฑํ๋ค.
์ฌ์ค ๊ผญ ํ์ํ์ง ์์ ์๋ ์๋๋ฐ ๋ญ ํ์ํ๋ค๊ณ ์๊ฐํ๋ฉด์ ๊ธ์ ์ฝ์ด๋ณด์.
์ฐ์ ์ฌ๋ฌ๊ฐ์ง ์ธํ๋ผ ๊ตฌ์ฑ์ด ์์ ์ ์๋ค.
๊ทธ ์ค์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ฐ๋ก ํต์ ํ๋ ๊ฒฝ์ฐ
๋งค์ฐ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ฐ๋ก RemoteAddr ํ๋๋ฅผ ํ์ฑํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์๋ ์ด๋ฏธ์ง์ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ 211.104.53.76
์ด ๋ฐ๋ก ํด๋ผ์ด์ธํธ์ IP์ด๋ค.
(๊ธ์ ์์ฑํ๊ณ ์๋ ๋ด IP)
๋๋ฒ์งธ ๊ฒฝ์ฐ๋ค.
์๋ฒ์ ์ค๊ฐ์ ํ๋ก์ ์๋ฒ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ด๋ค.
์ด ๊ฒฝ์ฐ์๋ ์๋กญ๊ฒ ์์์ผ๋๋ ๊ฒ์ด ์๋๋ฐ X-Forwarded-For ํค๋์ด๋ค.
ํด๋น ํค๋๋ ํ๋ก์๋ฅผ ์ง๋ ๋ ์ ์ค๋๋ RemoteAddr๋ฅผ ํ๋ก์ ๋ค์ ์๋น์ค๊น์ง ์ ๋ฌํ๊ธฐ ์ํด ๋ง๋ ์ฌ์ค์์ ํ์ค ํค๋์ด๋ค.
๋ค์ ์คํฌ๋ฆฐ์ท์ whoami ์๋น์ค๊ฐ 2๊ฐ์ ๋ฆฌ๋ฒ์ค ํ๋ก์ ๋ค์์ ์คํ๋๊ณ ์๋ ๊ฒฝ์ฐ์ด๋ค.
์์ธํ๋ณด๋ฉด ์๋ณธ ํด๋ผ์ด์ธํธ IP๋ฅผ ๋ฃ์ ์ ์๋ ๋ถ๋ถ์ด 2๊ฐ์ง ์กด์ฌํ๋๋ฐ ํด๋ผ์ฐ๋ํ๋ ์ด์์ ์ถ๊ฐํ Cf-Connecting-Ip
ํ๋์ X-Forwarded-For
ํ๋์ ์ฒซ๋ฒ์งธ ๊ฐ์ด๋ค.
์ฐ์ Cf-Connecting-Ip
์ ๊ฒฝ์ฐ ํด๋ผ์ฐ๋ํ๋ ์ด์์ Proxied records๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ง ํด๋น๋๋ฏ๋ก ์ ์ธํ๊ณ ์๋์ X-Forwarded-For
ํค๋๋ฅผ ์ ์ฌํ ์ดํด๋ณด์.
์ฒซ๋ฒ์งธ ๊ฐ์ ๋ถ๋ช
client ip ์ด๋ค. ๊ทธ๋ผ ๋ค์ ๊ฐ์ ๋ฌด์์ผ๊น?
๋ฐ๋ก ํด๋ผ์ฐ๋ํ๋ ์ด ํ๋ก์ ์๋ฒ์ ์์ดํผ์ด๊ณ ๊ทธ ๋ค์ ์์์ client ip ์๋ RemoteAddr์ ๊ฒฝ์ฐ ํด๋ผ์ฐ๋ํ๋ ์ด ๋ค์ ๋ฆฌ๋ฒ์คํ๋ก์์ธ traefik์ ์์ดํผ์ด๋ค.
์์ ์ด๋ฏธ์ง์ ์์ดํผ๋ ๋ค๋ฅด์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ์ง๋๋ค.
X-Forwarded-For ํค๋๋ ํ๋ก์๋ฅผ ํ๋ ์ง๋ ๋ ๊ธฐ์กด์ RemoteAddr ๋ถ๋ถ์ X-Forwarded-For ํค๋์ appendํ๊ณ ๋ณธ์ธ์ธ ํ๋ก์ ์๋ฒ์ IP๊ฐ RemoteAddr์ ๋ค์ด๊ฐ๋ ํ์์ด๋ค.
๋ฐ๋ผ์ โ๋๋ถ๋ถ์ ๊ฒฝ์ฐโ์ ๋ค์ ๋ก์ง์ ์ ์์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ IP๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ์ฑ๊ณตํ๋ค.
forward := r.Header.Get("X-Forwarded-For")
var ip string
var err error
if forward != "" {
// With proxy
ip = strings.Split(forward, ",")[0]
} else {
// Without proxy
ip, _, err = net.SplitHostPort(r.RemoteAddr)
if err != nil {
http.Error(w, "Error parsing remote address ["+r.RemoteAddr+"]", http.StatusInternalServerError)
return
}
}
๊ทผ๋ฐ ์์ ๋ก์ง์๋ ์ฌ๊ฐํ ์ค๋ฅ๊ฐ ํ๊ฐ์ง ์กด์ฌํ๋ค.
๋ง์ฝ ์์์ ๋ฃ์ IP๋ก ์ ๊ทผ์ ์ด๋ฅผ ํ๋ค๊ณ ์๊ฐํด๋ณด์.
์๋ฒ๊ฐ ํ๋ก์๊ฐ ์๋ ์ํ์ด๋ ์๋ ์ํ์ด๋ r.Header๋ผ๋ ๊ฐ์ โ์ ์ ์๊ฒ์โ ์ ์ก๋๊ฒ ๋์ด์๋ค.
๋ํ X-Forwarded-For
ํค๋๋ ๋ง ๊ทธ๋๋ก HTTP ํค๋์ด๋ค.
ํค๋๋ ๊ฐ๋จํ๊ฒ ์กฐ์ ๊ฐ๋ฅํ๋ค.
๋ง์ฝ X-Forwarded-For
ํค๋๋ฅผ ์ฒ์ ์ ์กํ ๋ โ์ถ๊ฐโ ํ ์ํ๋ก ์ ์กํ๊ฒ ๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ์ ์ก๋๋ค.
X-Forwarded-For: <๋ณ์กฐํ์ฌ ์ถ๊ฐํ IP A>, <ํด๋ผ์ด์ธํธ์ ์ค์ IP B>, <PROXY 1 C>
๋ฌผ๋ก ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ proxy C๊ฐ ์์ ์๋ ์๊ณ , ํด๋ผ์ด์ธํธ์ ์ค์ IP๊ฐ RemoteAddr์ ์์ ์๋ ์์ง๋ง ์๊ด ์๋ค.
์์ ๋ ผ๋ฆฌ๋๋ก๋ฉด XFF ํค๋๊ฐ ์ค์ ๋์ด ์๋ค. โ XFF ํค๋ ์ฒซ๋ฒ์งธ ๊ฐ์ ์ฝ๋๋ค. ์ด๊ธฐ ๋๋ฌธ์ ์ ์ ๊ฐ ๋ณ์กฐํ์ฌ ์ถ๊ฐํ ๊ฐ์ด ์ค์ IP๋ก ์ธ์๋๊ฒ ๋๋ค.
์ด๊ฑด ๋ฌธ์ ๋ค.
๋ฐ๋ผ์ ์ด๊ฑธ ์ฒ๋ฆฌํ ๋ณ๋์ ๋ก์ง์ด ํ์ํ๋ฐ โฆ..
๋๋ถ๋ถ์ ํ๋ก๋์
ํ๋ก๊ทธ๋จ์์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋๋ค.
์๋ก์ด ์ค์ ๊ฐ FORWORDED๋ฅผ ์์ฑํ๋ค.
์ด ์ค์ ๊ฐ์ ์ซ์๋ก ๊ฐ ์ซ์๋ ๋ค์์ ๋ํ๋ธ๋ค.
์ซ์ | ์๋ฏธ |
---|---|
0 | ๋ฆฌ๋ฒ์คํ๋ก์๊ฐ ์์ผ๋ฉฐ RemoteAddr๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
1 | ์๋น์ค ์์ 1๊ฐ์ ๋ฆฌ๋ฒ์ค ํ๋ก์๊ฐ ์์ผ๋ฉฐ XFF ํค๋์ -1 ๋ฒ์งธ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. |
.. | .. |
3 | ์๋น์ค ์์ 3๊ฐ์ ๋ฆฌ๋ฒ์ค ํ๋ก์๊ฐ ์์ผ๋ฉฐ XFF ํค๋์ -3 ๋ฒ์งธ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. |
4 | ์๋น์ค ์์ 4๊ฐ์ ๋ฆฌ๋ฒ์ค ํ๋ก์๊ฐ ์์ผ๋ฉฐ XFF ํค๋์ -4 ๋ฒ์งธ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. |
.. | .. |
์ด๋ ๊ฒ ํ๋ค๋ฉด ๋น์ฅ ์ฌ์ฉ์๊ฐ ํค๋ ๊ฐ์ ๋ณ์กฐํ์ฌ ๋ณด๋ธ ๊ฒฝ์ฐ์๋ ์ค์ ๊ฐ์ ์ด๊ณผํ๋ ์์ฒญ์ ๋ํด์๋ ๊ทธ๋ฅ ๋ฌด์ ํ๊ธฐ์ ๋ณ ์์์ ๋ฐ์ง ์๊ฒ ๋๋ค.
์๋ฅผ ๋ค์ด ํด๋ผ์ฐ๋ ํ๋ ์ด์ traefik๋ฅผ ๊ฑฐ์ณ์ ์๋น์ค๋ก ํธ๋ ํฝ์ด ๋์ํ๋ ๊ฒฝ์ฐ FORWORDED ํ๊ฒฝ๋ณ์๋ฅผ 2๋ก ์ค์ ํ๊ณ XFF ํค๋ ๋ฐฐ์ด์์ -2๋ฒ์งธ ๊ฐ์ ์ฌ์ฉํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ ์ ๊ฐ ์์๋ก ๊ฐ์ ์ถ๊ฐํ์ฌ๋ ๋ฌด์๋๋ค๋ ์๋ฏธ์ด๋ค.
๊ทผ๋ฐ ์ด ๋ฐฉ๋ฒ์ ์์ ๋งํ๋ฏ ์๋ฒฝํ์ง ์๋ค.
์๋ํ๋ฉด ๋ญ๊ฐ ์ค์ ๊ฐ์ด ์ถ๊ฐ๋์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ํ๊ฒฝ์์ ์ ์ํ์ฌ ์๋น์คํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค.
โ ๏ธ ๋ค๋ก๋ ์ฌ๋ฏธ์๊ธด ํ๋ ์ ๋ฆฌ๋์ด ์์ง ์์ต๋๋ค. tl;dr โ ๏ธ
- FORWORDED ํ๊ฒฝ ๋ณ์๋ ์๊ฐ๋ณด๋ค ๋์์ง ์๋ ๋ฐฉ์์ด๋ค. ์ถ์ฒํ๋ค.
- XFF ํค๋์ ์์ดํผ ๋์ญ์ ์ ๋ขฐํ๋ ํ๋ก์์ ๋์ญ์ผ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
- XFF ํค๋๋ ์กฐ์์ด ๊ฐ๋ฅํ๋ ๋ฏฟ์ง ๋ง์.
์ด์ฉ๋ค ๋ณด๋ burp suite๋ฅผ ์ด์ฉํด์ ๋ด๊ฐ ์ ์ํ ์ฌ์ดํธ๋ฅผ ๊ณต๊ฒฉํ๊ณ ์ฝ๋๋ฅผ ๋ค์ ๊ฒ์ฆํ๊ณ ์์นซ ๊ทธ๋ฅ ๋์ด๊ฐ ์ ์๋ ๋ถ๋ถ์ ์ ๊ฒํ๊ธฐ๊น์ง ํ๋ค.
์ด ๋ฌธ์ ๋ ์ด๋ป๊ฒ ์๋ ค์ ธ ์์๊น?
๋ค์๊ณผ ๊ฐ์ ์๋ฃ๋ค์ ์ฐพ์ ์ ์์๋๋ฐ ๊ทธ ์ค ํฅ๋ฏธ๋ก์ด ๋ช๊ฐ์ง ์๋ฃ๋ค.
https://blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html
ํ๋ง๋๋ก ๊ธ์ด์ด๊ฐ SSH ํฐ๋๋ก ์ธํด ์ฐ๋ฐ์ ์ผ๋ก XFF ํค๋์ 127.0.0.1 ์ฃผ์๊ฐ ๋ค์ด๊ฐ๊ฒ ๋์๋๋ฐ ์ด๋ฅผ ์คํ์ค๋ฒํ๋ก์ฐ๊ฐ โ๊ด๋ฆฌ์โ์ ์ ๊ทผ์ผ๋ก ์ธ์ํด ๊ถํ ์์น์ด ์ผ์ด๋ฌ๋ค๋ ์ด์ผ๊ธฐ์ด๋ค.
๋ ์ด๋ฐ ์๋ฃ๋ ์ฐพ์ ์ ์์๋ค.
https://www.acunetix.com/vulnerabilities/web/x-forwarded-for-http-header-security-bypass/
XFF HTTP header security bypass, ๋ถ๋ฅ๋ฒํธ CWE-289
CTFd ์ฒ๋ผ ํ๋ก์ ํ์ ์ ํํ์ฌ ๋ฐฉ์งํ๋ ๋ก์ง์ด ์๋ ๊ฒฝ์ฐ๋ ์์์ง๋ง ๋ฌด๋ ค ์คํ์ค๋ฒํ๋ก์ฐ์์ ๊ถํ ์์น์ด ์ผ์ด๋๊ธฐ๋ ํ๋ ๋ฑ ์๋นํ ์ฌ๋ฐ๋ ๊ธฐ๋ฒ์ด์๋ค.
์ฌ๋ฏธ์์ผ๋ ์กฐ๊ธ ๋ ๋์๊ฐ ๋ค๋ฅธ ์๋น์ค๋ค์์ IP ๋ก๊น ๋ฐฉ๋ฒ์ ๊ณต๊ฒฉํ๊ณ ๋ถ์ํด๋ณด์.
๋จผ์ ifconfig.me ์ด๋ค.
ํ์์ ์ฆ๊ฒจ์ฐ๋ ์๋น์ค์ด๊ธฐ์ ์ ํํด๋ณด์๋ค.
๋ค์๊ณผ ๊ฐ์ด proxy option๋ฅผ ์ ํํ์ฌ intercept๋ฅผ ์งํํ๋ค.
์๋ฌด๋ฐ ๋ณ์กฐ๋ฅผ ํ์ง ์์์ ๋ ์๋ต์ด๋ค.
์์ฒญ ํค๋์ ๊ฐ์ ๋ก ๊ฐ์ ๋ฃ์ด๋ณด์๋ค.
๋ถ๋ช ๋ ๊ฐ์ ์กฐ์๋์๋ค.
๊ทธ๋ ๋ค๋ฉด ifconfig.me๋ ์ด๋ค ๋ฐฉ์์ผ๋ก client ip๋ฅผ ํ์ธํ ๊น?
github์์ repo๋ฅผ ์ฐพ์๋ค.
GitHub - pmarques/ifconfig.me: Simple HTTP application for demos and tests
์ธ์ค ์์์ผ๋ ๋ค๋ฅธ ์๋น์ค์๋ค๋ ์ด์ผ๊ธฐ..
์ค์ ๋ก ๋ก์ปฌ์์ ์คํ์ํค๊ณ โ์ ์ด๊ฑด ์๋๋ค ์ถ์๋ค.โ
์ฌ์ง์ด ์ฌ๊ธฐ์์ ํด๋น ์ฐํ์ ๋ํ ๋๋น๋ฅผ ํ์ง ์์์ผ๋ฉฐ ์ฌ์ค ํ ํ์๊ฐ ์์ง๋.. ๊ทธ๋ฅ ๋ณด์ฌ์ฃผ๋๊ฑฐ๋๊น ~
์ฌ์ค ์ด์ธ์๋ ๋ค์ํ ๋ํฌ๊ฐ โA IP echo server inspired byย http://ifconfig.meโ ๋ผ๋ ํ์ดํ ํ์ ์ ์๋์ด ์์๋๋ฐ ๋ช๊ฐ์ง ๋ํฌ์ IP ํ๋ ๋ก์ง์ ๊ฐ์ ธ์๋ณด์๋ค.
ip := this.GetString("ip", this.Ctx.Input.IP())
์ฌ๊ธฐ์ this ๋ณ์๋ beego ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ผ์ฐํฐ ํ๋ผ๋ฏธํฐ์๋ค.
์ฌ๋ฐ๋ ๊ฑธ ์ฐพ์๋ค.
Security issue: Trusted Reverse Proxy and X-Forwarded-* headers ยท Issue #4589 ยท beego/beego
์ง๊ธ ๋ด๊ฐ ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ฌธ์ ์ ๋ํ ์ด์์ธ๋ฐ.. ๊ทธ๋ฅ ๋ซํ๋ค.
์ด๋ ๋ค๋๊ฑด ๋๋ถ๋ถ์ beego๋ก ์์ฑ๋ golang ๋ฐฑ์๋, ๊ทธ ์ค ์ด์ ์ ์ธ๊ธํ ์คํ์ค๋ฒํ๋ก์ฐ๊ฐ์ ๋ก์ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ๋จํ๊ฒ ํดํนํ ์ ์๋ค๋ ์ด์ผ๊ธฐ๊ฐ ๋๋ค.
// IP returns request client ip.
// if in proxy, return first proxy id.
// if error, return RemoteAddr.
func (input *BeegoInput) IP() string {
return (*context.BeegoInput)(input).IP()
}
ํ์ beego์ develop ๋ธ๋์น์ ์ฝ๋ ๊ตฌํ ๋ฐ ์ฃผ์์ ๋ฐ์ตํด ์๋ค.
์.. 2๋ฒ์ ์ฃผ์์ ๋ป์ ์ง์ํด๋ณด๋ฉด โ์ฐ๋ฆฐ ๊ทธ๋ฅ ๋ฌด์ง์ฑ์ผ๋ก XXF ๋ ์ฒซ ๋ฒ์งธ ๊ฐ ๋บด์ฌ๊บผ์ ใ ใฑ ใ โ
๋ค์์ ์ (*context.BeegoInput)(input).IP()
๊ตฌํ์ฒด๋ค.
https://github.com/beego/beego/blob/031c0fc8af57ea1a18e21fd5a7a8e6f23c26bbea/server/web/context/input.go ์ค ์ผ๋ถ์ฝ๋์ด๋ค.
// IP returns request client ip.
// if in proxy, return first proxy id.
// if error, return RemoteAddr.
func (input *BeegoInput) IP() string {
ips := input.Proxy()
if len(ips) > 0 && ips[0] != "" {
rip, _, err := net.SplitHostPort(ips[0])
if err != nil {
rip = ips[0]
}
return rip
}
if ip, _, err := net.SplitHostPort(input.Context.Request.RemoteAddr); err == nil {
return ip
}
return input.Context.Request.RemoteAddr
}
์ด๊ฑฐ ๋ญ๊ฐ ๊ตฌํ์ด ์ด์ํ๋คโฆ
๋ง์ง๋ง ํฌ๋ง์ผ๋ก input.Proxy()
๊ตฌํ์ ๋ณด์
// Proxy returns proxy client ips slice.
func (input *BeegoInput) Proxy() []string {
if ips := input.Header("X-Forwarded-For"); ips != "" {
return strings.Split(ips, ",")
}
return []string{}
}
๊น์ฝโฆ
์ด๊ฒ ๋ง๋ ์ถ์ ๊ตฌํ์ด๋ค.
์ผ๋จ ์ฌ๊ธฐ๊น์ง ๋ดค์ผ๋ฉด ์กฐ์ฉํ ๋ฐฉ๊ธ ์ด์๋ฅผ ์ด ์ ๋ ์์ง๋งโฆ ์ผ๋จ์ beego ๋ด๋ถ์์ IP() ๊ตฌํ์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ๊ฒ์ํด๋ณด์.
server/web/error.go
"AppError": fmt.Sprintf("%s:%v", BConfig.AppName, err),
"RequestMethod": ctx.Input.Method(),
"RequestURL": ctx.Input.URI(),
"RemoteAddr": ctx.Input.IP(),
"Stack": stack,
"BeegoVersion": beego.VERSION,
"GoVersion": runtime.Version(),
์ด๊ฑด ์ผ๋จ RemoteAddr๊ฐ ์๋๋ค. ์ด๋ฌ๋ฉด ์๋ฌ๋ก๊ทธ๋ฅผ ์์ผ ์ ์๊ฒ ๋๋ค.
server/web/server.go
record := &logs.AccessLogRecord{
RemoteAddr: ctx.Input.IP(),
RequestTime: requestTime,
RequestMethod: r.Method,
Request: fmt.Sprintf("%s %s %s", r.Method, r.RequestURI, r.Proto),
์ฌ๊ธฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
server/web/router.go
if p.cfg.RunMode == DEV && !p.cfg.Log.AccessLogs {
match := map[bool]string{true: "match", false: "nomatch"}
devInfo := fmt.Sprintf("|%15s|%s %3d %s|%13s|%8s|%s %-7s %s %-3s",
ctx.Input.IP(),
logs.ColorByStatus(statusCode), statusCode, logs.ResetColor(),
timeDur.String(),
match[findRouter],
์ฌ๊ธฐ๋ dev ๋ชจ๋์์ ์์ธ์ค๋ก๊น ์ ๋ฌธ์ ์๋ ๊ตฌํ์ฒด๋ก ํ๊ฒ ๋๋ค.
๋ญ beego์์ ์์ธ์ค๋ก๊น ์ ๋ฏฟ์ง ์๋๊ฑธ๋กโฆ
๋ค์์ fiber, echo๋ฅผ ์์๋ณด๊ฒ ๋ค.
๋๊ฐ TrustedProxy ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค
IP Address | Echo - High performance, minimalist Go web framework
๊ฐ๋ฐ์๊ฐ ์์๋ฑ ํด๋ฒ๋ ธ๋ฐ.
๊ฒฐ๋ก
์ด๊ฒ ๋ด ๊ฒฐ๋ก ์ด๋ค.
๋ฒ์ฉ์ ์ผ๋ก ๋ฐฐํฌํ ๋ฐฑ์๋์์ ์ฒ์ ๊ฐ๋ฐ์๊ฐ ๋ณ๋์ ์ค์ ํ์ผ ์์ด โ์ ๋ขฐํ ์ ์๋โ ํด๋ผ์ด์ธํธ์ IP๋ฅผ ์ป๋๋ค๋๊ฑด ํ๋ค๋ค.
ํ์ง๋ง ๋ช๊ฐ์ง ์ ํ ๊ฐ๋ฅํ ์ต์ ์ด ์กด์ฌํ๋๋ฐ
- RemoteAddr ๋ง ๋ฏฟ๊ณ ๋ฐฑ์๋๋ฅผ ํ๋ก์ ์์ด ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ
- XFF ํค๋ ์ฒซ๋ฒ์งธ ๊ฐ์ ์ฌ์ฉํ๋ ์ ๋ขฐํ ์ ์๋ ์ํ๋ก ์ฌ์ฉ
- ์๋ฒ๊ฐ ๋ฐฐํฌ๋ ํ๊ฒฝ์ ํ๋ก์ ๊ฐฏ์๋ฅผ ํ๊ฒฝ๋ณ์๋ก ์ค์ ํ์ฌ ์ ๋ขฐํ ์ ์๋ ํ๋ก์ ๊ฐฏ์๋ฅผ ์ค์ ํด๋น ๊ฐฏ์ ๋งํผ๋ง XFF ํค๋๋ฅผ ์ฝ๋๋ก ์ค์
- ์ ๋ขฐํ ์ ์๋ ํ๋ก์์ IP ๋์ญ๋๋ฅผ ์ค์ ํด๋๊ณ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ๋ขฐํ ์ ์๋ XFFํค๋์ IP๋ฅผ ์ฌ์ฉ
์ฌ๊ธฐ์ 3๋ฒ๊ณผ 4๋ฒ์ ์ค์ ํ์ผ์ด ํ์ํ๋ ์ค์ ๋ง ์ํ๋ค๋ฉด ์ธ์ ๋ ์ ๋ขฐํ ์ ์๋ IP๋ฅผ ๊ฐ์ง๊ฒ ๋๊ณ ,
1๋ฒ์ ์ ๋ขฐ๋ ๊ฐ๋ฅํ๋ ํ๊ฒฝ์ ๋ฐ๋ผ ํด๋ผ์ด์ธํธ IP๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ (ํ๋ก์๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ) ์๊ธธ ์ ์๋ค.
2๋ฒ์ ๋ฒ์ฉ์ฑ์ ๋์ผ๋ ์์ฝ๊ฒ ํดํนํ ์ ์๋ค.
๋ ์ด์ธ์ ํด๊ฒฐ๋ฐฉ๋ฒ๋ ์กด์ฌํ๋ค.
ํด๋ผ์ฐ๋ํ๋ ์ด๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฐ์ ํ์ Cf-Conโฆ ํค๋๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์๋ฒ ์๋จ์ ์๋ ํ๋ก์์์ X-Real-IP ๊ฐ์ ์ค์ ํ๊ณ ๊ทธ ๊ฑธ ์ ๋ขฐํ๋ ๋ฐฉ๋ฒ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์๋ค.
์ธ์ ๋ ์ ํ์ด ํ์ํ๊ณ ๋ ๋ฐฑ์๋ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ ๋๋ ์ฌ์ฉํ๊ฒ ๋ ๋ ํด๋น ํ๋ก๊ทธ๋จ์ด ์ด๋ ํฅ ๊ฐ๋ฐ๋์๋์ง ๋ถ์ํ๊ณ ์ ๋ขฐํ ์ ์๋ ๋ฐฉ์์ธ์ง ๊ฒ์ฆํ์ฌ์ผ๊ฒ ๋ค.
๊ทธ๋์ ์ ๋ ์ด๋ป๊ฒ ๊ฐ๋ฐํ ๊ฑฐ๋๋ฉด์โฆ
- XFF ํค๋๋ฅผ ์ฌ์ฉ
- ๋ฌด์กฐ๊ฑด ์ ๋ขฐ๊ฐ ์๋ ๋ก์ปฌ์ฃผ์์ ํด๋ผ์ฐ๋ํ๋ ์ด์ IP๋ฅผ ์ ๋ขฐ
- ์ถ๊ฐ ํ๋ก์ ์ต์ ์ผ๋ก RemoteAddr๋ฅผ ์ฌ์ฉ
- ์ถ๊ฐ ์ต์ ์ ๋ขฐ ๊ฐ๋ฅํ ํ๋ก์ ์ฃผ์๋ฅผ ์ถ๊ฐ ํ ์ ์๋๋ก ์ค์
- ์ถ๊ฐ ์ต์ ํ๋ก์ ํ ์๋ก๋ง ์ค์ ํ์ฌ ์ ๋ขฐ
๊ทผ๋ฐ ๋์ ์๋๋ค.
๊ทธ๋๋ WAF๋ ์ ์ ์๋ ์์ธ์ผ๋ก ์ธํด XFF ๋๊ฐ ๊ฐ์ ๋ณ๊ฒฝ๋์ด ๊ณ ์ ๋๊ฑฐ๋ ํ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ผ๋ค..
๋ญ ๋ด๊ฐ ๊ฐ๋ฐํ ๋๋ ์ด์ฌํ ์ฐธ๊ณ ํด์ผ
Q. ์ ์ ํ๋ฒ ๊ด์ ์ธํ๋ผ ์ ๊ฒ ๋น์ XFF ํค๋๊ฐ ์ค์ข ๋๋ ์ด์ํ ์ผ์ด ์์์์ฃ ?
๊ทธ๋ ์์ธ์ด ๋ญ์๋์?
A. ๋ฐ๋ณด๊ฐ์ด ์ค์ผ์คํธ๋ ์ด์ ์ ํ๋ต์๊ณ ์ค์ ํด๋ swarm์์ overlay ๋คํธ์ํฌ ์ค์ ๋๋ถ์ ๋คํธ์ํฌ๊ฐ ์ด์ํด์ง ํ์ด์์ต๋๋ค.
ํ์คํ ์๋ จ๋ ๊ธฐ์ ์๊ฐ ์์ผ๋ฉด ๊ธฐ์ ๋์ ์ ๋ฏธ๋ค์ผ๋๋ค๊ณ ๋๋ ๋๋ชฉ์ด์์ฃ .
Q. ipLogger ํ๋ก์ ํธ๋ฅผ ์ต์ข ์ ์ผ๋ก ์งํํ์ จ๋๋ฐ, ์ด๋ค๊ฑธ ๋๋ผ์ จ๋์?
A. ์๊ฐ๋ณด๋ค ๋ง์ ํ๋ก์ ํธ์์ XFF ํค๋๋ฅผ ๋ฏฟ๊ณ ์๋ ๊ฒ ๊ฐ๊ณ ๊ทธ ๊ตฌํ์ด ๋ถ์์ ํ ๊ฒฝ์ฐ๋ ์์์ต๋๋ค.
๋ฌผ๋ก ipLogger ํ๋ก์ ํธ๊ฐ ์๋ฒฝํ๋ค๋ ๊ฒ์ ์๋์ง๋ง ์ ์ํ๋ฉฐ ๋ก๊น ๊ธฐ์ ๊ณผ ํด๋ผ์ด์ธํธ์ ์ง์ง IP๋ฅผ ์ป๊ฒ๋๋ ๊ธฐ์ ๋ฉด์์๋ ํ์คํ ๊ณต๋ถ๊ฐ ๋์์ต๋๋ค.