Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WSL 2 - Static MAC Address or Changing MAC After Booting Without Breaking Internet Connection #5352

Open
notusedanymore2 opened this issue Jun 6, 2020 · 38 comments
Labels
needs-investigation likely actionable and/or needs more investigation network

Comments

@notusedanymore2
Copy link

notusedanymore2 commented Jun 6, 2020

Environment

Windows build number: 10.0.19041.264
Your Distribution version: Ubuntu 20.04
Whether the issue is on WSL 2 and/or WSL 1: WSL 2

Steps to reproduce

sudo ip link set dev eth0 down
sudo ip link set dev eth0 address 00:15:5d:09:b0:a0 # or any address, which will be fixed
sudo ip link set dev eth0 up

Expected behavior

IPv4 and IPv6 address can change(and would change), but the connection to the local physical machine and internet should be OK.

Actual behavior

I cannot use any program that requires to connect to the internet and GUI program which is attached to the local physical machine's vcxsrv X server.

@therealkenc
Copy link
Collaborator

Was able to repro here.

@therealkenc therealkenc added the needs-investigation likely actionable and/or needs more investigation label Jun 7, 2020
@notusedanymore2
Copy link
Author

sudo ip route add default via (windows_side_ipconfig_vEthernet_ip) dev eth0 doesn't help.

@therealkenc
Copy link
Collaborator

therealkenc commented Jun 9, 2020

Yeah, I was all ready to dupe this user-error variation #4454 when you posted, but quickly figured out that's not it. I also looked to see if there was a way to modify the adapter properties from the Windows side (by mashing keys in powershell) but had no luck. I did find that putting the MAC address back the way it was does enable packets to route properly again. Which is of no use at all, except for the data point the damage is reversible.

@Biswa96
Copy link

Biswa96 commented Jun 9, 2020

if there was a way to modify the adapter properties from the Windows side

HcnCreateNetwork -> HcnCreateEndpoint -> HcsModifyComputeSystem

@mauver15
Copy link

I don't know the peoples in here how the issue faced on this, but I faced the licensing issue from this. Need to static hardware address for using License... Is there any other place to push this issue on Windows?

I'm desperate now.

@notusedanymore2
Copy link
Author

I don't know the peoples in here how the issue faced on this, but I faced the licensing issue from this. Need to static hardware address for using License... Is there any other place to push this issue on Windows?

I'm desperate now.

Same reason. I just wrote a script that changes MAC for before and after checking the license.

@fritut08
Copy link

I have the same issue. I am trying to run MATLAB in WSL2 and get a license error every time I restart the WSL because the mac addresses change.

@mauver15
Copy link

I filed a QnA to docs.microsoft but they commented there is no solution for this...
Sadly, I'm gonna install the VMware or something.

https://docs.microsoft.com/en-us/answers/questions/73672/ubuntu-on-the-wsl2-fixed-mac-address-with-availabl.html

@mauver15
Copy link

I have the same issue. I am trying to run MATLAB in WSL2 and get a license error every time I restart the WSL because the mac addresses change.

Hey fritut08,
I solved the license problem derived from the non-supported static mac address.
Below the guy "therealkenc" mentioned, you can use the "bond0" field to attach the license when issuing licenses.

@fritut08
Copy link

I have the same issue. I am trying to run MATLAB in WSL2 and get a license error every time I restart the WSL because the mac addresses change.

Hey fritut08,
I solved the license problem derived from the non-supported static mac address.
Below the guy "therealkenc" mentioned, you can use the "bond0" field to attach the license when issuing licenses.

Hey mauver15,
it does not work for me since MATLAB seems to use the mac address of eth0 when issuing the license but uses a combination of eth0 and bond0 when checking the license. So, whenever I start MATLAB after a restart of WSL2 it tries to compare the eth0 from when the license was issued with the current "eth0 bond0".

grafik

@mauver15
Copy link

I have the same issue. I am trying to run MATLAB in WSL2 and get a license error every time I restart the WSL because the mac addresses change.

Hey fritut08,
I solved the license problem derived from the non-supported static mac address.
Below the guy "therealkenc" mentioned, you can use the "bond0" field to attach the license when issuing licenses.

Hey mauver15,
it does not work for me since MATLAB seems to use the mac address of eth0 when issuing the license but uses a combination of eth0 and bond0 when checking the license. So, whenever I start MATLAB after a restart of WSL2 it tries to compare the eth0 from when the license was issued with the current "eth0 bond0".

grafik

Ok, I got it.

  1. Set the static mac address of the "bond0" field. Do change mac address to the address you are previously applied at the license.
    And this change does not affect your internet connection.
    (In your uploaded picture, there are two mac addresses that the license looks for. One is from eth0/other one is bond0)
    -> sudo ip link set dev bond0 address XX:XX:XX:XX:XX:XX

  2. Confirm that is your bond0's mac address fixed.

  3. Re-activate your license.

You can do this with the flows I wrote.

@fritut08
Copy link

Ok, I got it.

1. Set the static mac address of the "bond0" field. Do change mac address to the address you are previously applied at the license.
   And this change does not affect your internet connection.
   (In your uploaded picture, there are two mac addresses that the license looks for. One is from eth0/other one is bond0)
   -> sudo ip link set dev bond0 address XX:XX:XX:XX:XX:XX

2. Confirm that is your bond0's mac address fixed.

3. Re-activate your license.

You can do this with the flows I wrote.

No, I do not think the bond0 address is the problem. The bond0 address is not used in the license files after all. It is the eth0 address that is mentioned in the license file. So I would have to change that.

@BoZenKhaa
Copy link

I think I am getting the same issue with Gurobi in WSL2, the licence does not work after reboot due to HostID mismatch. Gurobi-recommended solution is to switch to WSL1.

@notusedanymore2
Copy link
Author

@BoZenKhaa Yeah, but the problem is the performance.

@BoZenKhaa
Copy link

Sorry, I didn't mean that as solution proposal. I wanted to highlight that this issue is affecting not only Matlab licenses and that there are currently no officially recommended solutions within WSL2.

@ailiop
Copy link

ailiop commented Jan 14, 2021

Ok, I got it.

1. Set the static mac address of the "bond0" field. Do change mac address to the address you are previously applied at the license.
   And this change does not affect your internet connection.
   (In your uploaded picture, there are two mac addresses that the license looks for. One is from eth0/other one is bond0)
   -> sudo ip link set dev bond0 address XX:XX:XX:XX:XX:XX

2. Confirm that is your bond0's mac address fixed.

3. Re-activate your license.

You can do this with the flows I wrote.

No, I do not think the bond0 address is the problem. The bond0 address is not used in the license files after all. It is the eth0 address that is mentioned in the license file. So I would have to change that.

I had the same issue with Matlab but was actually able to resolve it by setting a static bond0 address as per @therealkenc's suggestion in #5866. The installer was indeed echoing both bond0 and eth0 addresses, and the license file was looking for the eth0 one, initially. But I got a new license that is tied to the bond0 address and so far it seems to work fine (after a few reboots).

Here are the steps that worked for me:

  1. Log into the MathWorks license center
  2. Select license
  3. Go to "install and activate" tab
  4. Go to "activate to retrieve license file" (under "related tasks")
  5. Click on the "activate a computer" button
  6. Use the static bond0 address as the host ID
  7. Download the license file and replace the old one

I hope this helps, at least specifically for Matlab.

Many thanks to @minmossi, @mauver15, and @therealkenc for their comments and solution! This was a very annoying issue.

@Biswa96
Copy link

Biswa96 commented Jan 14, 2021

the license file was looking for the eth0 one

Why does a program check license status with MAC address of a network interface? That's the most horrible software. 😨

@notusedanymore2
Copy link
Author

@Biswa96 Actually, many programs do like Xilinx Vivado, although I think it's certainly a horrible decision too.

@notusedanymore2
Copy link
Author

@ailiop It's so sad that Xilinx Vivado doesn't even let me change the interface name for checking license. :(

@Seairth
Copy link

Seairth commented Jan 30, 2021

I have another vendor that relies on the MAC for licensing and just got bit by this. As a result, this issue has just made WSL2 useless for our needs. I hope this issues is getting some attention and a patch is forthcoming?

Also, if it's possible to modify this issue's title, can it be changed to something like "WSL 2 - MAC address changes every time network interface is started"?

@saguerraty
Copy link

Anyone know of any updates on this topic?

@PrincessRTFM
Copy link

I'm experiencing the same issue mentioned in the OP, which this thread has since strayed from a little. Regardless of the reason for doing it, changing the MAC address for my eth0 device causes "temporary failure in name resolution" errors; resetting it back to the original then produces "network is unreachable" errors instead. I have two different WSL distros installed - Ubuntu 20.04 and Kali 2021.1 - and changing the MAC from kali (via macchanger -rb eth0 and later macchanger -p eth0) causes these errors in both distros. I've had to completely shut down and restart WSL (wsl --shutdown) in order to get it working again.

Also, if it's possible to modify this issue's title, can it be changed to something like "WSL 2 - MAC address changes every time network interface is started"?

The original issue is about network connection breakage whenever the MAC is changed, not about the address changing when the interface is started.

@tannerjared
Copy link

I have the same issue. I am trying to run MATLAB in WSL2 and get a license error every time I restart the WSL because the mac addresses change.

Hey fritut08,
I solved the license problem derived from the non-supported static mac address.
Below the guy "therealkenc" mentioned, you can use the "bond0" field to attach the license when issuing licenses.

Hey mauver15,
it does not work for me since MATLAB seems to use the mac address of eth0 when issuing the license but uses a combination of eth0 and bond0 when checking the license. So, whenever I start MATLAB after a restart of WSL2 it tries to compare the eth0 from when the license was issued with the current "eth0 bond0".
grafik

Ok, I got it.

  1. Set the static mac address of the "bond0" field. Do change mac address to the address you are previously applied at the license.
    And this change does not affect your internet connection.
    (In your uploaded picture, there are two mac addresses that the license looks for. One is from eth0/other one is bond0)
    -> sudo ip link set dev bond0 address XX:XX:XX:XX:XX:XX
  2. Confirm that is your bond0's mac address fixed.
  3. Re-activate your license.

You can do this with the flows I wrote.

This worked for me. I didn't need to reactivate my license, I just set my bon0 to the Host ID from my activated license and matlab started right up from the command line.

@hzn18
Copy link

hzn18 commented Dec 11, 2021

I think I am getting the same issue with Gurobi in WSL2, the licence does not work after reboot due to HostID mismatch. Gurobi-recommended solution is to switch to WSL1.

I switch to WSL1 but this problem still exists. For WSL1, the hostid still changed after rebooting

@Biswa96
Copy link

Biswa96 commented Dec 11, 2021

It is possible to add new virtual network interface with a new MAC address using this workaround #7395. But it taps into some undocumented and dangerous APIs.

@tanguy-e
Copy link

I used the intelFPGA suites and it seems that it checks only eth0 and i can't change this. So i need to put a fixed MAC ADRESS to eth0 ...

@darchons
Copy link

For software that only checks eth0, I'm using a workaround involving changing the bond0 interface name to eth0. For example, something like this in .bashrc:

mac=7b:6c:2a:30:2b:08
gateway=$(ip route | awk '/default via /{print $3; exit}' 2>/dev/null)
if ! ip link show | grep -q $mac; then
    sudo ip link set dev eth0 down
    sudo ip link set dev eth0 name eth1
    sudo ip link set dev eth1 up
    sudo ip route add default via $gateway dev eth1
    sudo ip link set dev bond0 down
    sudo ip link set dev bond0 address $mac
    sudo ip link set dev bond0 name eth0
    sudo ip link set dev eth0 up
fi

The old eth0 is renamed to eth1 but all connections still appear to work after the rename.

@whitepau
Copy link

I am in the same situation as @tanguy-e . Questa does not detect a license, even when I use the script you have. here is my IP setting now:

 ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether  xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether  xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet xxx.xxx.xxx.xxx/20 brd xxx.xxx.xxx.xxx scope global eth1
       valid_lft forever preferred_lft forever
    inet6  xx:xx:xx:xx:xx::xx/64 scope link
       valid_lft forever preferred_lft forever
5: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
6: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0

I note that eth0 still shows the state is DOWN, even after explicitly running the command sudo ip link set dev eth0 up.

@VonAlphaBisZulu
Copy link

VonAlphaBisZulu commented Mar 23, 2022

For software that only checks eth0, I'm using a workaround involving changing the bond0 interface name to eth0. For example, something like this in .bashrc:

mac=7b:6c:2a:30:2b:08
gateway=$(ip route | awk '/default via /{print $3; exit}' 2>/dev/null)
if ! ip link show | grep -q $mac; then
    sudo ip link set dev eth0 down
    sudo ip link set dev eth0 name eth1
    sudo ip link set dev eth1 up
    sudo ip route add default via $gateway dev eth1
    sudo ip link set dev bond0 down
    sudo ip link set dev bond0 address $mac
    sudo ip link set dev bond0 name eth0
    sudo ip link set dev eth0 up
fi

The old eth0 is renamed to eth1 but all connections still appear to work after the rename.

Thanks @darchons this works perfect.
To change my MAC address automatically on WSL startup:

I put your snippet in a bash file "wsl.mac" that I put in /etc/ and that I made executable.

Then I created wsl.conf in /etc/ with the following content:

[boot]
command = sudo /etc/wsl.mac

@AlessandroZavoli
Copy link

For software that only checks eth0, I'm using a workaround involving changing the bond0 interface name to eth0. For example, something like this in .bashrc:

mac=7b:6c:2a:30:2b:08
gateway=$(ip route | awk '/default via /{print $3; exit}' 2>/dev/null)
if ! ip link show | grep -q $mac; then
    sudo ip link set dev eth0 down
    sudo ip link set dev eth0 name eth1
    sudo ip link set dev eth1 up
    sudo ip route add default via $gateway dev eth1
    sudo ip link set dev bond0 down
    sudo ip link set dev bond0 address $mac
    sudo ip link set dev bond0 name eth0
    sudo ip link set dev eth0 up
fi

The old eth0 is renamed to eth1 but all connections still appear to work after the rename.

When I try this approach, I got the following errors

Cannot find device "bond0"
Cannot find device "bond0"
Cannot find device "bond0"
Cannot find device "eth1"

any idea?

@ailiop
Copy link

ailiop commented Apr 12, 2023

Apparently, bond0 and other network devices are not created by default since WSL 1.17, which was released last week. See also #7791.

You can create bond0 manually:

sudo ip link add bond0 type bond

For me, this was sufficient for then setting its MAC address as per #5866 (comment). I suspect the same will be true for cloning eth0 into eth1, etc.

@AlessandroZavoli
Copy link

AlessandroZavoli commented Apr 12, 2023 via email

@kenvix
Copy link

kenvix commented Jul 28, 2023

Ran into the same problem, I needed static MAC addresses for network authentication, so I modified WSLAttachSwitch to add the ability to add NICs with static MAC addresses: you can get my modified version here, if the author hasn't merged it yet

image

image

@luwening
Copy link

sudo ip link add bond0 type bond

Not sure why, after upgrade windows recently, I can not change the mac address,
ip link set eth0 addr XXXXXXXXXXXXX
RTNETLINK answers: Cannot assign requested address

@youyouhdhd
Copy link

Ran into the same problem, I needed static MAC addresses for network authentication, so I modified WSLAttachSwitch to add the ability to add NICs with static MAC addresses: you can get my modified version here, if the author hasn't merged it yet遇到了同样的问题,我需要静态MAC地址进行网络身份验证,因此我修改了WSLAttachSwitch以添加具有静态MAC地址的NIC的功能:如果作者尚未合并,则可以在此处获取我的修改版本。

image

image

大佬,我想问问这个方案还能用吗,我尝试了一下显示“The application to execute does not exist: 'D:**\WSLAttachSwitch.dll'.”,我搜索了一下都没有找到这个文件

@kenvix
Copy link

kenvix commented Dec 28, 2023

Ran into the same problem, I needed static MAC addresses for network authentication, so I modified WSLAttachSwitch to add the ability to add NICs with static MAC addresses: you can get my modified version here, if the author hasn't merged it yet遇到了同样的问题,我需要静态MAC地址进行网络身份验证,因此我修改了WSLAttachSwitch以添加具有静态MAC地址的NIC的功能:如果作者尚未合并,则可以在此处获取我的修改版本。
image
image

大佬,我想问问这个方案还能用吗,我尝试了一下显示“The application to execute does not exist: 'D:**\WSLAttachSwitch.dll'.”,我搜索了一下都没有找到这个文件

作者已经合并此PR,请使用作者的版本。另外我没遇到这种问题
for non Chinese speakers: The author has merged this PR, please use the original version. Besides, I have not encountered this problem

@chanpreetdhanjal
Copy link

Hi. Can you please collect networking logs by following the instructions below?
https://github.com/microsoft/WSL/blob/master/CONTRIBUTING.md#collect-wsl-logs-for-networking-issues

@fritut08
Copy link

I want to add my solution to the already presented bulk as well. Since my original comments (#5352 (comment)) four years ago, a few things changed but this problem still persists. I have since switched machines and reinstalled WSL and MATLAB a few times. Currently, the WSL only has two network devices by default:

ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    ...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1492 qdisc mq state UP group default qlen 1000
    link/ether SOME:MAC:ADDRESS brd ff:ff:ff:ff:ff:ff
    ...

When MATLAB is registered in this situation, the license will include the mac address of eth0. After restarting the machine, the mac address of eth0 changes and MATLAB will complain since it cannot find any device whose mac address matches the one in the license.
Therefore, I simply create an additional network device with the mac address in the license with this command:

sudo ip link add bond0 address SOME:MAC:ADDRESS type bond

Afterwards, MATLAB can be started without license errors.
Unfortunately, this device is lost when the machine is shut down. Therefore, instead of executing the command above after every restart, one can let this command automatically be executed every time WSL is started by adding this to the file /etc/wsl.conf within the WSL:

[boot]
command = ip link add bond0 address 00:15:5d:e1:cf:3f type bond

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
needs-investigation likely actionable and/or needs more investigation network
Projects
None yet
Development

No branches or pull requests