IPAuth is a plugin that authorizes players based on their IP address. If a player logs in from a different IP the next time they play, they will be kicked from the server before they even spawn with a configurable kick message.
Place in your plugins folder and IPAuth will do the rest.
When a player logs in for their first time, his or her IP is bound to their name and is logged to a file called "LOGINS" in the plugin's data folder. The next time the player logs in, a case-insensitive look-up of their name is searched for in the LOGINS file, and the IP is grabbed from there. If the IP of the player logging in does not match the one found in the LOGINS file, he or she will be kicked for a configured kick reason. If the IP matches, he or she will be allowed to play on the account.
kickreason: "Wrong IP or name is in use." #Kick reason for logging in as a different IP on a name already bound to an IP kickaccount: "This IP has too many accounts." #Kick reason for trying to log in as a new player on an IP that has already reached the account limit. max_accounts: 0 #Account limit per IP. 0 or less is unlimited.
/ipauth reload - Reload the server
ipauth.bypass: false - Do not check this player's IP (good for guest accounts, but unsafe. NO ONE has this permission by default)
ipauth.reload: ops - Permission to use /ipauth reload
The source can be found on GitHub, which is open to the public.