Forum Discussion
jpavel
Jan 10, 2012Nimbostratus
iRule based on SMTP receiver domain
Hello iRule experts,
unfortunately I am an irule beginner and therefore I need some help.
One of our customers would like to direct traffic based on the SMTP receiver domain.
...
nitass
Jan 13, 2012Employee
i just cut small part from James and put it in smtp proxy codeshare. hoping it might be easier for you to see how it works.
[root@ve1023:Active] config b virtual bar list
virtual bar {
snat automap
destination 172.28.19.79:25
ip protocol 6
rules myrule
}
[root@ve1023:Active] config b rule myrule list
rule myrule {
when CLIENT_ACCEPTED {
set chelo ""
set cfrom ""
set crcpt ""
TCP::respond "220\r\n"
log local0. "client accepted"
TCP::collect
}
when CLIENT_DATA {
set cdata [TCP::payload]
if { [ string length $cdata ] <= 0 } {
return
}
if { not ( $cdata contains "\r\n" ) } {
log local0. "get $cdata so far"
return
}
if { $cdata starts_with "HELO" } {
set chelo [TCP::payload]
log local0. "get helo $cdata"
TCP::respond "250 OK\r\n"
TCP::payload replace 0 [string length $chelo] ""
return
}
if { $cdata starts_with "MAIL FROM:" } {
set cfrom [TCP::payload]
log local0. "get from $cfrom"
TCP::respond "250 OK\r\n"
TCP::payload replace 0 [string length $cfrom] ""
return
}
if { $cdata starts_with "RCPT TO:" } {
set crcpt "$crcpt[TCP::payload]"
log local0. "get rcpt $crcpt"
set rcptaddr [regsub -all \[\\r\\n\\s\] [TCP::payload] ""]
set rcptaddr [findstr $rcptaddr ":" 1]
set rcptdomain [findstr $rcptaddr "@" 1]
log local0. "get rcpt domain $rcptdomain"
TCP::respond "250 OK\r\n"
TCP::payload replace 0 [string length [TCP::payload]] ""
if {$rcptdomain equals "abc.com"} {
log local0. "foo1"
pool foo1
} else {
log local0. "foo2"
pool foo2
}
return
}
if { $cdata starts_with "DATA" } {
log local0. "get data $cdata"
TCP::payload replace 0 0 $chelo$cfrom$crcpt
}
log local0. "payload [TCP::payload]"
TCP::release
TCP::collect
}
when SERVER_CONNECTED {
log "server connected"
TCP::collect
}
when SERVER_DATA {
set sdata [TCP::payload]
if { $sdata starts_with "220" } {
log local0. "get data $sdata"
TCP::payload replace 0 [string length $sdata] ""
return
}
if { $sdata contains "\r\n354 " } {
log local0. "get data $sdata"
TCP::payload replace 0 [string length $sdata] "354\r\n"
}
if { [ string length $sdata ] <= 0 } {
return
}
log local0. "payload [TCP::payload]"
TCP::release
TCP::collect
}
when CLIENT_CLOSED {
log local0. "client closed"
}
}
[root@ve1023:Active] config b pool foo1 list
bpool foo1 {
members 200.200.200.101:25 {}
}
[root@ve1023:Active] config b pool foo2 list
pool foo2 {
members 200.200.200.102:25 {}
}
[root@ve1023:Active] config tail -f /var/log/ltm
Jan 13 04:07:34 local/tmm info tmm[26866]: Rule myrule CLIENT_ACCEPTED: client accepted
Jan 13 04:07:39 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get helo HELO me
Jan 13 04:08:08 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get from MAIL FROM:goldenretriever@f5.com
Jan 13 04:08:19 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get rcpt RCPT TO:superman@abc.com
Jan 13 04:08:19 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get rcpt domain abc.com
Jan 13 04:08:19 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: foo1
[root@ve1023:Active] config tail -f /var/log/ltm
Jan 13 04:09:27 local/tmm info tmm[26866]: Rule myrule CLIENT_ACCEPTED: client accepted
Jan 13 04:09:29 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get helo HELO me
Jan 13 04:09:37 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get from MAIL FROM:goldenretriever@f5.com
Jan 13 04:09:48 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get rcpt RCPT TO:santa@xyz.com
Jan 13 04:09:48 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get rcpt domain xyz.com
Jan 13 04:09:48 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: foo2
Recent Discussions
Related Content
DevCentral Quicklinks
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com
Discover DevCentral Connects