2개의 iptables 구성이 있습니다. 두 번째 iptables는 15:00에 첫 번째 iptables를 대체합니다. 첫 번째 iptable은 다음과 같습니다.
#!/bin/bash
/usr/sbin/iptables -F
/usr/sbin/iptables -P INPUT DROP
/usr/sbin/iptables -P FORWARD DROP
/usr/sbin/iptables -P OUTPUT ACCEPT
/usr/sbin/iptables -A INPUT -i lo -j ACCEPT
/usr/sbin/iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
csa=MY_IP_TO_ALLOW
/usr/sbin/iptables -A INPUT -p tcp -m tcp -s $csa --dport 22 -m connlimit --connlimit-upto 1 -j ACCEPT
/usr/sbin/iptables -A INPUT -p tcp -m tcp -s $csa --dport 80 -m connlimit --connlimit-upto 1 -j ACCEPT
/usr/sbin/iptables -A INPUT -p tcp -m tcp -s $csa --dport 443 -m connlimit --connlimit-upto 1 -j ACCEPT
/usr/sbin/iptables -A INPUT -p tcp -s MY_SECOND_IP --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
두 번째 iptables는 #!/bin/bash입니다.
/usr/sbin/iptables -F
/usr/sbin/iptables -P INPUT DROP
/usr/sbin/iptables -P FORWARD DROP
/usr/sbin/iptables -P OUTPUT ACCEPT
/usr/sbin/iptables -A INPUT -i lo -j ACCEPT
/usr/sbin/iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
/usr/sbin/iptables -A INPUT -p tcp -s MY_SECOND_IP --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
첫 번째 iptables에서 두 번째 iptables로 전환할 때 모든 활성 연결이 "csa"에 저장된 IP에서 종료되는지 어떻게 확인할 수 있습니까?
저는 iptables 전문가가 아닙니다. 이것이 외부 IP를 보호하는 안전한 방법입니까? 두 번째 iptables가 활성화될 때 첫 번째 iptables에서 허용된 IP로부터의 연결을 차단하는 올바른 방법입니까?
감사합니다
답변1
사용
iptables-restore
한 번에 하나씩 규칙을 추가하면 방화벽 규칙이 한 번에 하나씩 변경되어 방화벽 규칙 세트에 잠재적으로 원치 않는 중간 상태가 도입됩니다. 대조적으로,
iptables-save
규칙 세트는 원자적으로 저장되고 반대로iptables-restore
원자적으로 복원됩니다(적어도 특정 테이블에 대해서는). 패킷에는 첫 번째 규칙 세트나 두 번째 규칙 세트가 표시되지만 중간 상태는 표시되지 않습니다.작동하는 규칙 세트가 있으면 이를 다시 로드하기 위해 쉘 명령을 사용해서는 안 되며,
iptables-save
규칙을 파일로 덤프하고iptables-restore
해당 파일에서 로드해야 합니다. 이 파일은 규칙 자체의 공통 구문이므로 쉽게 직접 편집할 수 있습니다. 동적 구성요소(동적 IP, 임시 IP 금지 등)가 있는 경우 사용자 정의 체인 또는 피어 사용과 같은 일부 로직을 사용하여 규칙을 조정해야 합니다.ipset
도구 및 관련성냥그리고표적.설정된 연결은 현재 방법을 사용하여 설정된 상태로 유지됩니다.
iptables-restore
상태 저장 단락 규칙으로 인해 이러한 방식으로(또는 사용하여) 규칙을 전환해도 활성 연결이 종료되지 않습니다. 이 규칙 쿼리연결하다여전히 활성화된 출입구가 있으며 교통은 계속 허용됩니다. 따라서 새로운 규칙 세트에서는 이제 금지되지만 포트 22, 80 또는 443에 설정된 연결은 (충분한 트래픽이 있는 한) 무기한 지속되도록 허용됩니다.설정된 모든 연결을 종료하려면 다음도 수행해야 합니다(설치추적 도구및) 다음을 실행합니다.
conntrack -F
이건 플러시 될거야연결하다NEW 상태를 통해 반환되는 연결이 필요한 조회 테이블입니다. 포트 3306에 대한 규칙은 설정된 연결을 차단되지 않은 상태로 유지합니다.
기본적으로 TCP를 사용하는 것만으로는
conntrack -F
충분하지 않습니다.이미 설정된 TCP 연결에는 TCP 속성을 기반으로 해당 흐름의 유효성을 검사하고 다시 생성되도록 허용하는 특수 처리기가 있습니다.연결하다TCP SYN 패킷은 보이지 않지만 여전히 NEW 상태입니다. 이는 다음으로 인해 발생합니다.시스템 제어재산
net.netfilter.nf_conntrack_tcp_loose
기본값은 느슨함입니다.이를 위해서는 여전히 어딘가에 새로운 상태를 허용해야 합니다.iptables규칙 세트. 아아, 그게 바로
OUTPUT
체인이 허용하기 때문입니다.모든 것따라서 여기에는 새 상태의 흐름에 대한 패킷이 포함됩니다. 따라서 이제 클라이언트의 패킷이 처음에는 삭제되지만 서버에서 문제가 발생하면단일 패킷이전 스트림에서 클라이언트로의 연결이 방해 없이 재개됩니다.이를 방지하려면 일반적으로
netfilter.nf_conntrack_tcp_loose
다음과 같이 비활성화할 수 있습니다.sysctl -w net.netfilter.nf_conntrack_tcp_loose=0
그러나 이로 인해 포트 3306에 대한 후속 연결도 끊어집니다
conntrack -F
.추적 도구하나의 스트림을 제외하고 모두 삭제하는 데 쉽게 사용되지 않으므로 여러 개를 사용하는 것은conntrack -D ...
간단한 접근 방식이 아니지만 OP의 특정 사례에는 적합합니다(3개의 스트림만 삭제하면 됨).사용. . . 교체
conntrack -F
:conntrack -D -s $csa -p tcp --dport 22 conntrack -D -s $csa -p tcp --dport 80 conntrack -D -s $csa -p tcp --dport 443
또 다른 접근 방식은 편안한 TCP 처리를 유지하면서 상태 저장 규칙을 사용하여 나가는 패킷을 제한하는 것입니다.
예를 들어 (최신 버전 사용
state
:conntrack
):iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT iptables -P OUTPUT DROP
-A OUTPUT -p ... --dport ... -m conntrack --ctstate NEW -j ACCEPT
이 경우 )와 같은 규칙을 사용하여 서버에 필요한 일반 서비스(DNS, NTP, 웹 액세스 등)에 대해 명시적인 나가는 트래픽도 활성화해야 합니다.
참고: RELATED 핸들을 떠났습니다. 일반적으로 RELATED를 ESTABLISHED와 함께 사용하는 것이 가장 좋습니다.
예를 들어 OP의 규칙은 ICMP를 허용하지 않으므로 관련 ICMP 오류를 활성화하는 RELATED 규칙이 없습니다.경로 MTU 검색이 제대로 작동하지 않습니다.(예: 경로를 통해 터널링하는 동안 TCP 연결이 중단될 수 있습니다.) 사람들은 여전히 이 블로그를 먼저 확인해야 합니다.iptables 및 연결 추적 도우미의 안전한 사용.