/proc/sys/net/ipv[46]/conf/에서 "all", "default" 및 "eth*"의 차이점은 무엇입니까?

/proc/sys/net/ipv[46]/conf/에서 "all", "default" 및 "eth*"의 차이점은 무엇입니까?

sysctl에서 이러한 키에는 , 각 네트워크 인터페이스에 대한 키라는 하위 키가 있습니다 /proc/sys/net/ipv[46]/conf/. 예를 들어 단일 네트워크 인터페이스인 eth0이 있는 컴퓨터에서는 다음과 같습니다.alldefault

iserv ~ # ll /proc/sys/net/ipv[46]/conf/
/proc/sys/net/ipv4/conf/:
insgesamt 0
dr-xr-xr-x 0 root root 0 12. Sep 23:30 all/
dr-xr-xr-x 0 root root 0 12. Sep 23:30 default/
dr-xr-xr-x 0 root root 0 12. Sep 23:30 eth0/
dr-xr-xr-x 0 root root 0 12. Sep 23:30 lo/

/proc/sys/net/ipv6/conf/:
insgesamt 0
dr-xr-xr-x 0 root root 0 12. Sep 23:30 all/
dr-xr-xr-x 0 root root 0 12. Sep 23:30 default/
dr-xr-xr-x 0 root root 0 12. Sep 23:30 eth0/
dr-xr-xr-x 0 root root 0 12. Sep 23:30 lo/

모든 해당 설정은 각 키에 별도로 존재합니다. 예를 들어 이 accept_ra값을 사용하여 IPv6 라우터 광고를 비활성화 하려는 경우 해당 값은 4번 존재합니다.

iserv ~ # sysctl -a 2>/dev/null | grep "accept_ra "
net.ipv6.conf.all.accept_ra = 1
net.ipv6.conf.default.accept_ra = 1
net.ipv6.conf.lo.accept_ra = 1
net.ipv6.conf.eth0.accept_ra = 1

지금 내 질문은: 어떤 값을 변경해야 합니까? all(기존 인터페이스를 모두 변경하고) (나중에 나올 수 있는 새 인터페이스를 변경) 하고 싶지만 default이를 변경해도 여전히 lo 및 eth0 값이 1로 남습니다.

iserv ~ # sysctl -w net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.accept_ra = 0
iserv ~ # sysctl -w net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.default.accept_ra = 0
iserv ~ # sysctl -a 2>/dev/null | grep "accept_ra "  
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
net.ipv6.conf.lo.accept_ra = 1
net.ipv6.conf.eth0.accept_ra = 1

이제 머신이 eth0에서 라우터 광고를 허용합니까?

답변1

질문을 쓰다가 답을 찾았습니다. 어쨌든, 다른 사람들이 이 내용을 통찰력 있게 보고 직접 답변할 수도 있기 때문에 게시하기로 결정했습니다.

이 문제는 linux-kernel 메일링 리스트의 Philipp Matthias Hahn 사용자에 의해 적어도 부분적으로 해결되었습니다.:

As far as I researched for IPv4 some time ago, the "default" value gets
copied to newly created interfaces only once.
"all" on the other hand allways gets applied in addition to the current
setting, but it depends on the exact setting, if its ORed, ANDed, or
whatevered:
    log_martians         OR
    accept_redirects     AND
    forwarding           ?
    mc_forwarding        AND
    medium_id
    proxy_arp            OR
    shared_media         OR
    secure_redirects     OR
    send_redirects       OR
    bootp_relay          AND
    accept_source_route  AND
    rp_filter            AND
    arp_filter           OR
    arp_announce         MAX
    arp_ignore           MAX
    arp_accept
    app_solicit
    disable_policy
    disable_xfrm
    tag
(see include/linux/inetdevice.h:83 for IN_DEV_{AND,OR,MAX}CONF)

Putting a new value in "all" doesn't change the value you read from
"$interface", but it only gets computed and used internally.

그는 그것을 소개하지 않았지만 accept_ra적어도 지금은 그들이 어떻게 작동하는지 all, default아니면 어떻게 그들이 내가 예상한 대로 작동하지 않는지 분명합니다.

답변2

많은 Google 검색 결과가 여기를 가리키고 인터넷에는 이에 대한 오래되고 잘못된 정보가 많이 있기 때문에 이 질문에 대한 새로운 답변을 제공하려고 합니다.

net.ipv{4,6}.conf.default.*

@Martin von Wittich 동작의 정확성에 관해서 default는 새로운 인터페이스에만 적용됩니다. 호스트 인터페이스의 경우 default새 장치를 생성할 때만 이 설정이 적용되며,주인전통적으로 인터페이스는 시작 시에만 생성됩니다. 따라서 매개변수만 변경하면 default해당 값이 다음에 적용되지 않습니다.주인호스트가 재부팅될 때까지 인터페이스합니다.

다르게 행동하다컨테이너, 쿠버네티스, CNI. 새로운 컨테이너 인터페이스가 항상 생성됩니다. 따라서 매개변수만 변경하면 default새 컨테이너에서 생성된 새 인터페이스에 적용되지만 기존 컨테이너 인터페이스나 호스트 인터페이스에는 적용되지 않습니다. 이것은 매우 혼란스러울 수 있습니다!

net.ipv{4,6}.conf.all.*그리고net.ipv{4,6}.conf.<net device>.*

@gaia와 @odivlad가 지적했듯이 의 동작은 net.ipv{4,6}.conf.all.*변경되는 매개변수에 따라 달라집니다. 실제 대답은 커널 문서에 있으며 시간이 지남에 따라 변경되었습니다( 의 경우와 마찬가지로 rp_filter다중 홈 시스템에서 널리 사용되는 매개 변수입니다). 위의 Martin의 답변은 정확하지만 이제는 구식입니다.

이 기능의 동작은 다음 위치에서 찾을 수 있는 커널 문서에 문서화되어 있습니다.https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt또는https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/Documentation/networking/ip-sysctl.txt?h=linux-4.15.y (오른쪽 상단에서 특정 커널 버전을 선택하십시오).

예를 들어, 값rp_filter극대화될 것이다(앞서 언급했듯이 AND 연산이 아님):

The max value from conf/{all,interface}/rp_filter is used
when doing source validation on the {interface}.

arp_filter, 반면에,예 또는 작동:

arp_filter for the interface will be enabled if at least one of
conf/{all,interface}/arp_filter is set to TRUE,
it will be disabled otherwise

하지만 약 accept_ra? 훌륭한,커널 4.15 문서이 경우 동작은 지정되지 않았으며 실제로 인터페이스별로 IIRC에서는 더 이상 허용되지 않습니다. 예전에는 커널 2.6(CentOS 6 등)에서 허용되었습니다.

답변3

accept_rain 의 핸들러는 net/ipv6/addrconf.c입니다 proc_dointvec. 따라서 일반 인터페이스 코드는 이전에 all인터페이스별 항목의 배열을 생성했으며, sysctl또는 procfs를 사용하여 해당 항목을 작성하면 단순히 지정한 값을 배열에 넣습니다.

우리가 관심을 갖는 것은 이러한 값을 어떻게 사용하는가입니다.

ipv6_accept_ra()include/net/ipv6.h각 호출자가 특정 인터페이스를 사용하여 함수를 호출한다는 것을 함수 호출자로부터 확인할 수 있습니다 .

net.ipv6.conf.all.accept_ra따라서 내가 아는 한 procfs 항목을 저장하는 것 외에는 커널의 다른 곳에서는 사용되지 않습니다.

하나의 명령으로 각 인터페이스를 변경 하려면 accept_ra다음을 수행할 수 있습니다.

for TUNABLE in $(sysctl -aN --pattern "accept_ra$")
do
    sysctl -w "$TUNABLE=0"
done

4년 정도 늦었지만 이게 정답이에요 :P

관련 정보