중국을 차단하고 다시 시작한 후에도 차단 상태를 유지하는 방법은 무엇입니까? 실행 중 발생한 문제

중국을 차단하고 다시 시작한 후에도 차단 상태를 유지하는 방법은 무엇입니까? 실행 중 발생한 문제

나는 사용하려고이 솔루션.

저는 Centos 7과 iptables v1.4.21을 실행하고 있습니다.

왜 필요한가요? 여러 개의 WordPress 블로그가 있습니다. 저는 매일 4,000~20,000건의 무차별 로그인, 존재하지 않는 파일, 나중에 악용하기 위해 취약한 플러그인과 파일을 찾으려는 자동화된 시도를 받습니다. 그들은 모두 중국 출신입니다. 다른 나라도 있지만 하루에 1,000명 미만입니다. 따라서 하드웨어 리소스를 절약하기 위해 보안에 대한 도움을 제공하고 이러한 요청이 웹 서버나 PHP 엔진에 도달하기 전에 차단하고 싶습니다. Security StackExchange에 질문을 하려고 했는데 여기가 더 나은 것 같아요. 하지만 모르겠어요. 중복 질문을 피하고 싶습니다.

내 스크립트는 다음과 같습니다

# 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/sysconfig/iptables

규칙 파일은 다음과 같습니다(공백 없음, 새 줄 없음).

[root@myserver etc]# cat /etc/sysconfig/iptables
-A INPUT -p tcp -m set --match-set china src -j DROP
[root@myserver etc]#

스크립트를 실행하면 다음 오류가 발생합니다.

ipset v7.1: Element cannot be added to the set: it's already added
ipset v7.1: Element cannot be added to the set: it's already added
ipset v7.1: Element cannot be added to the set: it's already added
ipset v7.1: Element cannot be added to the set: it's already added
(a plenty of the same lines)

여기에 두세 가지 질문이 있습니다.

  • IPset에 IP를 추가하면 해당 IP가 이미 존재합니다. 중국 블랙리스트에서 모든 IP를 제거하려면 스크립트 시작 부분에 뭔가를 추가하는 것이 더 좋지 않을까요?
  • 그렇다면 어떻게 해야 합니까?
  • 다시 시작한 후 ipset을 복원하는 방법은 무엇입니까? 어쩌면 시작할 때 동일한 스크립트를 실행해야 할까요?

이것을 추가한 후에 이것을 보았습니다. 이것은 괜찮아 보이지만 여전히 위의 문제를 해결하고 싶습니다.

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       tcp  --  anywhere             anywhere             match-set china src

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

답변1

ipsetswap두 세트 ( 또는 -W) 를 자동으로 교환하는 하위 명령이 있습니다 . 이를 통해 새 세트를 채우고 이전 세트로 교체할 수 있으며 이제 쓸모 없는 세트를 새 이름으로 삭제할 수 있습니다. ipset flush china이는 시스템을 일시적으로 노출하고 삭제하지 않고도 컬렉션을 다른 매개변수로 교체할 수 있으므로 컬렉션을 새로 고치는 것( 사용)보다 낫습니다.iptables참조 규칙(참조되는 동안에는 컬렉션을 삭제할 수 없으므로) 나도 전환 중이야IP 세트최신 구문. 최근에 유지된 유일한 구문입니다.맨페이지(두 구문 모두 유효합니다.)

# -exist for idempotence: don't trigger an error the 2nd time this script is run
ipset -exist create china hash:net

# old cn.zone will stay around if download fails
wget -O /etc/cn.zone.tmp http://www.ipdeny.com/ipblocks/data/countries/cn.zone && \
    mv /etc/cn.zone.tmp /etc/cn.zone

ipset create china.tmp hash:net
sed 's/^/add china.tmp /' /etc/cn.zone | ipset -exist restore   
ipset swap china china.tmp # new set atomically replaces older set
ipset destroy china.tmp

/sbin/iptables-restore < /etc/sysconfig/iptables

루프를 (올바른 형식의 입력)로 교체하면 ipset -exist restore항목 로딩이 두 배로 향상되었습니다(여기서 루프 테스트는 약 6초에서 약 0.06초로 단축되었습니다). -exist여기서 입력 목록 자체에 중복이 포함된 경우 이를 무시하고 항목 로드 시 조기 중단을 방지합니다. 입력 목록에 구문 분석할 수 없는 콘텐츠가 있을 수 있다고 생각되면 이를 필터링하여 구문 분석 가능하도록 만들거나(예: 빈 줄 제거) 루프로 되돌릴 수 있지만 다음과 같은 구조를 for사용하는 것이 더 좋습니다 .while read

while read net; do
    ipset -exist add china.tmp "$net"
done < /etc/cn.zone

iptables-restore현재 스크립트에 머물거나 별도의 스크립트(iptables 규칙은 생성된 세트에 따라 달라지므로 현재 스크립트에 따라 다름)에 넣어 세트 업데이트 기능과 iptables 규칙 업데이트 기능을 별도로 유지할 수 있습니다.

스크립트가 더욱 개선될 수 있다고 확신합니다(특히 cn.zone전체 결과에 영향을 미치지 않더라도 시작 시 실패할 것으로 예상되는 파일 로드. 아마도 이 부분도 분리되어야 할 것입니다).

답변2

이 작업을 수행

# IPSET BLOCKZONE (select country to block and ip/range) ###
# http://www.ipdeny.com/ipblocks/
ipset=/usr/sbin/ipset
iptables=/usr/sbin/iptables
zone=/path_to_folder/zones
if [ ! -d $zone ]; then mkdir -p $zone; fi

$ipset flush blockzone
$ipset -N -! blockzone hash:net maxelem 1000000
for ip in $(cat $zone/{cn,ru}.zone /path_to/blackip.txt); do
    $ipset -A blockzone $ip
done
$iptables -t mangle -A PREROUTING -m set --match-set blockzone src -j NFLOG --nflog-prefix 'Blockzone'
$iptables -t mangle -A PREROUTING -m set --match-set blockzone src -j DROP
$iptables -A INPUT -m set --match-set blockzone dst -j NFLOG --nflog-prefix 'Blockzone'
$iptables -A INPUT -m set --match-set blockzone dst -j DROP
$iptables -A FORWARD -m set --match-set blockzone dst -j NFLOG --nflog-prefix 'Blockzone'
$iptables -A FORWARD -m set --match-set blockzone dst -j DROP

원천:블랙풀

관련 정보