Category: Mikrotik

  • AbuselPDB로 신고하기

    nginx의 error.log 에 있는 ip 접근은 raw filter를 이용해서 효과적으로 걸러지고 있는 것 같다.

    abuselPDB에 이 ip를 신고하는 과정을 구현했다. 역시 코파일럿 도움으로 말이다.

    아래가 샘플 코드이다.

    # POST the submission.
    curl https://api.abuseipdb.com/api/v2/report \
      --data-urlencode "ip=127.0.0.1" \
      -d categories=18,22 \
      --data-urlencode "comment=SSH login attempts with user root." \
      --data-urlencode "timestamp=2023-10-18T11:25:11-04:00" \
      -H "Key: YOUR_OWN_API_KEY" \
      -H "Accept: application/json"

    python에서 하기 위해 다음과 같이 한다.

    url = "https://api.abuseipdb.com/api/v2/report"
    headers = {
    	"Key": abuseipdb_key,
    	"Accept": "application/json"
    }
    data = {
    	"categories": "19"
    }
    params = {
    	"ip": input_ip,
    	"comment": "SSL_do_handshake() failed"
    }
    response = requests.post(url, headers=headers, data=data, params=params)
  • firewall, raw chain

    블로그로 들어오는 요청 중 SSL 인증서 오류를 발생하는 IP를 차단하고 싶었다.

    코파일럿에게 물어본 첫 번째 방법은 동작하지 않았다. 두 번째 방법으로 실행해 보았다.

    첫 번째 단계는 mikrotik 에서 사용하는 명령어를 이용해서 특정 IP 목록을 등록하는 것이다.

    /ip firewall address-list add list=blocked address=5.34.178.101

    이런 형식으로 파일을 생성한다. 그리고 이 파일을 서버에 올려둔다.

    mikrotik에서 파일을 다운 받는다.

    /tool fetch url="https://www.welovedoctor.com/files/blocklists.txt" dst-path=blocklists.txt

    mikrotik에서 blocked로 등록된 주소가 있으면 삭제한다.

    /ip firewall address-list remove [find list=blocked]

    address-list에 추가 시킨다.

    /import file-name=blocklists.txt

    mikrotik 에서 raw 체인을 이용해서 차단해 준다. raw를 이용하면 가장 먼저 실행하여 부담을 줄여주는 효과가 있다고 한다.

    /ip firewall raw add chain=prerouting src-address-list=blocked action=drop comment="Drop before connection tracking"
  • unset

    미크로틱 CLI 로 설정을 변경할 때에는 두 가지 방법이 있다. set을 이용하거나 edit를 이용하는 것이다. 기존에 입력된 값을 지울 때에는 “”를 이용하거나 빈 값을 입력할 수 있다. unset 명령어를 지원하는 경우라면 unset을 이용하면 해당 값을 지울 수 있다.

    아래와 같이 하면 11번째 규칙의 protocol을 udp로 설정할 수 있다.

    /ip firewall filter set 11 protocol=udp

    그런데 protocol과 상관없이 모든 경우에 적용하고 싶을 때에는 다음과 같이 unset을 이용한다.

    /ip firewall filter unset 11 protocol
  • pseudo API

    집 서버는 데비안으로 운영된다. 오랜 기간동안 재부팅을 하지 않아도 잘 동작한다. 그런데 너무 안하면 설정이 꼬이는 경우가 생긴 적이 있다. 그래서 주기적으로 재부팅을 한다. 재부팅 할 때 마다 beep이 난다. 소리를 끄는 것 보다 집에 사람이 없을 때 재부팅을 하는 쪽으로 시도해 보기로 했다.

    외출할 때 항상 휴대폰을 들고 나간다. 우리 집은 스마트폰을 항상 WIFI가 켜져 있다. 공유기에서 충분한 거리가 멀어지면 연결이 끊어지고 DHCP 에 이것이 반영된다. 미크로틱 DHCP 서버가 특정 MAC에 대하여 어떤 상태인지를 알기 위한 명령어는 다음과 같다.

    /ip dhcp-server lease print where mac-address=98:C8:54:21:19:A6

    결과는 다음과 같다.

    이 대로 처리를 해도 된다. 그런데 자신이 없으므로 다음과 같이 as-value라는 명령어를 넣어주면 결과를 묶어서 볼 수 있다. 그런데 이렇게만 하면 결과가 보이지 않는다. 그래서 앞에 명령어를 더 입력한다.

    :put [/ip dhcp-server lease print as-value where mac-address=98:C8:54:21:19:A6]

    결과는 다음과 같다.

    .id=*d3;address=192.168.88.165;comment=SY;last-seen=4h35m36s;mac-address=98:C8:54:21:19:A6;server=dhcp1;status=waiting

    DHCP 서버가 특정 MAC에 IP를 할당하면 status에 bound가 그렇지 않으면 waiting 으로 출력된다. 위에서 보면 알 수 있듯이 status가 가장 마지막 항목으로 출력된다. 그래서 글자를 나눈 다음 뒤에서 첫 번째 것을 선택하여 판단 기준으로 삼는다.

    import subprocess
    
    command = 'sshpass -p 820958 ssh -p 2222 admin@router.lan ":put [/ip dhcp-server lease print as-value where mac-address=9C:25:95:19:7B:D7]"'
    result = subprocess.check_output(command, shell=True, text=True)
    result = result.strip()
    result = result.split('status=')[-1]