xref: /openbsd-src/usr.bin/nc/nc.1 (revision e3bd0c10546a83897881ba91c04187a29aafaa60)
1.\"     $OpenBSD: nc.1,v 1.98 2024/04/01 12:40:18 deraadt Exp $
2.\"
3.\" Copyright (c) 1996 David Sacerdote
4.\" All rights reserved.
5.\"
6.\" Redistribution and use in source and binary forms, with or without
7.\" modification, are permitted provided that the following conditions
8.\" are met:
9.\" 1. Redistributions of source code must retain the above copyright
10.\"    notice, this list of conditions and the following disclaimer.
11.\" 2. Redistributions in binary form must reproduce the above copyright
12.\"    notice, this list of conditions and the following disclaimer in the
13.\"    documentation and/or other materials provided with the distribution.
14.\" 3. The name of the author may not be used to endorse or promote products
15.\"    derived from this software without specific prior written permission
16.\"
17.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27.\"
28.Dd $Mdocdate: April 1 2024 $
29.Dt NC 1
30.Os
31.Sh NAME
32.Nm nc
33.Nd arbitrary TCP and UDP connections and listens
34.Sh SYNOPSIS
35.Nm nc
36.Op Fl 46cDdFhklNnrStUuvz
37.Op Fl C Ar certfile
38.Op Fl e Ar name
39.Op Fl H Ar hash
40.Op Fl I Ar length
41.Op Fl i Ar interval
42.Op Fl K Ar keyfile
43.Op Fl M Ar ttl
44.Op Fl m Ar minttl
45.Op Fl O Ar length
46.Op Fl o Ar staplefile
47.Op Fl P Ar proxy_username
48.Op Fl p Ar source_port
49.Op Fl R Ar CAfile
50.Op Fl s Ar sourceaddr
51.Op Fl T Ar keyword
52.Op Fl V Ar rtable
53.Op Fl W Ar recvlimit
54.Op Fl w Ar timeout
55.Op Fl X Ar proxy_protocol
56.Op Fl x Ar proxy_address Ns Op : Ns Ar port
57.Op Fl Z Ar peercertfile
58.Op Ar destination
59.Op Ar port
60.Sh DESCRIPTION
61The
62.Nm
63(or
64.Nm netcat )
65utility is used for just about anything under the sun involving TCP,
66UDP, or
67.Ux Ns -domain
68sockets.
69It can open TCP connections, send UDP packets, listen on arbitrary
70TCP and UDP ports, do port scanning, and deal with both IPv4 and
71IPv6.
72Unlike
73.Xr telnet 1 ,
74.Nm
75scripts nicely, and separates error messages onto standard error instead
76of sending them to standard output, as
77.Xr telnet 1
78does with some.
79.Pp
80Common uses include:
81.Pp
82.Bl -bullet -offset indent -compact
83.It
84simple TCP proxies
85.It
86shell-script based HTTP clients and servers
87.It
88network daemon testing
89.It
90a SOCKS or HTTP ProxyCommand for
91.Xr ssh 1
92.It
93and much, much more
94.El
95.Pp
96The options are as follows:
97.Bl -tag -width Ds
98.It Fl 4
99Use IPv4 addresses only.
100.It Fl 6
101Use IPv6 addresses only.
102.It Fl C Ar certfile
103Load the public key part of the TLS peer certificate from
104.Ar certfile ,
105in PEM format.
106Requires
107.Fl c .
108.It Fl c
109Use TLS to connect or listen.
110Cannot be used together with any of the options
111.Fl FuU .
112.It Fl D
113Enable debugging on the socket.
114.It Fl d
115Do not attempt to read from stdin.
116.It Fl e Ar name
117Only accept the TLS peer certificate if it contains the
118.Ar name .
119Requires
120.Fl c .
121If not specified,
122.Ar destination
123is used.
124.It Fl F
125Pass the first connected socket using
126.Xr sendmsg 2
127to stdout and exit.
128This is useful in conjunction with
129.Fl X
130to have
131.Nm
132perform connection setup with a proxy but then leave the rest of the
133connection to another program (e.g.\&
134.Xr ssh 1
135using the
136.Xr ssh_config 5
137.Cm ProxyUseFdpass
138option).
139Cannot be used with
140.Fl c
141or
142.Fl U .
143.It Fl H Ar hash
144Only accept the TLS peer certificate if its hash returned from
145.Xr tls_peer_cert_hash 3
146matches
147.Ar hash .
148Requires
149.Fl c
150and cannot be used with
151.Fl T Cm noverify .
152.It Fl h
153Print out the
154.Nm
155help text and exit.
156.It Fl I Ar length
157Specify the size of the TCP receive buffer.
158.It Fl i Ar interval
159Sleep for
160.Ar interval
161seconds between lines of text sent and received.
162Also causes a delay time between connections to multiple ports.
163.It Fl K Ar keyfile
164Load the TLS private key from
165.Ar keyfile ,
166in PEM format.
167Requires
168.Fl c .
169.It Fl k
170When a connection is completed, listen for another one.
171Requires
172.Fl l .
173When used together with the
174.Fl u
175option, the server socket is not connected and it can receive UDP datagrams from
176multiple hosts.
177.It Fl l
178Listen for an incoming connection rather than initiating a
179connection to a remote host.
180Cannot be used together with any of the options
181.Fl psxz .
182Additionally, any timeouts specified with the
183.Fl w
184option are ignored.
185.It Fl M Ar ttl
186Set the TTL / hop limit of outgoing packets.
187.It Fl m Ar minttl
188Ask the kernel to drop incoming packets whose TTL / hop limit is under
189.Ar minttl .
190.It Fl N
191.Xr shutdown 2
192the network socket after EOF on the input.
193Some servers require this to finish their work.
194.It Fl n
195Do not perform domain name resolution.
196If a name cannot be resolved without DNS, an error will be reported.
197.It Fl O Ar length
198Specify the size of the TCP send buffer.
199.It Fl o Ar staplefile
200During the TLS handshake, load data to be stapled from
201.Ar staplefile ,
202which is expected to contain an OCSP response from an OCSP server in
203DER format.
204Requires
205.Fl c
206and
207.Fl C .
208.It Fl P Ar proxy_username
209Specifies a username to present to a proxy server that requires authentication.
210If no username is specified then authentication will not be attempted.
211Proxy authentication is only supported for HTTP CONNECT proxies at present.
212.It Fl p Ar source_port
213Specify the source port
214.Nm
215should use, subject to privilege restrictions and availability.
216Cannot be used together with
217.Fl l .
218.It Fl R Ar CAfile
219Load the root CA bundle for TLS certificate verification from
220.Ar CAfile ,
221in PEM format, instead of
222.Pa /etc/ssl/cert.pem .
223Requires
224.Fl c .
225.It Fl r
226Choose source and/or destination ports randomly
227instead of sequentially within a range or in the order that the system
228assigns them.
229.It Fl S
230Enable the RFC 2385 TCP MD5 signature option.
231.It Fl s Ar sourceaddr
232Set the source address to send packets from,
233which is useful on machines with multiple interfaces.
234For
235.Ux Ns -domain
236datagram sockets, specifies the local temporary socket file
237to create and use so that datagrams can be received.
238Cannot be used together with
239.Fl l
240or
241.Fl x .
242.It Fl T Ar keyword
243Change the IPv4 TOS/IPv6 traffic class value or the TLS options.
244.Pp
245For TLS options,
246.Ar keyword
247may be one of:
248.Cm noverify ,
249which disables certificate verification;
250.Cm noname ,
251which disables certificate name checking;
252.Cm clientcert ,
253which requires a client certificate on incoming connections; or
254.Cm muststaple ,
255which requires the peer to provide a valid stapled OCSP response
256with the handshake.
257The following TLS options specify a value in the form of a
258.Ar key Ns = Ns Ar value
259pair:
260.Cm ciphers ,
261which allows the supported TLS ciphers to be specified (see
262.Xr tls_config_set_ciphers 3
263for further details);
264.Cm protocols ,
265which allows the supported TLS protocols to be specified (see
266.Xr tls_config_parse_protocols 3
267for further details).
268Specifying TLS options requires
269.Fl c .
270.Pp
271For the IPv4 TOS/IPv6 traffic class value,
272.Ar keyword
273may be one of
274.Cm critical ,
275.Cm inetcontrol ,
276.Cm lowdelay ,
277.Cm netcontrol ,
278.Cm throughput ,
279.Cm reliability ,
280or one of the DiffServ Code Points:
281.Cm ef ,
282.Cm af11 No ... Cm af43 ,
283.Cm cs0 No ... Cm cs7 ;
284or a number in either hex or decimal.
285.It Fl t
286Send RFC 854 DON'T and WON'T responses to RFC 854 DO and WILL requests.
287This makes it possible to use
288.Nm
289to script telnet sessions.
290.It Fl U
291Use
292.Ux Ns -domain
293sockets.
294Cannot be used together with any of the options
295.Fl cFx .
296.It Fl u
297Use UDP instead of TCP.
298Cannot be used together with
299.Fl c
300or
301.Fl x .
302For
303.Ux Ns -domain
304sockets, use a datagram socket instead of a stream socket.
305If a
306.Ux Ns -domain
307socket is used, a temporary receiving socket is created in
308.Pa /tmp
309unless the
310.Fl s
311flag is given.
312.It Fl V Ar rtable
313Set the routing table to be used.
314.It Fl v
315Produce more verbose output.
316.It Fl W Ar recvlimit
317Terminate after receiving
318.Ar recvlimit
319packets from the network.
320.It Fl w Ar timeout
321Connections which cannot be established or are idle timeout after
322.Ar timeout
323seconds.
324The
325.Fl w
326flag has no effect on the
327.Fl l
328option, i.e.\&
329.Nm
330will listen forever for a connection, with or without the
331.Fl w
332flag.
333The default is no timeout.
334.It Fl X Ar proxy_protocol
335Use
336.Ar proxy_protocol
337when talking to the proxy server.
338Supported protocols are
339.Cm 4
340(SOCKS v.4),
341.Cm 5
342(SOCKS v.5)
343and
344.Cm connect
345(HTTPS proxy).
346If the protocol is not specified, SOCKS version 5 is used.
347.It Fl x Ar proxy_address Ns Op : Ns Ar port
348Connect to
349.Ar destination
350using a proxy at
351.Ar proxy_address
352and
353.Ar port .
354If
355.Ar port
356is not specified, the well-known port for the proxy protocol is used (1080
357for SOCKS, 3128 for HTTPS).
358An IPv6 address can be specified unambiguously by enclosing
359.Ar proxy_address
360in square brackets.
361A proxy cannot be used with any of the options
362.Fl lsuU .
363.It Fl Z Ar peercertfile
364Save the peer certificates to
365.Ar peercertfile ,
366in PEM format.
367Requires
368.Fl c .
369.It Fl z
370Only scan for listening daemons, without sending any data to them.
371Cannot be used together with
372.Fl l .
373.El
374.Pp
375.Ar destination
376can be a numerical IP address or a symbolic hostname
377(unless the
378.Fl n
379option is given).
380In general, a destination must be specified,
381unless the
382.Fl l
383option is given
384(in which case the local host is used).
385For
386.Ux Ns -domain
387sockets, a destination is required and is the socket path to connect to
388(or listen on if the
389.Fl l
390option is given).
391.Pp
392.Ar port
393can be specified as a numeric port number or as a service name.
394Port ranges may be specified as numeric port numbers of the form
395.Ar nn Ns - Ns Ar mm .
396In general,
397a destination port must be specified,
398unless the
399.Fl U
400option is given.
401For some options, the value 0 requests that the system choose a port number.
402.Sh CLIENT/SERVER MODEL
403It is quite simple to build a very basic client/server model using
404.Nm .
405On one console, start
406.Nm
407listening on a specific port for a connection.
408For example:
409.Pp
410.Dl $ nc -l 1234
411.Pp
412.Nm
413is now listening on port 1234 for a connection.
414On a second console
415.Pq or a second machine ,
416connect to the machine and port being listened on:
417.Pp
418.Dl $ nc -N 127.0.0.1 1234
419.Pp
420There should now be a connection between the ports.
421Anything typed at the second console will be concatenated to the first,
422and vice-versa.
423After the connection has been set up,
424.Nm
425does not really care which side is being used as a
426.Sq server
427and which side is being used as a
428.Sq client .
429The connection may be terminated using an
430.Dv EOF
431.Pq Sq ^D ,
432as the
433.Fl N
434flag was given.
435.Sh DATA TRANSFER
436The example in the previous section can be expanded to build a
437basic data transfer model.
438Any information input into one end of the connection will be output
439to the other end, and input and output can be easily captured in order to
440emulate file transfer.
441.Pp
442Start by using
443.Nm
444to listen on a specific port, with output captured into a file:
445.Pp
446.Dl $ nc -l 1234 > filename.out
447.Pp
448Using a second machine, connect to the listening
449.Nm
450process, feeding it the file which is to be transferred:
451.Pp
452.Dl $ nc -N host.example.com 1234 < filename.in
453.Pp
454After the file has been transferred, the connection will close automatically.
455.Sh TALKING TO SERVERS
456It is sometimes useful to talk to servers
457.Dq by hand
458rather than through a user interface.
459It can aid in troubleshooting,
460when it might be necessary to verify what data a server is sending
461in response to commands issued by the client.
462For example, to retrieve the home page of a web site:
463.Bd -literal -offset indent
464$ printf "GET / HTTP/1.0\er\en\er\en" | nc host.example.com 80
465.Ed
466.Pp
467Note that this also displays the headers sent by the web server.
468They can be filtered, using a tool such as
469.Xr sed 1 ,
470if necessary.
471.Pp
472More complicated examples can be built up when the user knows the format
473of requests required by the server.
474As another example, an email may be submitted to an SMTP server using:
475.Bd -literal -offset indent
476$ nc localhost 25 << EOF
477HELO host.example.com
478MAIL FROM:<user@host.example.com>
479RCPT TO:<user2@host.example.com>
480DATA
481Body of email.
482\&.
483QUIT
484EOF
485.Ed
486.Sh PORT SCANNING
487It may be useful to know which ports are open and running services on
488a target machine.
489The
490.Fl z
491flag can be used to tell
492.Nm
493to report open ports,
494rather than initiate a connection.
495For example:
496.Bd -literal -offset indent
497$ nc -z host.example.com 20-30
498Connection to host.example.com 22 port [tcp/ssh] succeeded!
499Connection to host.example.com 25 port [tcp/smtp] succeeded!
500.Ed
501.Pp
502The port range was specified to limit the search to ports 20 \- 30.
503.Pp
504Alternatively, it might be useful to know which server software
505is running, and which versions.
506This information is often contained within the greeting banners.
507In order to retrieve these, it is necessary to first make a connection,
508and then break the connection when the banner has been retrieved.
509This can be accomplished by specifying a small timeout with the
510.Fl w
511flag, or perhaps by issuing a
512.Qq Dv QUIT
513command to the server:
514.Bd -literal -offset indent
515$ echo "QUIT" | nc host.example.com 20-30
516SSH-1.99-OpenSSH_3.6.1p2
517Protocol mismatch.
518220 host.example.com IMS SMTP Receiver Version 0.84 Ready
519.Ed
520.Sh EXAMPLES
521Open a TCP connection to port 42 of host.example.com, using port 31337 as
522the source port, with a timeout of 5 seconds:
523.Pp
524.Dl $ nc -p 31337 -w 5 host.example.com 42
525.Pp
526Open a TCP connection to port 443 of www.example.com, and negotiate TLS with
527any supported TLS protocol version and "compat" ciphers:
528.Pp
529.Dl $ nc -cv -T protocols=all -T ciphers=compat www.example.com 443
530.Pp
531Open a TCP connection to port 443 of www.google.ca, and negotiate TLS.
532Check for a different name in the certificate for validation:
533.Pp
534.Dl $ nc -cv -e adsf.au.doubleclick.net www.google.ca 443
535.Pp
536Open a UDP connection to port 53 of host.example.com:
537.Pp
538.Dl $ nc -u host.example.com 53
539.Pp
540Open a TCP connection to port 42 of host.example.com using 10.1.2.3 as the
541IP for the local end of the connection:
542.Pp
543.Dl $ nc -s 10.1.2.3 host.example.com 42
544.Pp
545Create and listen on a
546.Ux Ns -domain
547stream socket:
548.Pp
549.Dl $ nc -lU /var/tmp/dsocket
550.Pp
551Connect to port 42 of host.example.com via an HTTP proxy at 10.2.3.4,
552port 8080.
553This example could also be used by
554.Xr ssh 1 ;
555see the
556.Cm ProxyCommand
557directive in
558.Xr ssh_config 5
559for more information.
560.Pp
561.Dl $ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
562.Pp
563The same example again, this time enabling proxy authentication with username
564.Dq ruser
565if the proxy requires it:
566.Pp
567.Dl $ nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42
568.Sh SEE ALSO
569.Xr cat 1 ,
570.Xr ssh 1
571.Sh AUTHORS
572Original implementation by
573.An *Hobbit* Aq Mt hobbit@avian.org .
574.br
575Rewritten with IPv6 support by
576.An Eric Jackson Aq Mt ericj@monkey.org .
577.Sh CAVEATS
578UDP port scans using the
579.Fl uz
580combination of flags will always report success irrespective of
581the target machine's state.
582However,
583in conjunction with a traffic sniffer either on the target machine
584or an intermediary device,
585the
586.Fl uz
587combination could be useful for communications diagnostics.
588Note that the amount of UDP traffic generated may be limited either
589due to hardware resources and/or configuration settings.
590