In iptables, the mangle table (-t mangle
) serves a unique purpose distinct from other tables like filter
or nat
. Its primary function is packet header modification at the network layer, particularly useful for advanced traffic control scenarios where you need to alter packet properties without affecting routing decisions.
- No Filtering: Despite being a table, it shouldn't be used for packet filtering (use the
filter
table instead) - No NAT: DNAT/SNAT operations won't work here (those belong in the
nat
table) - Early Processing: The mangle table processes packets early in the netfilter hook sequence
Here are common scenarios where the mangle table shines:
1. Quality of Service (QoS) Marking
# Mark HTTP traffic for special QoS handling
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
# Mark SSH traffic differently
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
2. TCP MSS Clamping (VPN Scenarios)
# Fix MTU/MSS issues for PPTP VPN
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
3. TOS (Type of Service) Modification
# Set TOS for VoIP traffic (minimize delay)
iptables -t mangle -A PREROUTING -p udp --dport 5060 -j TOS --set-tos Minimize-Delay
Choosing the right chain affects when modifications occur:
- PREROUTING: Alter packets as they arrive
- POSTROUTING: Modify packets before transmission
- INPUT/OUTPUT: For locally generated/consumed packets
# Classify packets by protocol
iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -p udp --dport 53 -j MARK --set-mark 0x3
# Then use tc for QoS based on these marks
tc filter add dev eth0 parent 1:0 protocol all handle 1 fw flowid 1:1
tc filter add dev eth0 parent 1:0 protocol all handle 2 fw flowid 1:2
tc filter add dev eth0 parent 1:0 protocol all handle 3 fw flowid 1:3
Always verify your rules with:
iptables -t mangle -L -v -n
And monitor packet flow with:
iptables -t mangle -A PREROUTING -j LOG --log-prefix "MANGLE DEBUG: "
The mangle table in iptables is a specialized chain specifically designed for packet header modification at the network layer. Unlike other tables (filter, nat), its primary purpose is altering packet metadata rather than filtering or address translation.
# Basic mangle table structure
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
Here are scenarios where mangle shines:
- Modifying Type of Service (TOS) or DSCP fields for QoS
- Setting packet marks for advanced routing decisions
- Adjusting Time To Live (TTL) values
- Connection tracking modifications
Example 1: Setting Packet Marks
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
Example 2: QoS Prioritization
iptables -t mangle -A POSTROUTING -p tcp --dport 22 -j TOS --set-tos Minimize-Delay
Example 3: TTL Manipulation
iptables -t mangle -A PREROUTING -s 192.168.1.0/24 -j TTL --ttl-inc 1
Remember these crucial restrictions:
- Never use for packet filtering (use filter table instead)
- NAT operations (DNAT/SNAT) won't work here
- Changes are persistent only within the current network path
Use these commands to verify your rules:
iptables -t mangle -L -v -n
iptables -t mangle -L -v -n --line-numbers