Unlike Linux systems where IP forwarding is managed through /proc/sys/net/ipv4/ip_forward
and iptables, macOS uses different mechanisms for network packet forwarding. The BSD-derived Darwin kernel handles this through sysctl and pf (packet filter) configurations.
The macOS equivalent of Linux's echo 1 > /proc/sys/net/ipv4/ip_forward
is:
sudo sysctl -w net.inet.ip.forwarding=1
To make this change persistent across reboots:
echo 'net.inet.ip.forwarding=1' | sudo tee -a /etc/sysctl.conf
For the iptables equivalent (iptables -A FORWARD -j ACCEPT
), macOS uses pf (packet filter). Create or edit /etc/pf.conf
:
# Load anchor file
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
# Enable packet forwarding
set skip on lo0
pass in quick proto tcp from any to any
pass out quick proto tcp from any to any
Then enable and load the rules:
sudo pfctl -e
sudo pfctl -f /etc/pf.conf
Check if IP forwarding is active:
sysctl net.inet.ip.forwarding
Verify pf status:
sudo pfctl -s info
Here's how to configure macOS as a NAT gateway between en0 (Ethernet/WiFi) and en1 (another interface):
# Enable IP forwarding
sudo sysctl -w net.inet.ip.forwarding=1
# Configure NAT in pf.conf
nat on en1 from en0:network to any -> (en1)
# Enable and load rules
sudo pfctl -e
sudo pfctl -f /etc/pf.conf
If forwarding isn't working:
- Check that no firewall is blocking traffic (System Preferences > Security & Privacy)
- Verify interface names with
ifconfig
- Check system logs with
log show --predicate 'process == "pfctl"' --last 1h
For IPv6 forwarding, use:
sudo sysctl -w net.inet6.ip6.forwarding=1
Remember that recent macOS versions may require additional permissions for network configuration changes.
Unlike Linux which uses /proc/sys/net/ipv4/ip_forward
, macOS handles IP forwarding through BSD-style system controls. The equivalent functionality requires modifying sysctl parameters and configuring pf (packet filter), macOS's native firewall.
1. Enable IP forwarding:
sudo sysctl -w net.inet.ip.forwarding=1
To make this persistent across reboots:
echo "net.inet.ip.forwarding=1" | sudo tee -a /etc/sysctl.conf
2. Configure packet forwarding rules (pf equivalent to iptables):
First, create or edit the pf configuration file:
sudo nano /etc/pf.conf
Add these rules (example for basic forwarding between en0 and en1):
# Enable packet forwarding
set skip on lo
pass in quick proto tcp from any to any
pass out quick proto tcp from any to any
NAT configuration example:
# Enable NAT between en0 (WAN) and en1 (LAN)
nat on en0 from en1:network to any -> (en0)
Port forwarding example:
# Forward port 80 to internal IP
rdr pass on en0 proto tcp from any to any port 80 -> 192.168.1.100 port 80
Check current forwarding status:
sysctl net.inet.ip.forwarding
To load pf rules:
sudo pfctl -f /etc/pf.conf
sudo pfctl -e
View active rules:
sudo pfctl -sr
For real-time monitoring:
sudo pfctl -si
For high-throughput forwarding scenarios, consider these optimizations:
# Increase pf table limits
set limit states 1000000
set limit src-nodes 100000