반응형

최근 관련 게시글 중 /usr/local/bin/sshfilter.sh의 코드 문제로 인해 해외 ip 차단 및 정상적인 ssh 접속이 작동하지 않는  경우가 있습니다.

/var/log/syslog에서 아래 로그와 같이 문제가 생겨 ssh 원격 접속이 되지 않는 분들은 바로 2번으로 넘어가 shell script만변경하면 됩니다.


 

ssh를 세팅하다 보면 보안 세팅으로 해외 ip 차단이 필요하다. 하루에도 수십번씩 해외에서 무작위로 ip에 접근을 시도하고 있기 때문이다. 마침 Ubuntu 24.04 버전을 서버에 새로 설치한 터라 새로운 버전을 체험할 겸 ssh 보안 세팅을 헤주기로 했다.

 

목차

1. GeoIP Country Database 설치

2. Shell Script 작성 !인터넷에 올라와있는 코드 오류 수정!

3. SSH 잠금 설정

4. 정상 작동 테스트

5. GEOIP의 주기적 UPDATE

 

1. GeoIP Country Database 설치

ip 구분을 위해 geoiplookup 명령어와 GeoIP country database를 설치한다.

sudo apt-get install geoip-bin geoip-database

 

명령어를 입력하여 작동하는지 테스트

geoiplookup 8.8.8.8

GeoIP Country Edition: US, United States가 나오면 정상 작동하는 것이다.

 

2. Shell Script 작성

sudo vi /usr/local/bin/sshfilter.sh

/usr/local/bin/sshfilter.sh 에 아래 내용을 입력하고 저장한다.

#!/bin/bash

ALLOW_COUNTRIES="KR"

if [ $# -ne 1 ]; then
  echo "Usage: `basename $0` <ip>" 1>&2
  exit 1
fi

IP=$1

# IPv6 주소 IPv4 주소로 변환
if [[ $IP =~ ^::ffff: ]]; then
  IP=$(echo $IP | sed 's/^::ffff://')
fi

COUNTRY=$(/usr/bin/geoiplookup $IP | awk -F ": " '{ print $2 }' | awk -F "," '{ print $1 }' | head -n 1)

if [ "$COUNTRY" = "IP Address not found" ] || [[ $ALLOW_COUNTRIES =~ $COUNTRY ]]; then
  exit 0
else
  logger "DENY sshd connection from $IP ($COUNTRY)"
  exit 1
fi


!! 기존의 코드는 ipv6에선 정상작동하지 않는 오류가 있어서

ipv6에서 ipv4로 변경해주는 코드를 추가하였다 !!

 

 

 

 


소유권과 실행 권한을 변경해준다.

sudo chown root:root /usr/local/bin/sshfilter.sh
sudo chmod 775 /usr/local/bin/sshfilter.sh

 

3. SSH 잠금 설정

sudo vi /etc/hosts.deny

아래 내용 새로 추가

sshd: ALL
sudo vi /etc/hosts.allow
sshd: ALL: aclexec /usr/local/bin/sshfilter.sh %a

간단하게 설명을 하자면 hosts.deny로 기본적으로 모든 접속을 허용하지 않도록 하되, hosts.allow를 통해 원하는 ip만 접속을 허용시켜줬다. 이 때 접속을 허용 ip는 sshfilter.sh를 통해 구분해줬다.

 4. 정상 작동 테스트

/usr/local/bin/sshfilter.sh 8.8.8.8
sudo vi /var/log/syslog

ctrl+End를 통해 맨 아래 DENY sshd connection from 8.8.8.8 (US)가 있으면 정상 작동 중인 것이다.

 

5. GEOIP의 주기적 UPDATE

주기적으로 ip를 업데이트 해주는 파일 생성한다.

sudo vi /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

여기까지 문제가 없다면 ssh 보안 세팅인 해외 ip 차단은 끝이다.

 

reference

[1]

 

우분투 해외ip ssh차단

우분투에서 해외ip ssh접속을 차단하기. 1. GEOIP DATABASE 설치 geoiplookup 명령어와 GeoIP country (free) database를 설치합니다. $ sudo apt-get install geoip-bin geoip-database 잘 설치 되었는지 다음과 같이 테스트를

shutcoding.tistory.com

반응형

+ Recent posts