Sorry, I'm coming a little late to this discussions, but I have
a few hopefully useful suggestions.

Wow, what a great response, no apologies needed.  I'll go through it point
by point!

Actually, "use Net::DNS;" should be at the top of your file, it doesn't
need
to be in a subroutine (in fact, it's better not to). "use" is a compile-
time statement, not a runtime statement.

From my perspective, it's really just a coding-standard but understand what
you are saying and will move on.

So for example, we don't reject
outright on private IP space in MX records, as long as there are
other reachable addresses too.

I chose to only check the primary MX because my analysis showed that it was
likely to be a "good" test to get rid of unwanted junk mail.  I also agree
with you and do not personally bounce based on privatized IP usage but I
think I see what you are saying.

- in case there's no MX record, you can just take the domain itself
  as a degenerate form of MX host, and look for the A record of that.
  This behaviour is actually a backward-compatible form of mail sending
  from before MX records were invented. It's still used occasionally.

I actually allowed this with the implicit acceptance of unchecked answers
but I have added a check for the implicit A record as MX

- sendmail (and possibly other MTAs) will actually understand this
  grossly wrong MX record:

example.com.     IN MX 10 12.34.56.78.

  And use the "hostname" there as the IP address. (Of course, if you
  want your MTA to help fight for a better world, you'd probably want
  to RST your TCP connection to any loser mailing from such a domain
  with a christmas tree of death packet. But I digress...)

Technically, DNS handles this as a CNAME which isn't RFC compliant for email
but I'm choosing to follow sendmail's lax interpretation to prevent false
positives.  I believe this will definitely now pass v2 of the check stub.

- you don't handle domains with mail exchanges only reachable via IPv6.

Since I am implicitly accepting unchecked answers, I believe this is OK.
However, I have no access to IPv6 and no way to work on this.

- if an MX record doesn't resolve at all, you can also consider it
  a malicious error (this one is quite common even).

I'm dropping that at a sendmail level and expect others to do so as well.
Therefore, I'm considering a non-resolve as an internal problem or timeout
issue.  Since I set the timeout to only 4 seconds for DNS queries, I aiming
for a shotgun, get a lot of bad guys approach.

- The domain could be in the form [127.0.0.1], causing your MX lookup
  to fail (in which case you currently accept).

Can you give me an example email address that has DNS that does this?

- The domain could even be [IPv6:2222::1234:5678:9abc:def0] (but we
  currently reject this, it's too obscure).

Can you give me an example email address that has DNS that does this?

- This specific syntax:

example.com   IN MX 0 .

  is commonly understood to mean "this domain does not do email at all",
 So we currently
  only block on "MX 0 ." when it's the only MX record (or only one in
  a set of equal preferenced records).

I've implemented a basic check for this, thanks for the detailed info. I am only block if the MX at priority 0 is a period (which translates as blank).

- We explicitly test for lone hostnames and non-existing TLDs to give
  understandable error messages. These cases are usually due to
  incompetence, and the reject messages are actually read by users.

I believe sendmails resolution checks will bounce non-existent TLDs but what
is a lone hostname?

I've started adding error messages so they can be passed back to the user.

- We test the MX records per preference level, in order. The first set
  to return an "OK" status aborts the search. At the "most preferred"
  (lowest-numbered) level, we do allow for private IP space or
  non-existing hostnames, but the overall check will only succeed if
  there is another set of lower-preference MX records with valid IP
  addresses.

  The idea here is that this setup would "commonly work" and we're able
  to connect back to some MX records to deliver bounces, if any.

If you were to fail on internal network tests, this is the only way to go.

- Finally, we test inside filter_sender, HOWEVER we don't generate
  an error until filter_recipient, and we explicitly exclude a few
  recipients (like abuse@) just in case our logic is wrong or someone
  really feels they should be able to mail us from a domain with
  invalid MX records.

Feedback on this code appreciated.  Would especially appreciate email
address that should be used to test the code either in a pass or fail
capacity.

http://www.peregrinehw.com/downloads/MIMEDefang/contrib/check_primary_mx_stub-v2.pl

Regards,
KAM

_______________________________________________
Visit http://www.mimedefang.org and http://www.roaringpenguin.com
MIMEDefang mailing list
MIMEDefang@lists.roaringpenguin.com
http://lists.roaringpenguin.com/mailman/listinfo/mimedefang

Reply via email to