![更改路由数据包的源 MAC 地址](https://linux22.com/image/665129/%E6%9B%B4%E6%94%B9%E8%B7%AF%E7%94%B1%E6%95%B0%E6%8D%AE%E5%8C%85%E7%9A%84%E6%BA%90%20MAC%20%E5%9C%B0%E5%9D%80.png)
我有一个 Linux 机器,它有一个网络接口,并且启用了 IP 转发。假设我的 IP 地址是192.168.1.1
,MAC 地址是11:11:11:11:11:11
。当一个不是发往我主机的数据包到达时,它会被内核路由,并且传出的数据包的源 MAC 地址是11:11:11:11:11:11
,即我主机的 MAC 地址。我想改变这种行为,并为所有路由的数据包设置一个预定义的源 MAC 地址。是否可以使用 Linux 中可用的标准网络工具实现这一点?如果不能,是否可以使用 pcap 之类的库在用户空间中实现这一点?
答案1
对于使用 iptables 标记为 0x2 值的数据包:
IP_ADDR_ETH0=`ifconfig eth0 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n'`
iptables -t mangle -A OUTPUT -s ${IP_ADDR_ETH0} -p udp --match multiport --dports 319,320 -o eth0 -j MARK --set-mark 2
tc filter add dev eth0 parent 15:0 protocol ip prio 1 handle 0x2 fw action pedit ex munge eth src set ${MAC_ADDR_ETH1} pipe \
action pedit ex munge ip src set ${IP_ADDR_ETH1}