이제 내 서버에서 일부 IPv6 규칙을 설정하는 방법을 알아내려고 합니다. 내 요구 사항은 루프백 장치와 로컬 IP 주소(이 경우 링크 로컬)에 대한 에코 요청을 비활성화하고 포트 22, 80 및 443을 여는 것입니다. IPv4의 경우 모든 것이 정상이지만 INPUT 체인 순서를 따르는 ip6tables에 문제가 있는 것 같습니다. 이것이 내가 지금 가지고 있는 것입니다:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p icmpv6 -m icmpv6 --icmpv6-type echo-request -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable
-A OUTPUT -p icmpv6 --icmpv6-type echo-request -d ::1/128 -j REJECT --reject-with icmp6-port-unreachable
-A OUTPUT -p icmpv6 --icmpv6-type echo-request -d fe80::/64 -j REJECT --reject-with icmp6-port-unreachable
-A OUTPUT -j ACCEPT
COMMIT
나의 현재 범인은 입니다 -A INPUT -j REJECT
. 체인에 나열되지 않은 모든 항목을 암시적으로 거부할 것으로 예상됩니다. 그러나 이는 사실이 아닌 것 같으며 IPv4 규칙을 사용하는 기존의 일반 iptable과 다르게 동작하는 것 같습니다. 누군가 나에게 해결책을 말해 줄 수 있습니까? 우분투 14.04 서버입니다
답변1
먼저 규칙이 수행하려는 작업을 살펴보고 규칙이 작동하지 않는 이유를 살펴보겠습니다.
-A INPUT -i lo -j ACCEPT
ICMPv6 트래픽을 포함하여 루프백 인터페이스에 도착하는 모든 트래픽이 처리됩니다.
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
매우 정상입니다.
-A INPUT -p icmpv6 -m icmpv6 --icmpv6-type echo-request -j ACCEPT
작성된 대로 이 규칙은 (모든 인터페이스에 대한) ping 요청만 허용합니다. 다른 모든 ICMPv6 패킷은 최종 명시적 REJECT에 의해 거부됩니다.
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable
매우 정상입니다.
-A OUTPUT -p icmpv6 --icmpv6-type echo-request -d ::1/128 -j REJECT --reject-with icmp6-port-unreachable
-A OUTPUT -p icmpv6 --icmpv6-type echo-request -d fe80::/64 -j REJECT --reject-with icmp6-port-unreachable
이러한 규칙은 호스트가 localhost 및 링크-로컬 네트워크 주소로 ping을 보내는 것을 방지합니다(또한링크 로컬 주소 범위는 /10입니다..)
-A OUTPUT -j ACCEPT
매우 정상입니다.
그러나 당신은 "내 요청은루프백 장치 및 로컬 IP 주소에 대한 에코 요청 비활성화(이 경우 링크 로컬) [...]". 작성 중인 규칙은 요구하려는 규칙과 거의 반대입니다. 또한 일반적으로 입력 필터를 입력 측에 두는 것이 더 좋습니다. 대부분의 사람들은 컴퓨터에서 전송되는 트래픽뿐만 아니라 모든 트래픽에 대해 작동하는 이와 같은 것을 찾을 것입니다.
다음과 같이 규칙 체인을 작성하는 것이 좋습니다.
-A INPUT -i lo -p icmpv6 -m icmpv6 --icmpv6-type echo-request -j REJECT --reject-with icmp6-port-unreachable
-A INPUT -d fe80::/10 -p icmpv6 -m icmpv6 --icmpv6-type echo-request -j REJECT --reject-with icmp6-port-unreachable
-A INPUT -p icmpv6 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable
재작성 규칙에 대한 몇 가지 관찰 사항:
- 나는 ACCEPT 규칙 앞에 REJECT 규칙을 배치하고 더 넓은 필터 앞에 더 좁은 필터를 두는 것을 선호합니다. 그래야 더 넓은 필터가 허용하기 때문에 실수로 무언가가 통과하는 것을 방지할 수 있습니다. 이것은 엄격하고 빠른 규칙은 아니지만 무슨 일이 일어나고 있는지 더 쉽게 시각화하는 데 도움이 됩니다.
- 규칙은 INPUT 체인에서 처리되므로 OUTPUT 체인은 더 이상 필요하지 않습니다.
- 귀하의 요청에도 불구하고 로컬 컴퓨터만 해당 인터페이스로 보낼 수 있으므로 루프백 인터페이스 핑을 비활성화하려는 이유가 무엇인지 잘 모르겠습니다. 하지만 단지 관찰해 볼 점: 이 작업을 수행해야 하는 특별한 필요가 있는 경우에는 괜찮습니다.