Well, indeed. But Im thinking that it could be done with a webapp and Websockets.
In other words, get sent to a domain that initiates the knock sequence. Other machine in waiting responds, and NAT traversal takes over, to any machines inside NAT.
The only real question is how much code is actually required to start this.