HOME_kr - madvirus/ip-filter GitHub Wiki

IP-FILTER

๊ฐœ์š”

IP ์ ‘๊ทผ ํ—ˆ์šฉ/์ฐจ๋‹จ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ์ž๋ฐ” ๊ธฐ๋ฐ˜ IP ํ•„ํ„ฐ๋ง ๋ชจ๋“ˆ

๋ชจ๋“ˆ ๋ชฉ๋ก

๋ชจ๋“ˆ ์ด๋ฆ„ ์„ค๋ช… ํ•„์š” ๋ชจ๋“ˆ
ip-filter-core IP ํ•„ํ„ฐ๋ง ์œ„ํ•œ ํ•ต์‹ฌ API ์ œ๊ณต -
ip-filter-conf-parser ๋ฌธ์ž์—ด์„ Config๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ํŒŒ์„œ ์ œ๊ณต ip-filter-core
ip-filter-web-api ํŠน์ • IP๋ฅผ ์ฐจ๋‹จํ•ด์ฃผ๋Š” ์›น ํ•„ํ„ฐ API ์ œ๊ณต -
ip-filter-web-simple ip-filter-web-api์˜ ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„ ์ œ๊ณต ip-filter-web-simple
ip-filter-conf-parser
ip-filter-core

Maven ์„ค์ •

    <repositories>
        <!-- repository for ip-filter module -->
        <repository>
            <id>ip-filter-mvn-repo</id>
            <url>https://raw.github.com/madvirus/ip-filter/mvn-repo/</url>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </snapshots>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.chimi.ipfilter</groupId>
            <artifactId>ip-filter-core</artifactId> <!-- Module name -->
            <version>0.2</version>
        </dependency>
    </dependencies>

ip-filter-core

์‚ฌ์šฉ๋ฒ•

import org.chimi.ipfilter.Config;
import org.chimi.ipfilter.IpFilter;
import org.chimi.ipfilter.IpFilters;
import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class IpFilterTest {
    @Test
    public void basicUsageOfIpFilter() {
        // Config ์ดˆ๊ธฐํ™”
        Config config = new Config();
        config.setAllowFirst(true);
        config.setDefaultAllow(false);
        config.allow("1.2.3.4"); // ํ—ˆ์šฉ IP ์ถ”๊ฐ€
        config.allow("10.20.30.40");
        config.deny("101.102.103.104"); // ์ฐจ๋‹จ IP ์ถ”๊ฐ€
        
        // IpFilters.create() ๋˜๋Š” IpFilters.createCached() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ IpFilter ์ƒ์„ฑ
        IpFilter ipFilter = IpFilters.create(config);
        // accept() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด IP ํ•„ํ„ฐ๋ง
        assertTrue(ipFilter.accept("1.2.3.4"));
        assertFalse(ipFilter.accept("101.102.103.104"));
    }
}

IP ํŒจํ„ด

Config ํด๋ž˜์Šค์˜ allow/deny ๋ฉ”์„œ๋“œ์—์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด ํŒจํ„ด:

  • IP: 1.2.3.4 (์ •ํ™•ํ•˜๊ฒŒ ์ผ์น˜)
  • ๋„คํŠธ์›Œํฌ ๋ฒ”์œ„: 1.1.1.64/26 (1.1.1.64 ~ 1.1.1.127) ** 64/26: 26์€ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ์˜ ๋น„ํŠธ ๊ธธ์ด
  • ์ „์ฒด: 1.2.3.*, 1.2.*, 1.*, *

ํ—ˆ์šฉ ๋จผ์ € ํ™•์ธ ์—ฌ๋ถ€

Config ๊ฐ์ฒด์˜ allowFirst ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด true์ผ ๊ฒฝ์šฐ, IpFilter๋Š” ํ—ˆ์šฉ IP์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋จผ์ € ํ™•์ธํ•˜๊ณ , ๊ทธ ๋‹ค์Œ์— ์ฐจ๋‹จ IP ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ์ฝ”๋“œ์—์„œ ipFilter.accept("1.2.3.4")๋Š” true๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

Config config = new Config();
config.setAllowFirst(true);
config.setDefaultAllow(false);
config.allow("1.2.3.4");
config.deny("1.2.3.*");
config.accept("1.2.3.4"); // true

allowFirst๊ฐ€ false๋ผ๋ฉด, ์ฐจ๋‹จ ๋ชฉ๋ก์„ ๋จผ์ € ๊ฒ€์‚ฌํ•˜๋ฏ€๋กœ config.accept("1.2.3.4")๋Š” false๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

๊ธฐ๋ณธ ํ—ˆ์šฉ ๊ฐ’

IpFilter์˜ accept() ๋ฉ”์„œ๋“œ๋Š” ๊ฒ€์‚ฌ ๋Œ€์ƒ IP๊ฐ€ allow/deny ๋ชฉ๋ก๊ณผ ๋งค์นญ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ defaultAllow์— ์ง€์ •ํ•œ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

Config config = new Config();
config.setAllowFirst(true);
config.setDefaultAllow(false);
config.allow("1.2.3.4");
config.deny("1.2.3.5");
config.accept("1.2.3.6"); // ์–ด๋–ค ์„ค์ •๋„ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ! ๋”ฐ๋ผ์„œ false ๋ฆฌํ„ด (defaultAllow๊ฐ€ false)

ip-filter-conf-parser

ip-filter-conf-parser๋Š” ๋ฌธ์ž์—ด์„ Config ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.

๋ฌธ๋ฒ•

์•„ํŒŒ์น˜ htaccess์™€ ๋น„์Šทํ•œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉ:

# ์ฃผ์„
order allow,deny
default true
allow from 1.2.3.4
allow from 1.2.3.* # ๋’ค์— ์ฃผ์„
deny from all

์‚ฌ์šฉ๋ฒ•

// ์‹ค์ œ๋กœ๋Š”, confValue ๋Œ€์‹  ํŒŒ์ผ ๊ฐ™์€ ๊ณณ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๊ฒƒ์ด๋‹ค.
String confValue =
        "order deny,allow\n" +
        "allow from 1.2.3.4\n" +
        "deny from 10.20.30.40\n" +
        "allow from 101.102.103.*\n" +
        "allow from 201.202.203.10/64";

Config config = new ConfParser().parse(confValue);

ip-filter-web-api

ip-filter-web-api๋Š” IP ์ฐจ๋‹จ ์œ„ํ•œ ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์ธ IpBlockFilter๋ฅผ ์ œ๊ณตํ•œ๋‹ค. IpBlockFilter๋Š” ํด๋ผ์ด์–ธํŠธ IP๊ฐ€ ์ฐจ๋‹จ IP์ธ ๊ฒฝ์šฐ 404 ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์ „์†กํ•œ๋‹ค.

ip-filter-web-simple ๋ชจ๋“ˆ ์‚ฌ์šฉ

ip-filter-web-simple์€ ip-filter-web-api ๋ชจ๋“ˆ์˜ ๊ตฌํ˜„์ฒด์ด๋‹ค. ์ด ๋ชจ๋“ˆ์€ ๊ฐ„๋‹จํ•œ ์„ค์ •์„ ์‚ฌ์šฉํ•œ๋‹ค.

Maven ์˜์กด

    <repositories>
        <!-- repository for ip-filter module -->
        <repository>
            <id>ip-filter-mvn-repo</id>
            <url>https://raw.github.com/madvirus/ip-filter/mvn-repo/</url>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </snapshots>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.chimi.ipfilter</groupId>
            <artifactId>ip-filter-web-api</artifactId>
            <version>0.2</version>
        </dependency>
        <dependency>
            <groupId>org.chimi.ipfilter</groupId>
            <artifactId>ip-filter-web-simple</artifactId>
            <version>0.2</version>
        </dependency>
        ...

์„ค์ • 1, web.xml ํŒŒ์ผ์— ์„ค์ • ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๊ธฐ

web.xml:

    <filter>
        <filter-name>ipBlockFilter</filter-name>
        <filter-class>org.chimi.ipfilter.web.IpBlockFilter</filter-class>
        <init-param>
            <param-name>type</param-name>
            <param-value>text</param-value>
        </init-param>
        <init-param>
            <param-name>value</param-name>
            <param-value>
                order allow,deny
                allow from 127.0.0.1
                deny from all
            </param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>ipBlockFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

์„ค์ • 2, ์™ธ๋ถ€ ์„ค์ • ํŒŒ์ผ ์‚ฌ์šฉํ•˜๊ธฐ

web.xml:

    <filter>
        <filter-name>ipBlockFilter</filter-name>
        <filter-class>org.chimi.ipfilter.web.IpBlockFilter</filter-class>
        <init-param>
            <param-name>type</param-name>
            <param-value>file</param-value>
        </init-param>
        <init-param>
            <param-name>value</param-name>
            <param-value>
                c:\somepath\access.conf
            </param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>ipBlockFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

access.conf:

order allow,deny
allow from 127.0.0.1
deny from all

์„ค์ • 3, ํด๋ž˜์ŠคํŒจ์Šค์˜ ์ž์› ํŒŒ์ผ ์‚ฌ์šฉํ•˜๊ธฐ

    <filter>
        <filter-name>ipBlockFilter</filter-name>
        <filter-class>org.chimi.ipfilter.web.IpBlockFilter</filter-class>
        <init-param>
            <param-name>type</param-name>
            <param-value>classpath</param-value>
        </init-param>
        <init-param>
            <param-name>value</param-name>
            <param-value>
                /org/chimi/config/access.conf
            </param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>ipBlockFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

์ปค์Šคํ…€ ip-filter-web-api ๊ตฌํ˜„ ๋งŒ๋“ค๊ธฐ

TODO

โš ๏ธ **GitHub.com Fallback** โš ๏ธ