• dDos 공격 route 방어 기술

    dDos 공격 route 방어 기술

    dDos 공격

    제일 아까운 기술 중 하나라고 보는 dDos 공격 기술은 좋은 의미로는 서버를 해킹까지하여 지식의 과시라고 볼 수 있지만

    실제로 지금 시대에서 상대의 서버를 공격한다는 것은 악의적인 측면만 보더라도 너무 나쁜 행위이다.

    dDos 공격을 막기 위해 해야할 부분은 방화벽 부분인데 대부분 iptable을 이용하여 아이피를 차단하는 경우가 많다.

    나 역시 따로 방화벽 장비를 구성하지않다보니 AWS 유료서비스보다는 단순 무식한 route 명령어로 ip를 차단하는 방법을 주로 사용한다.

    이 방법은 서버를 직접 운영할 경우에 route명령어를 apache 계정으로 실행 할 수 있을때 가능하다.

    아파치 권한을 우선 visudo 설정에 넣는다

    www-data 계정이라면

    www-data ALL=(ALL) NOPASSWD: /sbin/route

    apache 계정이라면

    apache ALL=(ALL) NOPASSWD: /sbin/route

    이렇게 입력한다.

    그리고 워드프레스에서 명령어를 아래처럼 넣으면 된다.
    $cmd = “sudo /sbin/route add -host $ip reject”;
    shell_exec($cmd);

    워드프레스 스니핏 자동화

    이를 워드프레스에서 스니핏을 이용하여 자동화시키는 방법은 아래와같다

    // 아래 링크를 통해 사용방법을 꼭 확인하고 사용하세요!! - 프로그래머 문호영
    // https://snippets.stofarm.com/iptables
    
    // 최상단에서 차단될 접근 횟수와 접근 제어할 페이지 리스트 설정
    define('MAX_ACCESS_COUNT', 20);
    define('BLOCKED_URLS', serialize(array('/', '/xmlrpc.php', '//xmlrpc.php', '/wp-admin/admin.php')));
    
    
    function should_block_ip($ip) {
        $access_count = get_transient('access_count_' . $ip) ?: 0;
        if ($access_count >= MAX_ACCESS_COUNT) {
            return true;
        }
        return false;
    }
    
    function block_ip_with_route($ip) {
        $cmd = "sudo /sbin/route add -host $ip reject";
        shell_exec($cmd);
    }
    
    function unblock_ip_with_route($ip) {
        $cmd = "sudo /sbin/route del -host $ip reject";
        shell_exec($cmd);
    }
    
    function check_and_block_ip() {
        $client_ip = $_SERVER['REMOTE_ADDR'];
        $current_url = $_SERVER['REQUEST_URI'];
    
        $blocked_urls = unserialize(BLOCKED_URLS);
    
        if (in_array($current_url, $blocked_urls) || is_404()) {
            $access_count = get_transient('access_count_' . $client_ip) ?: 0;
            set_transient('access_count_' . $client_ip, ++$access_count, 60); // 1분 동안 저장
    
            if (should_block_ip($client_ip)) {
                block_ip_with_route($client_ip);
    			header("Location: https://snippets.stofarm.com/from_iptables");
                wp_die('Your IP has been blocked.'); 
            }
        }
    }
    
    add_action('init', 'check_and_block_ip');

    이 코드를 이용할 경우 1분동안 20회 공격이 들어오면 자동으로 IP가 차단되게 된다.