리눅스

우분투 해외ip ssh차단

닥치고개돌 2020. 3. 10. 15:59
728x90

우분투에서 해외ip ssh접속을 차단하기.

 

 

1. GEOIP DATABASE 설치

geoiplookup 명령어와 GeoIP country (free) database를 설치합니다.

 

$ sudo apt-get install geoip-bin geoip-database

 

잘 설치 되었는지 다음과 같이 테스트를 해본다.


$ geoiplookup 8.8.8.8

GeoIP Country Edition: US, United States

 

위와같이 US, United States 가 출력된다.

 

 

2. SHELL SCRIPT 작성

 

이 Shell Script는 접속자의 ip 주소를 GeoIP database와 비교하여 접속지역이 KR인지 유무에 따라 ALLOW와 DENY를 리턴해준다. 또한 이러한 메세지를 logger를 이용해서 log파일(/var/log/syslog)에 기록이 되도록 한다.

 

이 파일은 /usr/local/bin/sshfilter.sh로 만들면 된다.

 

 

#!/bin/bash
 
# UPPERCASE space-separated country codes to ACCEPT
ALLOW_COUNTRIES="KR"
 
if [ $# -ne 1 ]; then
  echo "Usage:  `basename $0` <ip>" 1>&2
  exit 0 # return true in case of config issue
fi
 
COUNTRY=`/usr/bin/geoiplookup $1 | awk -F ": " '{ print $2 }' | awk -F "," '{ print $1 }' | head -n 1`
 
[[ $COUNTRY = "IP Address not found" || $ALLOW_COUNTRIES =~ $COUNTRY ]] && RESPONSE="ALLOW" || RESPONSE="DENY"
 
if [ $RESPONSE = "ALLOW" ]
then
  exit 0
else
  logger "$RESPONSE sshd connection from $1 ($COUNTRY)"
  exit 1
fi

Script의 실행권한도 잊지말고 지정해주자.

 

$ sudo chown root.root /usr/local/bin/sshfilter.sh

$ sudo chmod 775 /usr/local/bin/sshfilter.sh

 

3. SSH 잠금설정

/etc/hosts.deny 파일에 다음과 같은 라인을 추가합니다.

 

sshd: ALL

 

그리고 /etc/hosts.allow 파일에도 다음과 같은 라인을 추가합니다.

sshd: ALL: aclexec /usr/local/bin/sshfilter.sh %a

 

 

4. 제대로 작동하는지 TEST 하기

위에서 테스트 했던 US ip를 가지고 테스트 해보도록 한다.

 

/usr/local/bin/sshfilter.sh 8.8.8.8

KR(한국) 아이피만 접속을 허용하도록 했으므로 DENY 메세지가 나와야 정상이다.
다음 메세지는 /var/log/syslog 에서 볼 수 있다.

 

Aug 13 17:02:37 pi root: DENY sshd connection from 8.8.8.8 (US)

 

 

5. GEOIP의 주기적 UPDATE

 

/etc/cron.monthly/updatingGeoIP 라는 파일을 만들어서 다음과 같은 내용을 작성해준다.

#!/bin/bash



cd /tmp

wget -q http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

if [ -f GeoIP.dat.gz ]

then

    gzip -d GeoIP.dat.gz

    rm -f /usr/share/GeoIP/GeoIP.dat

    mv -f GeoIP.dat /usr/share/GeoIP/GeoIP.dat

else

    echo "The GeoIP library could not be downloaded and updated"

fi

이외에도 Fail2ban 이라는 패키지도 설치해서 3회이상 접속시도를 할때에는 일정시간 이상 접속을 아예 허용치 않고 Ban을 시키고 있습니다. ssh의 기본 포트번호를 바꾼다거나 하는 방법도 괜찮은 방법이라고 생각됩니다

 

728x90