Netcat is a powerful Unix command that allows you to perform various networking tasks. It is often used for debugging purposes and to gain a deeper understanding of how things work. Netcat, also known as nc, is readily available on Unix systems.

To connect to a network server using Netcat, use the following syntax:

nc DOMAIN PORT

For example, to connect to the localhost on port 8000, you can use:

nc localhost 8000

Once connected to the server, you can send messages by typing them, and you will receive any replies sent back by the server. This functionality makes Netcat akin to a simple 1-to-1 chat system, which can also be used to work with application-level protocols such as HTTP, FTP, SMTP, and more.

Netcat allows you to simulate application-level protocols that power the Internet. For instance, you can connect to a web server and send it HTTP protocol instructions. You can connect to a website like flaviocopes.com on port 80 with the command nc flaviocopes.com 80 and send the following HTTP request:

GET / HTTP/1.1
Host: flaviocopes.com

After sending this request, you will receive a response from the server. In the case of flaviocopes.com, it will respond with an HTTP/1.1 301 Moved Permanently to https://flaviocopes.com/ because it enforces HTTPS.

Netcat can also be used to interface with other servers. For example, you can connect to an “echo” server that sends back whatever is sent to it. This can be useful for testing and debugging purposes.

Netcat works with both TCP (the default protocol) and UDP. To use UDP, simply add the -u flag, like this:

nc -u localhost 8000

You can also create your own Netcat server. Use the -l (listen) option followed by a specific port number to listen on that port. For example:

nc -l PORT

This will cause Netcat to listen for incoming commands on the specified port. You can then run a Netcat client in another terminal window and send messages to the server by typing them.

Netcat can also be used for network inspection. You can scan open ports of a server within a specific range using the following command:

nc -v -z localhost 1-10000

This will display a list of ports that are open on the specified server. If you want to filter out the noise, you can combine Netcat with grep, like this:

nc -v -z localhost 1-10000 2>&1 | grep succeeded

Additionally, if you want to know which process is using a specific port, you can run the command lsof -i :PORT.

Netcat also supports file transfers. You can instruct a Netcat server to send the content of a file to a client that connects to it using the following command:

nc -l PORT < FILENAME

The client connecting with nc DOMAIN PORT will receive the content of the file, but you can also save the content to a file using nc DOMAIN PORT > FILENAME, effectively performing a basic file transfer. After the file has been served, the server will terminate.

To automate this process, you can wrap the command in a simple Bash shell loop. For example:

while true; do nc -l PORT < FILENAME; done

This is the simplest implementation of a web server using Netcat. You can serve the content of a file named index.html on port 80 with the following command:

while true; do nc -l 80 < index.html; done

Lastly, Netcat allows you to send instructions contained in a file to a server. You can do this by running:

nc DOMAIN PORT < FILENAME