sysctl에서 이러한 키에는 , 각 네트워크 인터페이스에 대한 키라는 하위 키가 있습니다 /proc/sys/net/ipv[46]/conf/
. 예를 들어 단일 네트워크 인터페이스인 eth0이 있는 컴퓨터에서는 다음과 같습니다.all
default
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_ra
in 의 핸들러는 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