IPTables: The MARK Target
Load balancing for High Availability and Disaster Recovery with LVS and Keepalived is fun, and quite powerful. One of the most useful aspects is that you can use IPTables with the MARK target to select what traffic is routed to a set of real servers. Its a lot more powerful than simple IP or IP/port combinations.
For example, a specific service may have a web site as well as another protocol. Printing uses the IPP protocol and we have a web site documenting our printing system. With the above trick you can create one virtual IP and have web traffic directed to a pool of web servers doing virtual hosting of many sites. IPP traffic on a different port gets routed to a pool of Cups servers that do not maintain any web infrastructure. End users only have to remember one DNS name.
However, remember that the MARK target is one of IPTables’
non-terminating-targets. It doesn’t stop the packet from being
processed by later iptables rules and possibly other MARK targets. So
your iptables rules need to be in order from least specific to most
specific. With the above example, let’s say all traffic goes to the
Cups pool and only web traffic gets redirected to the Apache pool. Your
snippet that lives in
/etc/sysconfig/iptables will look something like
*mangle -A PREROUTING -d 10.0.0.5 -p tcp -m tcp -j MARK --set-mark 0xc -A PREROUTING -d 10.0.0.5 -p tcp -m tcp --dport 80 -j MARK --set-mark 0xA -A PREROUTING -d 10.0.0.5 -p tcp -m tcp --dport 443 -j MARK --set-mark 0xA
Where 10.0.0.5 is the print service’s Virtual IP and our LVS configuration is set to direct firewall mark 0xC to the Cups pool and 0xA to the web pool.