Technical Forum
Ask questions. Discover Answers.
Showing results for 
Search instead for 
Did you mean: 

iRule DNS response code


I have several DNS nodes that I am sending traffic to.


I would like to write a rule that selects either a new pool or node if in the event one of my servers responds with a serv fail rcode in the DNS header in the DNS response.


Is this possible?


F5 Employee
F5 Employee

Hi Phil,


I assume that you want to send the CURRENT request to the other node ie not subsequent requests ( as that is simple, just do an LB::reselect )


On the basis that you can do anything on the BIG-IP, yes it is possible. How it is possible is a bit more complex. 😀


Essentially, to do this you have to store the request data for all DNS requests and in the case of failure then you send them to a different node. The first point is that this means you will be storing a lot of extra data which will cause higher memory utilisation and is probably not a good idea - do not store client data on intermediate devices.


If you still want to do it, you can grab the payload and store it, if you get a serv fail then send the payload via sideband to the other node and respond to the client with the response ( i'll leave you to ponder what to do if you receive a second serv fail ).

If you want to do this in a nice, systemic and scalable way you can use the Message Routing Framework (MRF) function but that needs a bit more thought on your part.



when DNS_REQUEST { UDP::collect } when CLIENT_DATA { set payload [UDP::payload] } when DNS_RESPONSE { if response == servfail set sb [connect -proto UDP <destination>] send $sb $payload recv $sb response UDP::respond $response } }