편집하다:
때때로 해결책을 찾고자 하는 충동이 느리지만 꾸준하게 해결책을 향해 나아가게 하는 데 충분하다는 것은 놀라운 일입니다. 또한, 명확하게 하기 위해 내 질문을 더 자주 다시 읽을수록 이 "질문"이 '간단한' 질문의 범위나 이 커뮤니티에서 답변을 얻는 아이디어의 범위를 훨씬 넘어선다는 것을 깨달았습니다.
나는 iptables의 운영 개념을 점점 더 많이 이해함에 따라 다음 시간 내에 이 질문의 구조를 다시 정리할 것입니다. 또한 이해 과정에서 제가 곧 이 커뮤니티에 제공하고 이 질문에 연결할 좀 더 구체적인 질문이 탄생했습니다.
간단히 말해서: 내 문제는 다음과 같은 올바른 규칙 집합을 찾는 것입니다.
- 나만의 규칙
- 실패2금지
- 추가 DNS 블랙리스트는 함께 작동하지만 "내 규칙"은 내 국가를 ssh에 대해 화이트리스트에 추가하여 ssh에 대해 다른 모든 국가를 차단하는 것을 의미합니다.하지만허용모두블랙리스트에 포함된 항목 집합을 제외하고 DNS 쿼리에 대한 국가/범위/IP입니다.
숫자로:
- SSH의 경우: 화이트리스트 50개 범위또는블랙리스트 약. 620,000개 범위(ipdeny.com 등을 통해 구성)
- DNS에 대한 블랙리스트 항목: 약. 140 (u32 규칙 세트,스크립트)
- 추가 서비스에 대한 25+/- 규칙(아래 참조)
가사 버전: 내 요구 사항에 맞는 솔루션을 구현하는 데 어려움을 겪고 있습니다. 시나리오는 다음과 같습니다. (지금은 DNS로 가정) 서버가 있습니다. 바인딩 ssh 외에도 sendmail, https 및 munin을 고려해야 합니다.
이것은 일반적으로 달성하기 쉬웠습니다. 또한 저는 전 세계의 (d)dos 공격에 직면하면서 Fail2ban을 설치했습니다. 나의 주요 목표는 서버를 최대한 잠그는 것이었습니다.
내 생각은 내가 액세스할 수 있는 ISP(예: DSL 및 모바일)의 가능한 동적 DNS 할당과 일치하는 내 국가의 일부 IP 범위만 화이트리스트에 추가하는 것이었습니다. 그렇게 하면 나 자신을 가둬두지 않을 거예요.
내 ISP의 모든 네트 범위를 조회한 결과 다음 스크립트/규칙 세트가 생성되었습니다.
#ports:
# 22: SSH (#4,#5) (ssh)
# 25: SMTP (#20) (outgoing, sendmail for f2b report)
# 53: DNS (!!#16!! see end of #16 as differs for ns1&2) (outgoing, bind)
# 443: HTTPS (#10) (outgoing, dns-blacklist update)
#4949: munin (#26) (outgoing, sending client stats to server)
# Modify this file accordingly for your specific requirement.
# http://www.thegeekstuff.com: http://www.thegeekstuff.com/scripts/iptables-rules
# 1. Delete all existing rules
#iptables -F
# 2. Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# 4. Allow ALL incoming SSH
#iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth1 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 5. Allow incoming SSH only from a sepcific network (kabelBW/Unitymedia, Telekom, Accelerated)
# note: Using '-I' instead of '-A' to insert to top of INPUT chain to put rule in front of fail2ban!
iptables -A INPUT -i eth0 -p tcp -s 5.10.48.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.10.160.0/19 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.56.176.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.56.192.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.146.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.158.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 24.134.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 31.16.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.4.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.24.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.49.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.114.96.0/19 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.201.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.209.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.5.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.223.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.237.192.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.252.128.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 62.143.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 77.20.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 78.42.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 78.94.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 80.69.96.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 81.210.128.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 82.211.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 82.212.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 83.169.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 84.200.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 84.201.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 85.216.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 88.134.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 88.152.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 91.64.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 91.89.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 92.50.64.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 94.79.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.88.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.208.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.222.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 109.90.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 109.192.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 130.180.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 134.3.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 146.52.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 149.172.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 176.198.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 178.24.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 178.200.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 188.192.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 217.8.48.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
service fail2ban restart
# 10. Allow outgoing HTTPS
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
# 12. Ping from inside to outside
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# 13. Ping from outside to inside
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
# 14. Allow loopback access
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 16. Allow outbound DNS
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
#Allow inbound DNS
iptables -A INPUT -p udp -s 0/0 --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -s 0/0 --sport 53 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -d 0/0 --dport 53 -m state --state ESTABLISHED -j ACCEPT
# 20. Allow Sendmail or Postfix
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
# 26. Allow Munin Stats
iptables -A INPUT -p tcp --dport 4949 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 4949 -j ACCEPT
service munin-node restart
sh /root/update_domain_blacklist.sh
규칙 세트 #10 전에 failure2ban을 다시 시작하는 것은 iptable에서 제거된 후 체인이 올바르게 (재)설정되었는지 확인하는 것입니다(스크립트 시작 부분에서 -F로 플러시됨). 그렇지 않은 경우 서버에 연결할 수 없다고 불평하는 munin에도 동일하게 적용됩니다. 예외 규칙을 적용한 후 다시 시작됩니다).
/etc/rc.local을 통해 규칙을 적용하려고 합니다. 이는 Fail2ban 및 munin에 대한 체인이 이미 생성되었음을 의미합니다.
내가 달성하고 싶은 방화벽 검사 흐름은 다음과 같습니다. 요청이 DNS입니까? -> (a); 쉿? -> (b); 내 다른 서비스 중 하나? -> (다); 다른 건 없어? -> (디):
- (a): 블랙리스트에 등록되지 않은 경우 DNS 블랙리스트 스크립트 제공
- (b): 블랙리스트에 등록되지 않은 경우 또는 내 네트 범위 설정에 따라 화이트리스트에 등록된 경우 제공
- (c): 내가 정의한 규칙에 따라 서브하세요.
- (d): DROP/TARPIT/모든 모범 사례
- (b)인 경우 추가로 Fail2ban을 전달합니다.
문제위의 규칙에 따라:
- fall2ban은 화이트리스트 확인 전에 시작됩니다 -좋은내 SSH 부분의 경우나쁜내 DNS 부분: 내 추측
그런 다음 ipset을 사용하여 50개 범위를 제외한 "전 세계"를 차단/블랙리스트에 추가하려고 했습니다. 이론적으로는 가능하지만 620k 범위의 구문 분석은 10분 이상 지속됩니다. 작업을 취소하고 화이트리스트 범위로 돌아갔습니다. 다음 아이디어: 여전히 50개 범위에 대해 ipset을 사용하고 50개 범위를 차단/블랙리스트에 추가역SSH에 대한 해당 목록:
!/bin/bash
#Script to process ip ranges to ban using IPSet and IPTables
# 10. Allow outgoing HTTPS
iptables -I OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
# 12. Ping from inside to outside
iptables -I OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# 14. Allow loopback access
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT
# 16. Allow outbound DNS
iptables -I OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -I INPUT -p udp -i eth0 --sport 53 -j ACCEPT
#Allow inbound DNS
iptables -I INPUT -p udp -s 0/0 --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -p udp --sport 53 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT -p udp -s 0/0 --sport 53 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -p udp --sport 53 -d 0/0 --dport 53 -m state --state ESTABLISHED -j ACCEPT
# 20. Allow Sendmail or Postfix #to mail.awib.it (82.211.19.134)
iptables -I OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -I INPUT -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
# 26. Allow Munin Stats
iptables -I INPUT -p tcp --dport 4949 -j ACCEPT
iptables -I OUTPUT -p tcp --sport 4949 -j ACCEPT
#iptables -I OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
ipset create countryblock hash:net
while read line; do ipset add countryblock $line; done < blocklist.txt
iptables -A INPUT -m set ! --match-set countryblock src -j DROP
반면 'blocklist.txt'에는 화이트리스트에 추가할 50개의 범위가 포함되어 있거나 블랙리스트에 추가되는 범위와 반대입니다. 그러나 그 세트의 반대는 또한 모든 DNS 트래픽이 차단된다는 것을 의미합니다. 이것은 나를 미치게 만듭니다! :-디
그러나 어떤 이유로 내 서버에 전혀 액세스할 수 없거나 그 반대가 작동하지 않았습니다(ssh 프롬프트를 확인하기 위해 일부 web2ssh 애플릿을 시도했습니다).
또한 해당 구성에서 해당 failure2ban createaction 규칙 정의를 찾았습니다. 하지만 오버헤드를 줄이기 위해 munin과 f2b의 기본 규칙을 그대로 두고 내 규칙과 어쩌면 dns-blacklist 스크립트에 필요한 수정 사항을 적용하고 싶습니다.
나는 이 질문/요청이 가장 쉬운 질문이 아닐 수도 있다는 것을 알고 있으며 왜 단순히 Fail2ban을 사용하지 않는지 물을 수도 있습니다. 의심스러운 행동이 있는지 알고 싶습니다. 따라서 차단된 호스트 보고서를 받는 것이 좋습니다. 모든 외부 호스트에 대해 이것을 갖고 싶지는 않지만(10개 이상의 서버에서 Fail2ban을 실행하고 있으므로 10배).
또 다른 접근 방식은 모든 트래픽을 처리하는 전용 방화벽 서버/라우터일 수 있습니다. 그러나 이것은 다소 복잡한 규칙 설정이 될 것이며 어리석은 잘못된 구성/잘못된 규칙 등으로 인해 실수로 모든 서버를 잠그고 싶지 않습니다. 또한 이는 현재 10개 서버 모두에 분산되어 있는 무료 트래픽을 초과하게 됩니다.
통찰력이 있는 괴짜 친구가 규칙을 올바르게 정렬하도록 기꺼이 도와주길 바랍니다.
이 질문에 불필요하게 내용을 추가하기 전에 지금은 요청에 따라 정보를 제공하면서 보류 중입니다.
추신:평판이 부족해서 만들 수 없기 때문에 누군가 "ipset" 태그를 추가할 수 있을 것입니다. 감사해요!
답변1
엄청 복잡해보이네요....
다른 포트로 sshd
이동 하는 것만으로도 보안과 성능 면에서 큰 가치를 발견할 수 있다고 생각합니다 .munin
기본값과 일치하지 않는 포트에서 해당 서비스를 실행하면 대부분의 무차별 대입/Dos 트래픽이 진압됩니다. Fail2ban은 그 이후에 모든 이상값을 포착할 수 있어야 합니다.
포트 로 이동하면 custom
기본적으로 다음이 생성됩니다.
iptables -A "Anyone that doesn't know the correct ssh port" -j DROP
포트에 연결하려는 시도를 계속 기록할 수 있지만 22
디스크 공간을 더 잘 활용하는 방법을 찾을 수 있을 것 같습니다.
답변2
ipset create banned_hosts hash:net family inet hashsize 524288 maxelem 800000 counters comment
ipset create whitelist hash:net family inet hashsize 524288 maxelem 800000 counters comment
iptables -I INPUT 1 -m set --match-set banned_nets src -j DROP
iptables -I INPUT 2 -m set --match-set whitelist src -j ACCEPT
ipset add banned_hosts 171.248.31.131
ipset add banned_hosts 191.185.207.16
ipset add banned_hosts 45.247.22.251
ipset add banned_hosts 82.98.162.90
ipset add banned_hosts 125.227.181.216
ipset add banned_hosts 122.117.163.44
모든 IPset을 저장
ipset save >all.txt
모든 세트 로드
ipset load <all.txt