In Japan, there are many locations (e.g. airport, convenience store, train stations, ...) where there is free wifi available. Usually, the wifi connection here is limited in specific time range (e.g. 1 hour). After the connection expires, you have to connect to the wifi again and obtain new access session.

It happens to me when I traveled to other countries, stayed in an environment which limits wifi connection. There, wifi is free only in the first session. To continue the access, an extra payment is requested.

Technically, the only way wifi router can track a device and check if the device has finished the free session or not, is by MAC address. Thus, if MAC address is changed, technically, the wifi router has no idea on tracking device. Cookie can be used, however, cookie is too easily to be manipulated by end user.

I write this post for technical purpose. And I do not recommend using this way to avoid a have-to-pay bill. Non-free wifi is usually cheap and it is not worth to pay too much effort to avoid such a small amount payment.


Why?

On each device which supports wifi connection, there is wifi card. This wifi card requires a driver (so called network driver) to be used. For example, to provide device information (MAC address) to wifi router, encode/decode data to physical layer signal data.

Network driver is a "soft"ware, programmed, thus it can be changed, configured via software. Usually, default network driver is provided by operating system.

Changing MAC address requires sudo (root) privilege. As a result, if you want to do the change in smartphone device, technically, it requires your smartphone to be rooted.


How?

My current ubuntu version via lsb_release -a is as follows

No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.3 LTS
Release:	18.04
Codename:	bionic

Step 1: check interface name and current MAC address

sudo ifconfig

Result looks like

wlp4s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.106  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::ed2b:844f:3c9f:315d  prefixlen 64  scopeid 0x20<link>
        ether b4:d5:bd:93:3c:99  txqueuelen 1000  (Ethernet)
        RX packets 417159  bytes 351029164 (351.0 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 236165  bytes 94066903 (94.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Interface name here is wlp4s0, current MAC address is b4:d5:bd:93:3c:99.

From this MAC address, you can choose any new MAC address as you want.
MAC address is 48 bits (6 bytes) long, which includes 24-bit OUI (Organizational Unique Identifier) and 24-bit vendor-assigned address.
You should change the latter 24-bit, and should not change the first 24-bit OUI. Otherwise, wifi router could not recognize your device and use wrong protocol at low level network layer (physical layer, network layer, ...)

For example, I choose my new MAC address as b4:d5:bd:93:3d:99.

Step 2: stop network driver

sudo /etc/init.d/networking stop

Or

sudo systemctl stop networking

Step 3: de-activate current interface

sudo ifconfig wlp4s0 down

Step 4: change MAC address

sudo ifconfig wlp4s0 hw ether b4:d5:bd:93:3d:99

Step 5: activate the network interface

sudo ifconfig wlp4s0 up

Step 6: confirm the new configuration

sudo ifconfig wlp4s0

Check if the new MAC address has been assigned.

Step 7: enable network driver

sudo /etc/init.d/networking start

or

sudo systemctl start networking

Note: this method only works in current login session. The change will be reversed after a logout or a restart. To permanently change MAC address, refer to the following source.

Source