#!/usr/bin/awk -f # # Usage in smtpd.conf: # filter proc-exec "/path/to/filter-generic-ptr" # # Example (smtpd.conf): # filter dnsbl_genericptr proc-exec "filter-generic-ptr.awk" BEGIN { ARGC = 0 # no more input args / files FS = "|" } "config|ready" == $0 { print("register|filter|smtp-in|connect") > "/dev/stdin" print("register|ready") > "/dev/stdin" next } "filter" == $1 { if (NF < 9) { printf("Error, filter line not having enough fields, 9+ expected, got %d\n", NF) > "/dev/stderr" next # don't exit as this will stop smtpd } sess_id = $6 resp_token = $7 split($9, x, "[.:]") # extract IPv4 address numbers # @@@ note: with version < 0.6 (e.g. $2 == "0.5") the connecting ip is in $10 - not handling version detection, here # check if all 4 numbers are in domain ($8), in same sequence, e.g.: # 201.161.223.150.cable.dyn.cableonline.com.mx [201.161.223.150] # 188x134x16x191.static-business.spb.ertelecom.ru [188.134.16.191] ret = "proceed" if($8 ~ x[1]".+"x[2]".+"x[3]".+"x[4]".+\\.[a-z][a-z]+$") # @@@ only ipv4 ret = "reject|550 generic PTR record (1234)" # all 4 numbers, in reverse sequence (in-addr.arpa style), e.g.: # 137.161.34.193.sta.211.ru [193.34.161.137] # 6.109.95.80.static.b26.cz [80.95.109.6]) # 74.sub-158-81-183.hanastar.net.id [183.81.158.74] # 2.200.163.45.diamondtechtelecom.com.br [45.163.200.2] else if($8 ~ x[4]".+"x[3]".+"x[2]".+"x[1]".+\\.[a-z][a-z]+$") # @@@ only ipv4 ret = "reject|550 generic PTR record (4321)" # last part first, then in sequence, relatively common, usually with some string between last-digit-host and network, e.g.: # 242.snat-111-91-76.hns.net.in (242.snat-111-91-76.hns.net.in [111.91.76.242]) # 255.ip-139-99-90.net [139.99.90.255] else if($8 ~ x[4]".+"x[1]".+"x[2]".+"x[3]".+\\.[a-z][a-z]+$") # @@@ only ipv4 ret = "reject|550 generic PTR record (4123)" # last three numbers in sequence, e.g.: # cabo-1-10-26.hotlink.com.br (cabo-1-10-26.hotlink.com.br [189.1.10.26]) else if($8 ~ x[2]".+"x[3]".+"x[4]".+\\.[a-z][a-z]+$") # @@@ only ipv4 ret = "reject|550 generic PTR record (234)" # first three numbers in sequence, e.g.: # 210-245-51-office-net-static-ip.fpt.vn [210.245.51.15] else if($8 ~ x[1]".+"x[2]".+"x[3]".+\\.[a-z][a-z]+$") # @@@ only ipv4 ret = "reject|550 generic PTR record (123)" # first and last two numbers in sequence (yeah, weird), e.g.: # 77-23-183.static.cyta.gr [77.69.23.183] else if($8 ~ x[1]".+"x[3]".+"x[4]".+\\.[a-z][a-z]+$") # @@@ only ipv4 ret = "reject|550 generic PTR record (234)" # last two numbers in sequence, e.g.: @@@ skip, too vague # mail-182-211.mailgun.info (mail-182-211.mailgun.info [23.253.182.211]) # user-82.53.turbonetbr.com.br (user-82.175.turbonetbr.com.br [187.95.82.175]) # dynamic-host-128.217.mastertele.com.br (dynamic-host-128.217.mastertele.com.br [45.65.128.217]) # wimax-pool-11-149.mtel.net (wimax-pool-11-149.mtel.net [213.226.11.149]) # ip-84-133.mncplaymedia.com [110.50.84.133]) # ritt-188-94.ranksitt.net [202.40.188.94] # ip43-58.des.net.id [112.78.43.58] # only last number used somewhere, e.g.: @@@ skip, too vague # 75-irstar.ir.net.ua (75-irstar.ir.net.ua [193.142.219.75]) # host232.ase.md (host232.ase.md [81.180.68.232]) # binat-133.cust.bcitelecom.ru [37.9.134.133]) print(sess_id" Generic-PTR check: "$8" ["$9"] => "ret) > "/dev/stderr" print("filter-result|"sess_id"|"resp_token"|"ret) > "/dev/stdin" }