Iptables가 특정 IP로부터의 인바운드를 차단하지 못함

Iptables가 특정 IP로부터의 인바운드를 차단하지 못함

안녕하세요. 게이트웨이처럼 사용하는 온라인 서버가 있는데 iptables가 이상하게 작동합니다.

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i tun+ -j ACCEPT
-A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A BLOCK_CHAIN -s 173.230.154.149/32 -j REJECT --reject-with icmp-host-prohibited
-A BLOCK_CHAIN -m state --state NEW -j ACCEPT

하지만 173.230.154.149는 여전히 80 또는 443에서 Apache 서버에 접근할 수 있으므로 차단해서는 안 됩니다.

-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN

그리고

-A BLOCK_CHAIN -s 173.230.154.149/32 -j REJECT --reject-with icmp-host-prohibited

예 모든 웹 서비스를 VPN(openvpn)을 통해 개인용 더 큰 서버로 라우팅하는 온라인 서버입니다.

모든 것이 예상대로 작동하지만 특정 IP에서 들어오는 연결을 차단할 수 없습니다. 마녀가 분명히 서버를 공격하고 있습니다.

네트워크의 유형은 다음과 같습니다.

외부 IP XX.XX.X.XX Vpn 10.0.0.0/24

-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.100
-A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.100

답변1

로컬 프로세스에 의해 수신되지 않고 라우팅되는 패킷은 NAT 사용으로 인해 발생하더라도 필터/INPUT 체인이 아닌 필터/FORWARD 체인을 통과합니다. 따라서 필터/입력의 현재 차단 규칙은 효과가 없습니다. 이러한 규칙은 다음과 같습니다.

-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN

간단히 다음으로 대체해야 합니다:

-A FORWARD -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A FORWARD -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN

당연히 웹 서버에 대한 액세스를 허용하는 규칙 앞에 추가되어야 효과가 있습니다. 따라서 적어도 다음보다 앞에 추가하십시오.

-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT

초기 연결이 승인되면 이후의 모든 패킷은 다음 규칙에 따라 단락됩니다.

-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

따라서 처음 볼 때 차단해야 합니다.


추가 참고사항:

  • 중복 규칙

    -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -i tun+ -j ACCEPT
    -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    

    위의 첫 번째 규칙과 두 번째 규칙은 각각 별도로 세 번째 규칙을 중복하게 만듭니다.

    비슷하게:

    -A FORWARD -i eth0 -o tun+ -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
    -A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
    -A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
    

    첫 번째 규칙은 다음 두 규칙을 중복되게 만듭니다.

    하지만 이 모든 것은 현재 문제를 테스트하기 위한 것일 수도 있습니다.

  • (문제가 수정된) 최신 커널을 실행하지 않는 한 REJECT 규칙은 INVALID 상태의 패킷을 거부하도록 허용되어서는 안 됩니다. 이러한 패킷은 "단지" 삭제되어야 합니다. 그렇지 않으면 합법적인 트래픽에 대해 드물게 무작위 연결 실패가 발생할 수 있습니다.

    이것은 이제 문서화되어 있습니다.iptables-extensions(8):

    경고: 연결 상태가 INVALID로 분류된 패킷에 REJECT 대상을 무분별하게 적용해서는 안 됩니다. 대신, 이것들만 DROP해야 합니다.

    (맨 페이지에서는 추가 근거를 제공합니다.)

    그래서 일반적으로,

    -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    

    다음이 따라야 합니다:

    -A FORWARD -m conntrack --ctstate INVALID -j DROP
    

관련 정보