ifconfig eth0 hw ether 00:11:22:33:44:55
or etc. 명령을 사용하여 인터페이스를 껐다가 다시 켜면 ip link set eth0 address 00:11:22:33:44:55
네트워크 인터페이스의 MAC 주소를 변경할 수 있다는 것을 알고 있습니다. 이와 같은 명령은 ip link show eth0
변경이 성공했음을 확인합니다.
하지만 최근에 이 파일을 발견했습니다 /sys/class/net
(원래 출처는 다음과 같습니다).이것답변): 각 디렉토리는 문서의 인터페이스에 대한 정보가 포함된 파일이 포함된 심볼릭 링크입니다.여기예를 들어, 내 컴퓨터에서 이더넷 인터페이스는 enp3s0
(왜 그렇게 이상한 이름을 가지고 있는지 모르겠습니다) /sys/class/net/enp3s0
에 연결되어 있습니다 /sys/devices/pci0000:00/0000:00:1c.2/0000:03:00.0/net/enp3s0
.
address
이 디렉토리에서 인터페이스의 MAC 주소가 포함된 텍스트 파일인 파일을 찾았습니다 . 그러나 위 명령 중 하나를 사용하여 주소를 변경하려고 하면 파일이 address
변경되지 않은 상태로 유지되므로 이 명령은 가장 낮은 수준의 MAC 주소를 변경하지 않는 것 같습니다. 또한 이 파일을 어떤 식으로든 변경할 수 없습니다. 심지어 슈퍼유저도 이를 수행할 권한이 없습니다.
이제 궁금합니다. 이 수준에서 네트워크 인터페이스의 MAC 주소를 변경할 수 있습니까?
답변1
배경
/proc
파일 /sys
시스템은 단지 커널 구조의 뷰일 뿐이며 두 파일 시스템 모두 메모리에 상주합니다. 두 파일 시스템 모두 쓰기 가능하지만(그 안에 있는 파일 중 일부는 쓰기 가능) 실제 파일 시스템과 동일하게 작동한다고 가정하는 것은 현명하지 않습니다.
파일 내부에 쓰거나 후크로 끝난 다음 함수로 호출할 /proc
수 있는 작업입니다. /sys
예를 들어:
# echo 3 > /proc/sys/vm/drop_caches
실제로 파일에 쓰는 것이 아니라 사용자 공간 커널 함수를 호출합니다.
특정 쓰기에 대해 정의된 함수가 없으면 다음을 얻게 됩니다.
write error: Input/output error
파일에 쓰는 것이 의미가 없기 때문입니다. 이는 관련 드라이버가 없는 USB 장치의 문자 장치에 쓰는 것과 다르지 않습니다. 커널은 무엇을 해야할지 모릅니다.
에 대한 쓰기에 대해 정의된 기능이 없으므로 /sys/class/net/enp3s0/address
이는 이 인터페이스의 MAC 주소를 변경하는 실행 가능한 방법이 아닙니다.
ifconfig
전화하지 않고도 MAC 주소를 변경할 수 있나요 ip link set
?
그래 넌 할수있어.
코드를 보면 iproute2
많은 매개변수 구문 분석과부르다rtnl_talk
. 다음과 같습니다(문서 참조 ip/iplink.c
).
/* lot of argument parsing and `req` setting */
if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0)
exit(2);
return 0;
req.n
여기서 MAC 주소가 rnetlink
함수 에 전달됩니다 rtnl_talk
( man rnetlink
여기서 관련됨). 이 호출을 수행하는 프로그램을 작성하면 시스템 호출이 발생하고 MAC 주소가 업데이트됩니다. 그러나 그때도 똑같은 일을 하게 될 것입니다 ip link set
.
답변2
더 높은 수준(예: Network Manager 사용)에서 MAC 주소를 변경해도 실제 MAC 주소는 변경되지 않습니다. 실제 MAC를 입력한 MAC에 연결하도록 시스템을 "속이고" 있습니다. 물리적 MAC 주소는 생산 중에 네트워크 카드에 기록되며 하드웨어를 변경하지 않으면 변경할 수 없습니다.