For a decade or more I always ran all my traffic through a VPN, and ran into problems with captive portals. The way I solved it was that I would let DHCP update my resolv.conf file, and then my VPN "up" script would overwrite resolv.conf to use localhost as the name server. Sometimes I would have to open a browser and go to an IP address in the URL bar to get the redirect. This all worked out pretty well, only maybe once a quarter did I have to go in and manually resolve some captive portal issues.