핑 응답을 비활성화한 후 다음 명령을 실행합니다.
# sysctl net.ipv4.icmp_echo_ignore_all=1
# sysctl -p
localhost와 127.0.0.1을 ping하면 다른 결과가 나타납니다.
# ping -c 3 localhost
PING localhost(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from localhost (::1): icmp_seq=2 ttl=64 time=0.035 ms
64 bytes from localhost (::1): icmp_seq=3 ttl=64 time=0.101 ms
--- localhost ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2042ms
rtt min/avg/max/mdev = 0.047/0.072/0.101/0.022 ms
핑 127.0.0.1 실패:
ping -c 3 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
--- 127.0.0.1 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2032ms
왜 결과가 다른가요?
답변1
이 ping
명령은 이름이 확인되는 주소를 표시합니다. 이 경우 IPv6 localhost 주소로 확인됩니다 ::1
. 반면에 127.0.0.1
은 IPv4 주소이므로 명시적으로 ping
IPv4를 사용합니다.
사용 sysctl
중인 제품은 IPv4 핑에만 영향을 미치므로 응답을 받을 수 있지만 ::1
응답을 받을 수는 없습니다 127.0.0.1
.
확인을 통해 얻는 주소는 localhost
DNS 확인자가 어떻게 설정되었는지에 따라 달라집니다. localhost
에 설정되었을 수도 있지만 /etc/hosts
이론적으로는 실제 네임서버에서 가져올 수 있습니다.
ip6tables
IPv6 핑을 제거하는 방법에 관해서는 IPv6와 유사한 것이 없는 것 같으므로 확인해 보는 것이 좋습니다 . sysctl
또는 네트워크에서 IPv6를 사용하지 않는 경우 IPv6을 완전히 비활성화합니다. (물론 이것은 아주 미래 지향적인 아이디어는 아니지만 현재 사용하고 있지 않다면 실행 가능합니다.)
답변2
127.0.0.1:
127.0.0.1은 대부분의 시스템에서 기본 루프백입니다. 루프백 주소는 시스템이 운영 체제의 네트워크 스택을 확인하는 데 사용하는 주소입니다.
IPv4의 루프백 주소는 서브넷의 모든 값을 가질 수 있습니다. 127.0.0.0/8
IPv6의 루프백 주소는 서브넷의 모든 값을 가질 수 있습니다. ::1/128
ping
네트워크 스택이 운영 체제에서 실행 중인 경우 이 범위의 모든 값은 유효해야 합니다.
로컬 호스트:
localhost
도메인 이름이지만 자신의 컴퓨터에 로컬인 호스트 이름입니다.
이 호스트 이름은 기본적으로 IPv4 및 IPv6 루프백(일반적으로 또는 127.0.0.1
) 을 가리킵니다 ::1
.
localhost
파일을 편집하면 주소를 쉽게 변경할 수 있습니다 /etc/hosts
.
시스템이 이 서비스를 사용하는 경우 systemd-resolved
localhost를 확인하는 것처럼 처리됩니다.
~에 따르면선적 서류 비치systemd-resolved
:
호스트 이름 "localhost" 및 "localhost.localdomain"(및 ".localhost" 또는 ".localhost.localdomain"으로 끝나는 모든 호스트 이름)은 IP 주소로 확인
127.0.0.1
되고::1
평평한
호스트 이름이나 도메인 이름을 ping하려고 하면 운영 체제에 호스트 이름이나 도메인 이름을 확인하도록 요청합니다. 귀하의 경우 localhost를 비활성화했지만 icmpv4
localhost는 IPv6 루프백 및 IPv4 루프백으로 확인되었지만 IPv6 루프백 응답만 해결되었습니다.
차이점은 한 경우에는 IP에 대해 ping을 시도하고 다른 경우에는 여러 값을 가질 수 있는 호스트 이름에 대해 ping을 시도한다는 것입니다.
icmpv6 비활성화
IPv6가 필요하지 않은 경우 비활성화하는 것이 좋습니다. 이렇게 하면 방화벽 및 서비스 구성 측면에서 수행해야 하는 모든 작업이 두 배로 늘어납니다.
sysctl -w net.ipv6.conf.all.disable_ipv6=0
여전히 IPv6 지원이 필요하고 이를 피하고 싶다면 다음을 icmpv6
사용할 수 있습니다 ip6tables
.
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP
답변3
로컬 호스트에는 IPv6 주소::1과 IPv4 주소 127.0.0.1이라는 두 개의 주소가 있습니다.
IPv6이 기본 프로토콜이므로 ::1은 항상 127.0.0.1보다 우선합니다. 이것이 바로 localhost에 ping을 요청했을 때 이미 ::1 ping을 하고 있는 이유입니다.
::1에 대해 ping을 수행할 수 있지만 127.0.0.1에 대해서는 ping을 수행할 수 없는 이유에 대해 sysctl은 IPv4에 대한 ping만 비활성화하고 IPv6에 대해서는 비활성화하지 않습니다. 내가 아는 한, IPv6에 대한 핑을 비활성화하는 데 해당하는 sysctl은 없지만 꼭 필요한 경우 방화벽에서 비활성화할 수 있습니다(비활성화하는 것은 권장되지 않습니다).