
업데이트:
시도해 보았지만 sudo iptables -A INPUT -p tcp --dport 22 ! -s 1.2.3.4,11.22.33.44 -j DROP
작동하지 않으며 오류가 발생합니다.
iptables v1.8.2(nf_tables): ! 여러 소스 또는 대상 IP 주소에는 허용되지 않습니다.
예를 들어, 내 목표는 허용만 허용 1.2.3.4
하고 11.22.33.44
내 서버의 SSH(포트 22)에 연결하는 것입니다.
그리고 나는 다른 것보다 이 접근법/명령을 선호합니다.
sudo iptables -A INPUT -p tcp --dport 22 ! -s 1.2.3.4 -j DROP
11.22.33.44
하지만 이 명령에 다른 허용 IP를 추가하는 방법을 모르겠습니다 .
나에게 작은 도움이나 조언을 주실 수 있나요?
감사해요.
답변1
정의다수의만 사용하는 주소하나 iptables
명령을 사용하는 ! --source
것은 불가능합니다.
주소는 네트워크 이름, 호스트 이름(호스트 이름을 사용하는 것은 정말 좋지 않은 생각일 수 있음), 네트워크 IP 주소(/mask 사용) 또는 일반 IP 주소일 수 있습니다. 마스크는 네트워크 마스크 또는 일반 숫자일 수 있습니다.
기본 규칙 세트를 허용에서 삭제로 변경하는 것을 고려할 수 있습니다. 이렇게 하면 허용되어야 하는 것만을 기준으로 정의할 수 있습니다. 즉, 다음과 유사합니다.
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
... your other rules goes here ...
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -s 1.2.3.4,11.22.33.44 -j ACCEPT
iptables -P INPUT DROP
장점/아름다움은 패키지 상태를 고려하면 이러한 규칙 세트가 훨씬 더 성능이 좋다는 것입니다. 또한 원하는 구문을 허용합니다. Plus는 방화벽 규칙을 정의하는 데 권장되는 방법이기도 합니다.
-s 1.2.3.4,11.22.33.44
그러나 위에 표시된 구문을 사용하는 경우 명령을 사용하여 볼 수 있듯이 여전히 2개의 개별 테이블 항목이 생성된다는 점을 명심하십시오 iptables -L INPUT
. 또한 모든 버전의 iptables에서는 작동하지 않습니다. 또한 개인적으로 읽거나 유지 관리하는 것이 어렵다고 생각합니다. 이것이 제가 이를 피하고 2개의 별도 명령을 사용하는 것을 선호하는 이유입니다.
규칙의 양을 최소화하려는 경우 가장 가까운 방법은 다음을 사용하는 것입니다.하나 iptables
--match
대신 을 사용하여 규칙을 만듭니다 --source
. 그러나 추가 명령을 사용하여 일치 항목을 정의해야 합니다. 이것이 어떻게 작동하는지 ipset을 다루는 다른 설명에서 완벽하게 설명되었습니다.
답변2
당신은 사용할 수 있습니다IP 세트.
배포판에 따라 ipset
유틸리티를 먼저 설치해야 할 수도 있습니다.
#(For Debian and Debian-derived distros)
sudo apt install ipset-persistent
그런 다음 친숙한 이름으로 세트를 만듭니다.
sudo ipset create ssh_friends iphash
세트가 완성되면 여기에 IP를 추가할 수 있습니다.
sudo ipset add ssh_friends 1.2.3.4
sudo ipset add ssh_friends 11.22.33.44
iptables
이제 개별 IP 대신 규칙 에서 생성한 집합을 사용할 수 있습니다 .
sudo iptables -A INPUT -p tcp --destination-port 22 -m set ! --match-set ssh_friends src -j DROP