iptables로 중국을 차단하십시오


10

방금 GitLab 서버에 로그인하여 서버를 마지막으로 확인한 후 거의 5 일 동안 로그인에 실패한 것으로 나타났습니다. 나는 IP를 확인했으며 거의 ​​모든 것이 중국 출신이며 SSH 및 Brute Force로 액세스하려고 시도한 것 같습니다. 나는 일부 IP를 차단하기 시작했지만 시간이 많이 걸리고 국가 전체를 차단하는 것이 더 좋은 아이디어라는 것을 깨달았습니다.

iptables로 모든 중국 또는 다른 국가를 차단할 수있는 방법이 있습니까?

인터넷에서 기사를 찾았지만 거의 모든 것이 bash 스크립트입니다. 저는 Linux의 초보자이므로 모든 스크립트를 실제로 이해하지 못합니다. 나는 iptables가 정말 흥미롭고 그것에 대해 더 많이 배우고 싶습니다.

어떤 아이디어? 감사합니다!


4
같은 문제를 다른 방식으로 해결했습니다. 비밀번호와 챌린지 기반 인증을 끄고 SSL 키로 로그인 만 허용하여 고객의 GitLab 서버에서 SSH를 강화했습니다. 어쩌면 그것은 당신의 상황에서 효과가 있습니까? IP 범위를 차단하면 "노이즈"가 줄어들 수 있지만 무차별 강제 실행을 방지 할 수는 없습니다.
blendenzo

지금까지는 효과가 없었습니다. gitlab 서버가 여전히 작동 중이며 0 침입했습니다. SSH 액세스는 ssh 키로 만 이루어지며 루트 로그인을 비활성화했습니다. 그것은 단지 내가 나쁜
itables

1
라우터에서 ssh를 기본 포트가 아닌 포트로 전환 할 수도 있습니다. 그것은 내 ssh 봇 공격 시도를 하루 수백에서 0으로 떨어 뜨 렸습니다.
유기농 대리석

답변:


7

iptables를 사용하여 recent모듈을 사용하여 ssh의 나쁜 사람을 자동으로 식별 한 후 차단할 수 있습니다 . 다음 세그먼트는 일반 라인 뒤에 와야합니다 ESTABLISHED,RELATED.

...
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT
...
# Secure Shell on port 22.
#
# Sometimes I uncomment the next line to simply disable external SSH access.
# Particulalry useful when I am rebooting often, thereby losing my current BADGUY table.
# $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 22 -j DROP

# Dynamic Badguy List. Detect and DROP Bad IPs that do password attacks on SSH.
# Once they are on the BADGUY list then DROP all packets from them.
# Sometimes make the lock time very long. Typically to try to get rid of coordinated attacks from China.
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
$IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT

이제 중국의 최근 (지난 1 년 또는 2 년) 문제는 매우 영리 해지고 한 IP 주소에서 차단 된 후에는 동일한 서브넷에서 다른 IP 주소로 간단히 전환하여 계속한다는 점입니다. 기본 최근 테이블 항목이 부족할 위험이 있습니다 (기본값은 200입니다). 이를 모니터링 한 다음 실제 IP 세그먼트를 찾아 전체 세그먼트를 영구적으로 차단합니다. 제 경우에는 담보 손해에 관심이 없습니다. 즉, 무고한 사람을 차단합니다.

#
# After a coordinated attack involving several sub-nets from China, they are now banned forever.
# List includes sub-nets from unknown origin, and perhaps Hong Kong
#
$IPTABLES -A INPUT -i $EXTIF -s 1.80.0.0/12 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.148.0.0/14 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.152.0.0/13 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.229.0.0/16 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.255.0.0/16 -d $UNIVERSE -j DROP
...

위의 위치 :

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
#
EXTIF="enp4s0"
INTIF="enp2s0"
EXTIP="...deleted..."
INTNET="192.168.111.0/24"
INTIP="192.168.111.1/32"
UNIVERSE="0.0.0.0/0"

중국 또는 모든 국가의 IP 주소 전체 목록을 iptables 또는 기타 형식으로 여기에서 얻을 수 있습니다 . 그러나 목록은 놀랍도록 길고 역동적입니다. 내 자신, 나는 전체 목록을 차단하지 않기로 결정했다.


이 ^! 내가받은 최고의 답변이 될 수 있습니다. 바보 같은 질문 일지 모르지만이 모든 규칙이 bash 스크립트에 들어가는 것 같습니다. 여전히 iptables를 이해하는 데 문제가 있지만 매혹적입니다.
Caranfil Alegzandru

예, bash 스크립트를 사용합니다. 일부도 사용했고 직접 iptables 복원 방법을 사용했는데로드 속도가 더 빠릅니다. 동일한 스크립트에 iptables가 아닌 명령을 포함시키기 때문에 변경되었습니다.
Doug Smythies

12

ipset을 사용하는 중국 블록

iptables에 수천 개의 IP 주소를 수동으로 추가 할 수 없으며 자동으로 수행하는 것조차 많은 CPU 부하를 일으킬 수 있기 때문에 나쁜 생각입니다. 대신 이런 종류의 것을 위해 설계된 ipset을 사용할 수 있습니다. ipset은 큰 IP 주소 목록을 처리합니다. 리스트를 생성 한 다음 규칙에서 해당리스트를 사용하도록 iptables에 지시합니다.

노트; 다음 전체가 루트로 수행되었다고 가정합니다. 시스템이 sudo를 기반으로하는 경우 적절하게 조정하십시오.

apt-get install ipset

다음으로 모든 작업을 수행하는 작은 Bash 스크립트를 작성했습니다.이 스크립트는 주석에서 이해할 수 있어야합니다. 파일을 작성하십시오.

nano /etc/block-china.sh

여기에 붙여 넣을 내용이 있습니다.

# Create the ipset list
ipset -N china hash:net

# remove any old list that might exist from previous runs of this script
rm cn.zone

# Pull the latest IP set for China
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone

# Add each IP address from the downloaded list into the ipset 'china'
for i in $(cat /etc/cn.zone ); do ipset -A china $i; done

# Restore iptables
/sbin/iptables-restore < /etc/iptables.firewall.rules

파일을 저장하십시오. 그것을 실행 가능하게 만드십시오 :

chmod +x /etc/block-china.sh

이 작업은 아직 수행되지 않았지만 스크립트를 실행하면 잠시 후에 완료됩니다. 먼저 위 스크립트에서 정의한이 새로운 ipset 목록을 참조하는 규칙을 iptables에 추가해야합니다.

nano /etc/iptables.firewall.rules

다음 줄을 추가하십시오.

-A INPUT -p tcp -m set --match-set china src -j DROP

파일을 저장하십시오. 분명히, 전체 iptables.firewall.rules는 다음과 같습니다.

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Block anything from China
# These rules are pulled from ipset's china list
# The source file is at /etc/cn.zone (which in turn is generated by a shell script at /etc/block-china.sh )
-A INPUT -p tcp -m set --match-set china src -j DROP

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

새로운 규칙이 적용되지 않았으므로 지금은 서버에서 변경된 것이 없습니다. 이렇게하려면 block-china.sh 스크립트를 실행하십시오.

/etc/block-china.sh

새로운 중국어 기반 IP 목록을 가져 오면 몇 가지 출력이 표시되고 몇 초 정도 지나면 완료되어 명령 프롬프트로 돌아갑니다.

작동하는지 테스트하려면 다음을 실행하십시오.

iptables -L

이제 중국을 차단하는 새로운 규칙이 보일 것입니다. 출력은 다음과 같아야합니다.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             loopback/8           reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
DROP       tcp  --  anywhere             anywhere             match-set china src
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     icmp --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

거의 끝났어! 이것은 작동하며 재부팅시 계속 작동합니다. 그러나 IP 주소가 변경되면 시간이 지남에 따라 목록이 오래됩니다. 업데이트 된 IP 목록을 가져와 적용하려면 block-china.sh 스크립트를 다시 실행하면됩니다.

크론 작업을 통해 자동으로 수행하도록 머신을 설정할 수도 있습니다.

crontab -e

다음과 같은 줄을 추가하십시오.

* 5 * * * /etc/block-china.sh

매일 오전 5시에 /etc/block-china.sh를 실행합니다. 스크립트를 실행하는 사용자는 루트이거나 루트 권한이 있어야합니다.

출처


왜 TCP 프로토콜로만 제한합니까? 프로토콜을 지정하지 않고 작동하는 것 같습니다. 훨씬 더 짧은 최신 집계 목록을 사용하는 것이 좋습니다.wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
Doug Smythies

재부팅 후 ipset을 복원하는 것은 없습니다.
Doug Smythies 2014

4

fail2ban과 같은 것을 설치하여 서버에 로그인하여 실패하는 IP를 차단할 수 있습니다.


csf 방화벽을 사용하고 구성 파일에서 원하는 모든 국가를 차단할 수도 있습니다. 문제는 내가 실제로 iptables를 사용하고 싶어서 그것에 대해 더 많이 배울 수 있다는 것입니다.
Caranfil Alegzandru

누가 차단해야하는지 파악하기 위해 어떤 국가에 어떤 IP 주소 블록이 할당되어 있는지 확인해야합니다. 그것이 매우 정확한지 확실하지 않습니다. iptables -L을 사용하여 현재 iptables 규칙을 표시하고 iptables-save를 사용하여 해당 규칙을 작성하기 위해 실행 된 명령을 표시 한 다음 자신의 규칙을 설계하고 테스트 머신을 사용하여 테스트 할 수 있습니다. 그것이 내가 배운 방법입니다.
Kyle H

0

iptables에 geoip-module을 사용할 수 있습니다 : https://linoxide.com/linux-how-to/block-ips-countries-geoip-addons/

시스템이 업그레이드되고 종속성이 설치되면 이제 xtables-addons를 시스템에 설치합니다. 이를 위해 wget을 사용하여 공식 xtables-addons 프로젝트 사이트 에서 최신 tarball을 다운로드합니다 . 다운로드가 완료되면 tarball을 추출한 다음 컴퓨터에서 컴파일하고 설치합니다.

wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.13.tar.xz
tar xf xtables-addons-2.13.tar.xz
cd xtables-addons-2.13
./configure
make
make install [...]

다음으로, MaxMind에서 GeoIP 데이터베이스를 다운로드하여로 인식되는 이진 형식으로 변환하는 xtables-addons 확장명과 함께 제공되는 xt_geoip이라는 모듈을 실행합니다 xt_geoip. 다운로드가 완료되면 빌드하고 필요한 xt_geoip경로 (예 :) 로 이동합니다 /usr/share/xt_geoip.

cd geoip
./xt_geoip_dl
./xt_geoip_build GeoIPCountryWhois.csv
mkdir -p /usr/share/xt_geoip/
cp -r {BE,LE} /usr/share/xt_geoip/

다음은 geoip 모듈과 함께 iptables를 사용하여 국가에서 발생하거나 목적지로 향하는 트래픽을 차단하는 기본 구문입니다. 여기에서는 국가 대신 두 자리 ISO3166 코드를 사용해야합니다 (예 : 미국의 경우 미국, 아일랜드의 경우 IE, 인도의 경우 IN, 중국의 경우 CN 등).

iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]

0

IP2Location 방화벽 목록 을 사용하여 중국의 iptables를 생성합니다.

파일 형식은 다음과 같습니다. 쉘에서 실행하면 모든 중국 IP 주소를 차단해야합니다.

iptables -A INPUT -s 8.8.8.8/24 -j DROP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.