IIS - I would use a WAF. Examples are CloudFlare, Amazon AWS WAF, etc.
Correction: I wouldn't put it on-premise in the first place, but let's proceed with the assumption it has to stay on-premise.
With CloudFlare you don't have to open any ports at all. They have an agent you can put on the server that connects out to CloudFlare, and then inbound requests come into that.