This is a macOS network wrapper to imitate GNU/Linux iproute2 suite, inspired by the iproute2mac project.
Command ip
:
objects | implemented | supported | note |
---|---|---|---|
address |
yes | yes | |
address |
yes | yes | |
addrlabel |
no | ? | IPv6 protocol address label |
maddress |
no | ? | |
route |
yes | yes | |
rule |
no | ? | (e.g. source based routing with FreeBSD...) |
neighbor |
yes | yes | using ARP for IPv4 and NDP for IPv6 |
ntable |
no | ? | |
ntbl |
no | ? | |
link |
yes | yes | |
l2tp |
no | ? | |
fou |
no | ? | IP-IP tunnel over UDP? |
ila |
no | ? | IPv6 Identifier Locator Addressing |
macsec |
no | no | |
tunnel |
no | yes | IP-IP only |
tuntap |
no | ? | Tunnelblick third party tuntaposx? |
token |
no | ? | May be related to non-numeric IPv6 mask? |
tcpmetrics |
no | ? | |
monitor |
no | no | |
xfrm |
no | no | |
mroute |
no | ? | See Max OS: no multicast route for 127.0.0.1 |
mrule |
no | ? | |
netns |
no | no | |
netconf |
no | yes | |
vrf |
no | ? | Virtual Routing and Forwarding |
sr |
no | ? | IPv6 Segment Routing management |
nexthop |
no | ? | |
mptcp |
no | no | Multipath TCP |
ioam |
no | ? | IPv6 In-situ OAM (IOAM) |
help |
yes | yes | |
stats |
no | ? |
Command bridge
:
objects | implemented | supported | note |
---|---|---|---|
link |
yes | yes | show only |
fdb |
yes | yes | show only |
Examples:
ip address [ list | show ]
ip address { add | change | replace | delete }
ip link [ list | show ]
ip link { add | set | change | delete }
ip route [ list | show ]
ip route { add | change | replace | delete }
ip route get
ip neigh [ list | show ]
ip neigh flush
bridge link [ list | show ]
bridge fdb [ list | show ]
The preferred method of installation is Homebrew.
In order to use this tap, you can install directly the package:
brew install signal-09/tap/iproute4mac
Or subscribe the tap repository and then install the package:
brew tap signal-09/tap
brew install iproute4mac
Create a Virtual Environment and upgrade pip
module:
python3 -m venv venv
source venv/bin/activate
python3 -m pip install -U pip
Then install iproute4mac
:
python3 -m pip install iproute4mac
iproute4mac try to imitate as much as possible the look & feel of the GNU/Linux iproute2 suite, but macOS (Darwin) is a BSD derivative, and some aspects cannot be replicated at all.
Implemented syntax:
ip address [ show [ dev IFNAME ] [ master DEVICE | nomaster ] [ type TYPE ] [up] ]
TYPE := { bond | bond_slave | bridge | bridge_slave | feth5 | vlan }
Shows IPv4 and IPv6 addresses assigned to all network interfaces. The ‘show’ subcommand can be omitted:
ip address show
Same as above except that only IPv6 addresses assigned to active network interfaces are shown:
ip -6 address show up
Shows IPv4 and IPv6 addresses assigned to network interface en0 in pretty printed JSON:
ip -j -p address show dev en0
Shows IPv4 only addresses assigned to networks member of bridge0:
ip -4 address show master bridge0
Shows IP addresses belonging to private C class network 192.168.0.0/24:
ip address show to 192.168.0.0/24
qdisc
(queuing discipline) is part of the Linux Traffic Control subsystem (TC) managed via thetc
utility. Even if this information is not reported, similar results in traffic control and shaping can be achieved usingdnctl
andpfctl
.address lifetime
for IPv6 addresses (-L flag ofifconfig
) is not provided anymore in Sonoma (macOS 14); for IPv4, addresses valid and prederred lifetime, is supposed forever (0xffffffff = 4.294.967.295 = 32 bit).sysctl net.inet6.ip6.temppltime
specifies the “preferred lifetime” for privacy addresses, in seconds, and defaults to 86400 (one day).sysctl net.inet6.ip6.tempvltime
specifies the “valid lifetime” for privacy addresses, in second, and defaults to 604800 (one week).veth
can be replaced byfeth
in macOS
Implemented syntax:
ip address {add|change|replace} IFADDR dev IFNAME [ LIFETIME ] [ CONFFLAG-LIST ]
{change|replace}
option “really” change address properties (e.g. broadcast) while Linux simply ignore them.
Implemented syntax:
ip link show [ DEVICE ] [ up ] [ master DEVICE | nomaster ] [ type ETYPE ]
ETYPE := [ TYPE | bridge_slave | bond_slave ]
TYPE := [ bridge | bond ]
Shows the state of all network interfaces on the system:
ip link show
Shows the bridge devices:
ip link show type bridge
Shows the vlan devices:
ip link show type vlan
Shows devices enslaved by bridge0:
ip link show master bridge0
txqlen
(the transmit queue length) is not configurable on specific interface; a system default value is managed viasysctl net.link.generic.system.sndq_maxlen
(ornet.link.generic.system.rcvq_maxlen
).
Implemented syntax:
ip link add [ link DEV ] [ name ] NAME [ address LLADDR ] [ mtu MTU ] type TYPE [ ARGS ]
Create a VLAN with TAG 100 linked to en1:
ip link add link en1 name vlan100 type vlan id 100
Create a new bridge interface (auto numbering1):
ip link add type bridge
Create a new bridge with a specified name:
ip link add bridge20 type bridge
Create a new static bond (vs lacp) interface:
ip link add bond1 type bond mode active-backup
- macOS
ifconfig
print the created interface name to the standard output
Implemented syntax:
ip link delete { DEVICE | dev DEVICE } type TYPE [ ARGS ]
Delete any kind of virtual interface:
ip link del vlan100
Implemented syntax:
Implemented syntax:
ip route [ show [ SELECTOR ] ]
SELECTOR := [ proto RTPROTO ] [ type TYPE ] [ scope SCOPE ]
TYPE := { unicast | broadcast | multicast | blackhole }
SCOPE := [ host | link | global ]
RTPROTO := [ kernel | static ]
List routes using a specific gateway:
ip route show via 192.168.0.1
List IPv6 routes using a specific network interface:
ip -6 route show dev en1
List routes for multicast:
ip route show type multicast
List availabe routes to reach specific network:
ip route show to match 192.168.1.0/24
List IPv4 and IPv6 routes2
ip route show table all
iif
is not honored (is treated likedev
andoif
).- Route tables are not implemented in macOS (Darwin), but “table all” will result in show IPv4 + IPv6 routes
Implemented syntax:
ip route { add | delete | change | replace } ROUTE
ROUTE := [ TYPE ] PREFIX [ tos TOS ] [ proto RTPROTO ] [ scope SCOPE ]
TYPE := { unicast | broadcast | multicast | blackhole }
SCOPE := [ host | link | global ]
RTPROTO := [ kernel | boot | static ]
Add direct routing on a specific network interface:
ip route add 192.168.22.0/24 dev en1
Change interface for a given route:
ip route change 192.168.22.0/24 dev en0
Replace default gateway:
ip route replace default via 192.168.0.254
Delete route:
ip route del 192.168.22.0/24
Implemented syntax:
ip route get ADDRESS
Shows the route to reach Google DNS 8.8.8.8:
ip route get 8.8.8.8
- NOARP and PERMANENT states are not catched
Same syntax of ip neigh show
Every contribute is welcome!
git clone https://github.com/YOUR-USERNAME/iproute4mac
Before making changes to the project, you should create a new branch and check it out (see “GitHub flow”).
git branch BRANCH-NAME
git checkout BRANCH-NAME
python3 -m venv venv
source venv/bin/activate
Then install requiered packages:
python3 -m pip install -U pip
python3 -m pip install pre-commit pytest pytest-console-scripts
pre-commit install
Ruff is used to enforce coding style. You can checkout the compliance with the following command:
pre-commit run --all-files [--show-diff-on-failure]
Create as few commit as possible to make diff checking easier. In case of modification of already pushed commit, amend it if possible:
git add -A
git commit --amend
git push --force
In case of multiple and not organic commits, “Squash and merge” policy will be applied.