tc를 사용하여 MAC 주소 다시 쓰기

tc를 사용하여 MAC 주소 다시 쓰기

tc저는 아래와 같이 TAP 인터페이스( ) tap0에서 들어오는 패킷의 MAC 주소를 변경 하곤 했습니다 . 여기서 mac_org는 QEMU 가상 머신에 있는 게스트의 MAC 주소이고 는 로 바꿔야 하는 다른 MAC 주소입니다 mac_new.mac_org

tc qdisc add dev tap0 ingress handle ffff:
tc filter add dev tap0 protocol ip parent ffff: \
  flower src_mac ${mac_org} \
  action pedit ex munge eth src set ${mac_new} pipe \
  action csum ip pipe \
  action xt -j LOG

또한 입력 후크에서 UDP 패킷을 기록하기 위해 iptables 규칙을 추가했습니다.

iptables -A INPUT -p udp -j LOG

syslog는 DHCP 검색 패킷이 이에 따라 변경되었음을 보여줍니다. 로그 tc항목은 다음과 같습니다.

IN=tap0 OUT= MAC=ff:ff:ff:ff:ff:ff:${mac_new}:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=338 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=68 DPT=67 LEN=318

tc로컬 수신 패킷이 소켓으로 전달되면 netfilter 입력 후크에 대한 로그 항목이 수신 후크를 따르며 동일한 결과를 표시하지만 형식이 약간 다릅니다.

IN=tap0 OUT= MACSRC=${mac_new} MACDST=ff:ff:ff:ff:ff:ff MACPROTO=0800 SRC=0.0.0.0 DST=255.255.255.255 LEN=338 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=68 DPT=67 LEN=318

QEMU를 시작하기 전에 이것을 실행하여 dnsmasq놀라운 tap0결과를 얻었습니다.

DHCPDISCOVER(tap0) ${mac_org}

대신에 포함된 내용을 strace -f -x -s 10000 -e trace=network dnsmasq ...표시하는 호출을 실행합니다 .recvmsg${mac_org}${mac_new}

recvmsg(4, {msg_name={sa_family=AF_INET, sin_port=htons(68), sin_addr=inet_addr("0.0.0.0")}, msg_namelen=16, msg_iov=[{iov_base="... ${mac_org} ..." ...

어떻게 그런 일이 일어났나요? netfilter 입력 후크 이후에 패킷이 변경된 것 같습니다.

답변1

tc제가 이해한 바에 따르면 수정된 이더넷 주소(링크 계층만 해당)를 클라이언트가 요청에 포함하는 내부 필드(클라이언트의 하드웨어 주소)(애플리케이션 계층은 변경되지 않음)와 혼동하고 있다는 것입니다 .CHADDRDHCPDISCOVERtc

관련 정보