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