Iptables 규칙은 PING, Whois, DNS, NTP, SSH, HTTP(S), FTP에 적용됩니다.

Iptables 규칙은 PING, Whois, DNS, NTP, SSH, HTTP(S), FTP에 적용됩니다.

여기에 데비안 8을 새로 설치할 때 로드한 파일이 있습니다 iptables-restore. 제가 변경한 유일한 것은 파일에서 SSH 포트 22022를 사용하는 것이었습니다 /etc/ssh/sshd_config.

----- 아래 업데이트를 참조하세요 -----

이 파일을 로드하면 어떤 식으로든 이 데비안에 액세스할 수 없습니다. 심지어 ping도 작동하지 않습니다. /var/log/messages 파일에는 오류에 대한 정보가 없습니다. iptables를 구성하는 것은 이번이 처음입니다. 나는 그것에 관한 많은 문서를 읽었지만 어딘가에서 잘못하고 있습니다. 여기서 무슨 일이 일어나고 있는지 지적할 수 있나요?

    *filter

    #----------
    # Local loop
    #----------
    -A INPUT -i lo -j ACCEPT
    -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

    #----------
    # Connexions already established
    #----------
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    #----------
    # PING
    #----------
    -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

    #----------
    # SSH
    #----------

    -A INPUT -p tcp --dport 22022 -m state --state NEW,ESTABLISHED -j ACCEPT
    -A OUTPUT -p tcp --dport 22022 -m state --state NEW,ESTABLISHED -j ACCEPT

    #----------
    # HTTP
    #----------

    -A INPUT -p tcp --dport 80 -j ACCEPT
    -A OUTPUT -p tcp --dport 80 -j ACCEPT

    #----------
    # HTTPS
    #----------

    -A INPUT -p tcp --dport 443 -j ACCEPT
    -A OUTPUT -p tcp --dport 443 -j ACCEPT

    #----------
    # FTP
    #----------

    -A INPUT -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
    -A OUTPUT -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT

    -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
    -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

    #----------
    # Logs
    #----------
    -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 4

    #----------
    # DROP everything else
    #----------
    -A INPUT -j DROP
    -A OUTPUT -j DROP
    -A FORWARD -j DROP

    COMMIT

- - - 갱신 - - -

이제 NTP, Ping, DNS, Whois, SSH, HTTP(S) 및 FTP를 사용할 수 있습니다. 훌라. 새로운 파일입니다. 이상한 점을 발견하면 알려주세요. 또한 내가 사용하는 vsftp와 함께 FTP(TLS/SSL)를 사용하려면 몇 가지 좋은 구성 요령이 필요하다는 것도 배웠지만 지금까지 좋은 해결책을 찾지 못했습니다. 나는 이와 같이 "깨끗한" FTP를 유지하지 않을 것이기 때문에 이 문제를 해결할 수 있기를 정말로 바랍니다. 아이디어가 있다면. 도움을 주셔서 다시 한번 감사드립니다. 두 답변 모두 훌륭합니다. 하나를 선택할 수 없었습니다. ;)

(그런데 이제 sh 스크립트를 사용하여 모듈을 로드합니다)

    #!/bin/sh

    #----------
    # Load needed modules
    #----------
    modprobe ip_conntrack_ftp
    modprobe ip_nat_ftp

    #----------
    # Local loop
    #----------
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

    #----------
    # Connexions already established
    #----------
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    #----------
    # NTP
    #----------
    iptables -A INPUT -p udp --sport 123 -j ACCEPT
    iptables -A OUTPUT -p udp --dport 123 -j ACCEPT

    #----------
    # PING
    #----------
    iptables -A INPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

    #----------
    # DNS
    #----------
    # UDP
    iptables -A INPUT -i eth0 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
    # TCP
    iptables -A INPUT -i eth0 -p tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT

    #----------
    # WHOIS
    #----------
    iptables -A INPUT -p tcp --sport 43 -j ACCEPT
    iptables -A OUTPUT -p tcp --dport 43 -j ACCEPT

    #----------
    # SSH
    #----------
    # Incoming
    iptables -A INPUT -i eth0 -p tcp --dport 22022 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 22022 -m state --state ESTABLISHED -j ACCEPT
    # Outgoing
    iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

    #----------
    # HTTP
    #----------
    # Incoming
    iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
    # Outgoing
    iptables -A INPUT -i eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

    #----------
    # HTTPS
    #----------
    # Incoming
    iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
    # Outgoing
    iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT

    #----------
    # FTP
    #----------
    #incoming
    iptables -A INPUT -i eth0 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT

    #----------
    # Logs
    #----------
    #-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 4

    #----------
    # DROP everything else
    #----------
    iptables -A INPUT -j DROP
    iptables -A OUTPUT -j DROP
    iptables -A FORWARD -j DROP

    exit 0

답변1

이 규칙 이후에는:

-A OUTPUT -p tcp --dport 22022 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -j DROP

컴퓨터에서 보낼 수 있는 것은 HTTP(S) 요청, 포트 22022에 대한 일부 FTP 연결 및 SSH 연결뿐입니다. 예를 들어 SSH 서버로부터의 응답에는 해당되지 않습니다. 그 이유는 대상이 클라이언트가 선택한 임의의 포트(우연하지 않는 한 22022가 아닐 가능성이 높음)이기 때문입니다. 마찬가지로 HTTP 서버의 응답은 전송되지 않으며 ICMP 에코 응답은 허용되지 않습니다.

SSH 서버에서 보낸 패킷만 허용하려면 해당 패킷을 허용해야 합니다.보내다포트 22022에서 --sport 22022.

SSH 서버의 응답을 허용하더라도 외부로 나가는 요청을 많이 할 수 없다는 사실을 곧 알게 될 것입니다. HTTP 요청을 허용하지만 예를 들어 나가는 DNS 쿼리는 나가지 않습니다. 출력 규칙을 얼마나 엄격하게 만들 것인지 고려하십시오. 적어도 먼저 체인에 -m state --state ESTABLISHED -j ACCEPT규칙을 추가하는 것이 좋습니다.-j LOGOUTPUT

답변2

ilkkachu가 그의 대답에서 말했듯이 출력 규칙은 당신이 원하는 것을 원하지 않습니다.

몇개의 충고:

  • DROP규칙을 사용하여 체인을 명시적으로 종료하는 대신 ( 및 유사한 을 DROP사용합니다 . 그런 다음 을 사용하여 체인에 규칙을 추가할 수 있으며 정책은 체인 끝에 도달하는 모든 패킷에 자동으로 적용됩니다.iptables -P INPUT DROPOUTPUTFORWARDiptables -A <chain>
  • 체인 의 연결과 정확히 유사한 OUTPUT설정된 관련 연결에서 트래픽을 허용하는 규칙을 체인에 추가합니다 . 그러면 특정 프로토콜의 작동 방식에 관계없이 허용하는 모든 것에 대한 응답이 허용됩니다.iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPTINPUT
  • 서버가 나가는 DNS 요청을 할 수 있도록 규칙을 추가하는 것을 고려해 보세요.둘 다UDP 및 TCP).

관련 정보