일단 nginx가 설치되어 있다는 것을 가정한다. nginx의 기본 설정 파일을 vim이던 원하는 편집기로 연다.
보통은 경로가/etc/nginx/nginx.conf일거다. 물론 보안을 생각하면 다른 장소로 옮겨둔 사람도 있겠지만...
이 conf파일에 작성해도 좋지만 나 같은 경우 따로 빼뒀다.
http {
## Some Config
## 별도 경로로 빼둔 설정파일들
include /home/mymy/nginx/ip-block-list.conf; #ip block
include /home/mymy/nginx/hack_word.conf; #Hack word
include /home/mymy/nginx/ip-range-block-list.conf; #ip range block
}
저 설정파일들은 nginx에서 사용할 변수를 만들어 둔 파일들이다. 그리고 저 설정파일들은 아래서 더 자세하게 설명하겠다.
상단에 geo를 적고 **$**표시가 변수 이름이다. 그리고 안에 값은 밴 시킬 ip는 1을 주고, 그 외는 허용하려 하기에 0을 줬다.
여기까지 하고 되면 참 좋겠지만... 이제 몇 가지 설정이 남았다.
다시 nginx.conf 파일을 열거나 자신의 서비스에 맞는 설정을 빼뒀으면 그 config를 열어준다.
server {
#기본 설정
listen 80;
listen [::]:80;
root /var/www/html;
server_name bcow.world;
#Ban black ip
if ($bad_ip) { return 444; }
#Ban ip range
if ($bad_ip_range) { return 444; }
#특정 url 패턴을 거부
if ($bad_word = 1) { return 444; }
underscores_in_headers on; #1. 언더형식의 헤더를 허용 합니다.
#실제 사용 처리
location / {
proxy_set_header Range $saferange;
proxy_pass http://localhost:11122334;
proxy_pass_request_headers on; ## 요청 헤더 바로 전달
}
}
설정을 저렇게 해주면 된다. if ($bad_ip) { return 444; }이 설정으로 인해, 해당 IP는 444응답... 즉 아무 응답도 못받고 죽은 서버라는 응답을 받게 된다.
만약 특정 Ip 영역대를 밴 시키고 싶다면?
IP Class로 막기
IP는 알다시피 A클래스, B클래스, C클래스 영역으로 나눠져있다. 그리고 서브넷 등등...
자세한 건 네트워크 쪽 찾아보거나 시스코의 CCNA 자격증 공부하면 줄기차게 나온다. 무튼...
이번엔 위에서 설명된ip-range-block-list.conf설정을 열람해보자
geo $bad_ip_range {
# A
103.0.0.0/8 1; #VN-21-11-29
185.0.0.0/8 1; #DE-21-12-27
# B
5.161.0.0/16 1; #22-01-02
45.83.0.0/16 1; #log4j
# C
77.111.247.0/24 1; #NO-21-12-16
167.172.62.0/24 1; #22-01-02
default 0;
}
얘도 아까 단일 Ip랑 같은 설정을 가진다. 단지 A클래스일 경우 앞 대역 주소를 적고 나머진 0.0.0 즉 해당 네트워크 주소(시작 주소)를 적어둔다.
그리고 뒤에 서브넷을 입력한다. A클래스니까 당연 서브넷은 8이다.
B랑 C는 A랑 같기에 설명은 생략한다.
무튼 이것도 변수를 선언하고 메인 설정에서 단일 Ip 밴시키듯 아래 설정을 두면 된다.
#Ban ip range
if ($bad_ip_range) { return 444; }
근데 이 블록 Ip는 잘보고 막자. 가끔 B클래스가 같은거 같아서 막 막다보면 엄한 영역도 막을 수 있다.
그래서 ip조회 서비스 등을 조회해서 대상 B클래스 주소가 같은 지역 같은 호스트, 비슷한 것 같으면 그 때 막는게 좋다.
이건IP-API사이트에서 조회한 것인데 저렇게 밑에 hosting이라 되어 있으면 일단 막는게 좋다. 그리고 사진에 나온 것처럼 미국인데 asname이 텐센트...
구글은 81 포트는 서비스 하지 않아 fail이 발생하는 것을 확인할 수 있습니다. 실패하더라도 친절하게 ping 테스트는 성공했다는 것도 보여주네요.
파워쉘 스크립트 작성
파워쉘 커맨드 창에서 직접 확인만 한다면 여기까지만 할 수 있어도 문제는 없을것 같습니다만,
저희의 목적은 파워쉘을 통해 관리업무를 자동화시켜 수작업을 최대한 줄이는 것입니다.
서버가 수십대가 있고, 서버마다 확인이 필요한 포트가 여러 개가 있을 경우 모든 포트마다 이 명령을 수행하는 것은 비 효율적일테니까요.
이를 위해서는 하나의 명령을 사용하는 파워쉘 커맨드에서 파워쉘 스크립트를 작성할 줄 알아야 합니다.
제 개인적으로도 파워쉘을 사용해서 Windows 계열의 서버를 잘 관리하려면 스크립트를 작성할 수 있어야 많은 도움이 된다고 생각합니다.
단순히 파워쉘 명령(cmdlet)만으로 충분하고 자동화까지 할 필요가 없다면 아래 내용은 읽지 않으셔도 됩니다.
관리할 서버가 여러 대라고 가정하면 각 서버들의 ip 혹은 DNS 명을 미리 다른 파일에 등록해 두는 것이 좋습니다.
관리대상 서버가 추가 혹은 삭제되면 이 목록만 변경해주면 되니까요....저는 그렇게 사용합니다.
아래 처럼 2대의 서버와 포트를 ";"(구분자는 다른 것으로 해도 무방합니다.)로 구분한 쌍으로 묶어 서버 목록 파일을 만들어서 별도의 serverlist.txt 파일로 저장합니다. (추후 파워쉘 스크립트 파일에서 이 목록파일(serverlist.txt)을 읽어 올 예정입니다.)