They are all grammatically correct but they convey different degrees of probability:
It can rain tonight = It is theorically possible.
It could rain tonight = It is possible but not particularly likely.
It may rain tonight = There is a chance that this will happen. It is a factual possibility (compare with the theoretical possibility of 'can')
It might rain tonight = It expresses a weaker probability, there is more reserve or doubt on the part of the speaker