linux手动、自动更改网卡MAC地址的方法

前言

一块网卡的mac地址在出厂时已经写入,有时候是写入可以擦写的rom中,但是要有相当的专业技术或专业的设备。

对于一些绑定了mac地址,更换了设备后又不想更换mac的,就需要修改mac地址了。

查看网卡MAC地址

使用ip命令就能查看MAC地址了:

ip link show ${interface}
2: enp0s25: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
 link/ether f0:de:f1:ad:1d:f0 brd ff:ff:ff:ff:ff:ff

其中 link/ether 后面那一串用 : 分割的6字节十六进制数就是网卡的MAC地址了,也就是 f0:de:f1:ad:1d:f0

手工修改MAC地址

使用ip命令也能修改MAC地址,但是需要root权限:

1、禁用网卡

sudo ip link set dev ${interface} down

2、修改MAC地址

有的网络运营商可能会拒绝为不正确的 MAC 分配 IP 地址,因此推荐前三个字节用真实的MAC地址前缀,后三个字节可以随机更改。

sudo ip link set dev ${interface} address ${new_mac}

我们再查看一下网卡的MAC地址

ip link show ${interface}
2: enp0s25: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
 link/ether f0:de:f1:ff:ff:ff brd ff:ff:ff:ff:ff:ff

你会发现网卡已经被改成新的MAC地址了.

3、最后重启网卡

sudo ip link set dev ${interface} up

自动更改

systemd-networkd服务能通过 link 文件(底层物理网络设备配置)来设置MAC地址

我们通过 [Match] 小节来匹配某个网卡,然后通过 [Link] 小节来对网卡进行配置

Match小节

如果 “[Match]” 小节中的每一项都与某个网卡匹配, 那么视为该Link文件与该网卡匹配。若 “[Match]” 小节为空则表示匹配任意网卡。

所有可用于匹配的选项如下:

MACAddress

匹配网卡的物理地址(MAC地址)

OriginalName

匹配网卡的”INTERFACE”属性值(网卡的内核名称)。 接收一个空格分隔的匹配模式列表(使用shell风格的通配符)。 不可用于匹配已经被用户空间改了名字的网卡。 应该小心使用此选项, 因为网卡的内核名称有可能是不稳定的。

Path

匹配网卡的 “ID_PATH” 属性值(网卡的总线路径)。 接收一个空格分隔的匹配模式列表(使用shell风格的通配符)。

Driver

匹配网卡的 “DRIVER” 属性值(网卡的驱动名称)。 接收一个空格分隔的匹配模式列表(使用shell风格的通配符)。 注意,如果网卡的 “DRIVER” 属性不存在, 那么将使用 “ethtool -i” 命令中输出的驱动名称。

Type

匹配网卡的 “DEVTYPE” 属性值(网卡的设备类型)。 接收一个空格分隔的匹配模式列表(使用shell风格的通配符)。

Host

匹配主机的 hostname 或”machine ID”,参见 systemd.unit(5) 中的 “ConditionHost=” 选项。

Virtualization

检查是否运行于特定的虚拟环境中, 参见 systemd.unit(5) 中的 “ConditionVirtualization=” 选项。

KernelCommandLine

检查是否设置了(或者以”!”开头表示未设置)特定的内核引导选项, 参见 systemd.unit(5) 中的 “ConditionKernelCommandLine=” 选项。

Architecture

检查是否运行于特定的硬件平台, 参见 systemd.unit(5) 中的 “ConditionArchitecture=” 选项。

Link小节

Link小节可以对网卡进行多种配置,其中与修改MAC有关的选项有:

MACAddressPolicy

应该如何设置网卡的MAC地址:

“persistent”

如果内核使用了网卡硬件固有的MAC地址(绝大多数网卡都有), 那么啥也不做,直接使用内核的MAC地址。 否则,将会随机新生成一个 确保在多次启动之间保持固定不变的MAC地址(针对给定的主板与网卡)。 自动生成MAC地址的特性 要求网卡必须存在 ID_NET_NAME_* 属性, 否则无法自动生成MAC地址。

“random”

如果内核使用了随机生成的MAC地址(而不是网卡硬件固有的MAC地址), 那么啥也不做,直接使用内核的MAC地址。 否则,将在网卡每次出现的时候(一般在启动过程中)随机新生成一个MAC地址。 无论使用上述哪种方式生成的MAC地址, 都将设置 “unicast” 与 “locally administered” 位。

“none”

无条件的直接使用内核的MAC地址。

MACAddress

在未设置 “MACAddressPolicy=” 时所使用MAC地址。

另外,Link小节中,我们必须为某个网卡进行命名,因此肯定会有 NamePolicy 或者 Name 选项

NamePolicy

应该如何设置网卡的名称, 仅在未使用 “net.ifnames=0″ 内核引导选项时有意义。 接受一个空格分隔的策略列表, 顺序尝试每个策略,并以第一个成功的策略为准。 所得的名字将被用于设置网卡的 “ID_NET_NAME” 属性。 注意,默认的udev规则会用 “ID_NET_NAME” 的值设置 “NAME” 属性(也就是网卡的名称)。 如果网卡已经被空户空间命名,那么将不会进行任何重命名操作。 可用的策略如下:

“kernel”

如果内核已经为此网卡设置了固定的可预测名称, 那么不进行任何重命名操作。

“database”

基于网卡的 “ID_NET_NAME_FROM_DATABASE” 属性值(来自于udev硬件数据库)设置网卡的名称。

“onboard”

基于网卡的 “ID_NET_NAME_ONBOARD” 属性值(来自于板载网卡固件)设置网卡的名称。

“slot”

基于网卡的 “ID_NET_NAME_SLOT” 属性值(来自于可插拔网卡固件)设置网卡的名称。

“path”

基于网卡的 “ID_NET_NAME_PATH” 属性值(来自于网卡的总线位置)设置网卡的名称。

“mac”

基于网卡的 “ID_NET_NAME_MAC” 属性值(来自于网卡的固定MAC地址)设置网卡的名称。

Name

在 NamePolicy= 无效时应该使用的网卡名称。 无效的情况包括: (1)未设置 NamePolicy= ; (2)NamePolicy= 中的策略全失败; (3)使用了”net.ifnames=0″内核引导选项

注意, 千万不要设置可能被内核用于其他网口的名称(例如 “eth0″), 这可能会导致 udev 在分配名称时与内核产生竞争, 从而导致不可预期的后果。 最好的做法是使用一些永远不会导致冲突名称或前缀,例如: “internal0″”external0″ 或 “lan0″”lan1″/”lan3″

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • python在windows和linux下获得本机本地ip地址方法小结

    本文实例总结了python在windows和linux下获得本机本地ip地址方法.分享给大家供大家参考.具体分析如下: python的socket包含了丰富的函数和方法可以获得本机的ip地址信息,socket对象的gethostbyname方法可以根据主机名获得本机ip地址,socket对象的gethostbyname_ex方法可以获得本机所有ip地址列表 第一种方法:通过socket.gethostbyname方法获得 import socket localIP = socket.gethos

  • Linux通过命令仅获取IP地址的方法

    一同事的朋友正在参加笔试,遇到这么一个问题让他帮忙解决,结果同事又找到我帮他搞定.真是感慨:通讯发达在某些方面来说,真不知是不是好事啊!题目大致如下所示,一般我们使用ifconfig查看网卡信息,请问你可以通过什么命令,让其只输出IP地址192.168.42.128 看似简单的问题,实现起来也不是太简单.看看下面的思路吧 [root@DB-Server ~]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0C:29:9E:70:0E inet

  • Linux端口映射转发的方法

    前言 当我们在对接第三方的时候,免不了会遇到白名单限制问题,导致我们本地开发环境受限,不能调用接口.难以完成整个业务流程. 分析如下场景: 比如第三方有台机器 IP 为 1.1.1.1  端口8080 正式环境为1.1.1.1:8080/pro/api 测试环境为1.1.1.1:8080/test/api 但是第三方的机器不允许任何IP都可以调用,他们只允许你方一台机器加入白名单 比如你线上的一台机器IP是2.2.2.2已经加入白名单,这没问题. 但是你要做开发 要调用他们测试环境的API,却发

  • vmware 实现linux目录映射window本地目录图文详解

    ---恢复内容开始--- 背景: 1,使用lnmp环境 2,代码可以在windows上面写,直接映射到linux的lnmp环境下面 第一步: vmware 新建一个linux虚拟机 一路下一步到完成 第二步: 安装镜像(自己去下载一个linux的镜像) 然后确认 ,然后重新客户机 然后一路next(语言可以选中文) 直到这一步 给linux设置密码 然后一路next,确认所有修改 第三步: 进入linux系统配置网络 修改下图路径中的文档(onboot改成yes) 修改完保存 重启网络 第四步:

  • linux 使用NSF 映射远程磁盘目录的实现

    假设源目录在192.168.1.1机器上,目录为/data 客户端集群在192.168.1.2, 需要将192.168.1.1机器上的/data目录到本地的/data目录 1.在两台机器上安装nsf . portmap yum  install  nfs-utils  portmap 安装好了之后. 2.在192.168.1.1机器上面修改/etc/exports文件,加入如下内容 /data/ 192.168.1.2(rw,sync,no_root_squash)表示开放本机器上面/data目

  • Linux下Python获取IP地址的代码

    <lnmp一键安装包>中需要获取ip地址,有2种情况:如果服务器只有私网地址没有公网地址,这个时候获取的IP(即私网地址)不能用来判断服务器的位置,于是取其网关地址用来判断服务器在国内还是国外(脚本为了使国内用户快速下载,yum源自动设置成163,这个情况就需要获取网关地址):如果服务器有公网地址,这时获取的IP地址可用来直接判断服务器地理位置. 获取服务器IP,如果有公网地址就取公网地址,没有公网地址就取私网网址 下面是之前我用shell来获取本地IP脚本: IP=`ifconfig | g

  • Linux下修改Oracle监听地址的方法

    lisenter.ora 目录在 /opt/oracle/11g/network/admin LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.111.123)(PORT = 1521)) ) ) ADR_BASE_LISTENER = /opt/oracle tnsnames.o

  • php获取服务器端mac和客户端mac的地址支持WIN/LINUX

    获取服务器mac 复制代码 代码如下: <?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetmacAddr{ var $result = array(); // 返回带有MAC地址的字串数组 var $macAddr; /*构造*/ function __construct($osType){ switch ( strtolower($osType) ){ case "unix": break;

  • linux虚拟机配置静态IP地址的完整步骤

    前言 在很多时候我们都会用到虚拟机,比如一些测试没检测,练习的东西可以在虚拟机上,不必担心会搞坏什么,本文主要给大家介绍了linux虚拟机配置静态IP地址的相关内容,下面话不多说了,来一起看看详细的介绍吧 步骤如下: 1.命令行调用 vi /etc/sysconfig/network-scripts/ifcfg-eth0 命令行.png 2.上面红色的内容需要修改,需要输入i进入编辑模式 ipconfig 对应自己需要生成的ip地址 DNS1和GATEWAY对应自己的网关地址 GATEWAY对应

  • linux下改变键盘映射解决方案

    linux xmodmap修改键盘映射Caps_Lock和Super_L互换 换awesome窗口管理器去了.由于ubuntu的unity还是不太稳定.偶尔卡住半天,受不了果断会曾经的awesome.话说用Win/Super的时候太多了.琢磨了半天还是不太习惯,想着还是把Caps lock和super给换一下. 用~$ xev |grep keycode 按要互换的两个键的到以下信息: 1 state 0×50, keycode 133 (keysym 0xffeb, Super_L), sam

  • Linux内核设备驱动地址映射笔记整理

    #include <asm/io.h> #define ioremap(cookie,size) __arm_ioremap(cookie, size, MT_DEVICE) //cookie表示物理地址, size表示映射大小. ioremap把指定的物理地址映射到空闲的虚拟地址 void __iomem * __arm_ioremap(unsigned long phys_addr, size_t size, unsigned int mtype) { return __arm_iorem

随机推荐