xref: /freebsd/contrib/netcat/nc.1 (revision 2e3f49888ec8851bafb22011533217487764fdb0)
1.\"     $OpenBSD: nc.1,v 1.68 2015/03/26 10:35:04 tobias 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.\" $FreeBSD$
29.\"
30.Dd January 17, 2023
31.Dt NC 1
32.Os
33.Sh NAME
34.Nm nc
35.Nd arbitrary TCP and UDP connections and listens
36.Sh SYNOPSIS
37.Nm nc
38.Bk -words
39.Op Fl 46DdEFhklMNnrStUuvz
40.Op Fl e Ar IPsec_policy
41.Op Fl I Ar length
42.Op Fl i Ar interval
43.Op Fl -no-tcpopt
44.Op Fl -sctp
45.Op Fl -crlf
46.Op Fl O Ar length
47.Op Fl P Ar proxy_username
48.Op Fl p Ar source_port
49.Op Fl s Ar source
50.Op Fl T Ar toskeyword
51.Op Fl -tun Ar tundev
52.Op Fl V Ar rtable
53.Op Fl w Ar timeout
54.Op Fl X Ar proxy_protocol
55.Oo Xo
56.Fl x Ar proxy_address Ns Oo : Ns
57.Ar port Oc
58.Xc Oc
59.Op Ar destination
60.Op Ar port
61.Ek
62.Sh DESCRIPTION
63The
64.Nm
65(or
66.Nm netcat )
67utility is used for just about anything under the sun involving TCP,
68UDP, or
69.Ux Ns -domain
70sockets.
71It can open TCP connections, send UDP packets, listen on arbitrary
72TCP and UDP ports, do port scanning, and deal with both IPv4 and
73IPv6.
74Unlike
75.Xr telnet 1 ,
76.Nm
77scripts nicely, and separates error messages onto standard error instead
78of sending them to standard output, as
79.Xr telnet 1
80does with some.
81.Pp
82Common uses include:
83.Pp
84.Bl -bullet -offset indent -compact
85.It
86simple TCP proxies
87.It
88shell-script based HTTP clients and servers
89.It
90network daemon testing
91.It
92a SOCKS or HTTP ProxyCommand for
93.Xr ssh 1
94.It
95and much, much more
96.El
97.Pp
98The options are as follows:
99.Bl -tag -width Ds
100.It Fl 4
101Forces
102.Nm
103to use IPv4 addresses only.
104.It Fl 6
105Forces
106.Nm
107to use IPv6 addresses only.
108.It Fl -crlf
109Convert LF into CRLF when sending data over the network.
110.It Fl D
111Enable debugging on the socket.
112.It Fl d
113Do not attempt to read from stdin.
114.It Fl E
115Shortcut for
116.Qo
117.Li "-e 'in ipsec esp/transport//require'"
118.Li "-e 'out ipsec esp/transport//require'"
119.Qc ,
120which enables IPsec ESP transport mode in both
121directions.
122.It Fl e
123If IPsec support is available, then one can specify the IPsec policies
124to be used using the syntax described in
125.Xr ipsec_set_policy 3 .
126This flag can be specified up to two times, as typically one policy for
127each direction is needed.
128.It Fl F
129Pass the first connected socket using
130.Xr sendmsg 2
131to stdout and exit.
132This is useful in conjunction with
133.Fl X
134to have
135.Nm
136perform connection setup with a proxy but then leave the rest of the
137connection to another program (e.g.\&
138.Xr ssh 1
139using the
140.Xr ssh_config 5
141.Cm ProxyUseFdpass
142option).
143.It Fl h
144Prints out
145.Nm
146help.
147.It Fl I Ar length
148Specifies the size of the TCP receive buffer.
149.It Fl i Ar interval
150Specifies a delay time interval between lines of text sent and received.
151Also causes a delay time between connections to multiple ports.
152.It Fl k
153Forces
154.Nm
155to stay listening for another connection after its current connection
156is completed.
157It is an error to use this option without the
158.Fl l
159option.
160When used together with the
161.Fl u
162option, the server socket is not connected and it can receive UDP datagrams from
163multiple hosts.
164.It Fl l
165Used to specify that
166.Nm
167should listen for an incoming connection rather than initiate a
168connection to a remote host.
169It is an error to use this option in conjunction with the
170.Fl p ,
171.Fl s ,
172or
173.Fl z
174options.
175Additionally, any timeouts specified with the
176.Fl w
177option are ignored.
178.It Fl M
179Collect per-connection TCP statistics using the
180.Xr stats 3
181framework and print them in JSON format to
182.Xr stderr 4
183after the connection is closed.
184.It Fl N
185.Xr shutdown 2
186the network socket after EOF on the input.
187Some servers require this to finish their work.
188.It Fl n
189Do not do any DNS or service lookups on any specified addresses,
190hostnames or ports.
191.It Fl -no-tcpopt
192Disables the use of TCP options on the socket, by setting the boolean
193TCP_NOOPT
194socket option.
195.It Fl -sctp
196Use SCTP instead of the default option of TCP.
197.It Fl O Ar length
198Specifies the size of the TCP send buffer.
199.It Fl P Ar proxy_username
200Specifies a username to present to a proxy server that requires authentication.
201If no username is specified then authentication will not be attempted.
202Proxy authentication is only supported for HTTP CONNECT proxies at present.
203.It Fl p Ar source_port
204Specifies the source port
205.Nm
206should use, subject to privilege restrictions and availability.
207It is an error to use this option in conjunction with the
208.Fl l
209option.
210.It Fl r
211Specifies that source and/or destination ports should be chosen randomly
212instead of sequentially within a range or in the order that the system
213assigns them.
214.It Fl S
215Enables the RFC 2385 TCP MD5 signature option.
216.It Fl s Ar source
217Specifies the IP of the interface which is used to send the packets.
218For
219.Ux Ns -domain
220datagram sockets, specifies the local temporary socket file
221to create and use so that datagrams can be received.
222It is an error to use this option in conjunction with the
223.Fl l
224option.
225.It Fl T Ar toskeyword
226Change IPv4 TOS value.
227.Ar toskeyword
228may be one of
229.Ar critical ,
230.Ar inetcontrol ,
231.Ar lowdelay ,
232.Ar netcontrol ,
233.Ar throughput ,
234.Ar reliability ,
235or one of the DiffServ Code Points:
236.Ar ef ,
237.Ar af11 ... af43 ,
238.Ar cs0 ... cs7 ;
239or a number in either hex or decimal.
240.It Fl t
241Causes
242.Nm
243to send RFC 854 DON'T and WON'T responses to RFC 854 DO and WILL requests.
244This makes it possible to use
245.Nm
246to script telnet sessions.
247.It Fl -tun Ar tundev
248Causes
249.Nm
250to use the provided
251.Xr tun 4
252for input and output rather than the default of stdin and stdout.
253.It Fl U
254Specifies to use
255.Ux Ns -domain
256sockets.
257.It Fl u
258Use UDP instead of the default option of TCP.
259For
260.Ux Ns -domain
261sockets, use a datagram socket instead of a stream socket.
262If a
263.Ux Ns -domain
264socket is used, a temporary receiving socket is created in
265.Pa /tmp
266unless the
267.Fl s
268flag is given.
269.It Fl V Ar rtable
270Set the routing table
271.Pq Dq FIB
272to be used.
273.It Fl v
274Have
275.Nm
276give more verbose output.
277.It Fl w Ar timeout
278Connections which cannot be established or are idle timeout after
279.Ar timeout
280seconds.
281The
282.Fl w
283flag has no effect on the
284.Fl l
285option, i.e.\&
286.Nm
287will listen forever for a connection, with or without the
288.Fl w
289flag.
290The default is no timeout.
291.It Fl X Ar proxy_protocol
292Requests that
293.Nm
294should use the specified protocol when talking to the proxy server.
295Supported protocols are
296.Dq 4
297(SOCKS v.4),
298.Dq 5
299(SOCKS v.5)
300and
301.Dq connect
302(HTTPS proxy).
303If the protocol is not specified, SOCKS version 5 is used.
304.It Xo
305.Fl x Ar proxy_address Ns Oo : Ns
306.Ar port Oc
307.Xc
308Requests that
309.Nm
310should connect to
311.Ar destination
312using a proxy at
313.Ar proxy_address
314and
315.Ar port .
316If
317.Ar port
318is not specified, the well-known port for the proxy protocol is used (1080
319for SOCKS, 3128 for HTTPS).
320.It Fl z
321Specifies that
322.Nm
323should just scan for listening daemons, without sending any data to them.
324It is an error to use this option in conjunction with the
325.Fl l
326option.
327.El
328.Pp
329.Ar destination
330can be a numerical IP address or a symbolic hostname
331(unless the
332.Fl n
333option is given).
334In general, a destination must be specified,
335unless the
336.Fl l
337option is given
338(in which case the local host is used).
339For
340.Ux Ns -domain
341sockets, a destination is required and is the socket path to connect to
342(or listen on if the
343.Fl l
344option is given).
345.Pp
346.Ar port
347can be a single integer or a range of ports.
348Ranges are in the form nn-mm.
349In general,
350a destination port must be specified,
351unless the
352.Fl U
353option is given.
354.Sh CLIENT/SERVER MODEL
355It is quite simple to build a very basic client/server model using
356.Nm .
357On one console, start
358.Nm
359listening on a specific port for a connection.
360For example:
361.Pp
362.Dl $ nc -l 1234
363.Pp
364.Nm
365is now listening on port 1234 for a connection.
366On a second console
367.Pq or a second machine ,
368connect to the machine and port being listened on:
369.Pp
370.Dl $ nc 127.0.0.1 1234
371.Pp
372There should now be a connection between the ports.
373Anything typed at the second console will be concatenated to the first,
374and vice-versa.
375After the connection has been set up,
376.Nm
377does not really care which side is being used as a
378.Sq server
379and which side is being used as a
380.Sq client .
381The connection may be terminated using an
382.Dv EOF
383.Pq Sq ^D .
384.Sh DATA TRANSFER
385The example in the previous section can be expanded to build a
386basic data transfer model.
387Any information input into one end of the connection will be output
388to the other end, and input and output can be easily captured in order to
389emulate file transfer.
390.Pp
391Start by using
392.Nm
393to listen on a specific port, with output captured into a file:
394.Pp
395.Dl $ nc -l 1234 \*(Gt filename.out
396.Pp
397Using a second machine, connect to the listening
398.Nm
399process, feeding it the file which is to be transferred:
400.Pp
401.Dl $ nc -N host.example.com 1234 \*(Lt filename.in
402.Pp
403After the file has been transferred, the connection will close automatically.
404.Sh TALKING TO SERVERS
405It is sometimes useful to talk to servers
406.Dq by hand
407rather than through a user interface.
408It can aid in troubleshooting,
409when it might be necessary to verify what data a server is sending
410in response to commands issued by the client.
411For example, to retrieve the home page of a web site:
412.Bd -literal -offset indent
413$ printf "GET / HTTP/1.0\er\en\er\en" | nc host.example.com 80
414.Ed
415.Pp
416Note that this also displays the headers sent by the web server.
417They can be filtered, using a tool such as
418.Xr sed 1 ,
419if necessary.
420.Pp
421More complicated examples can be built up when the user knows the format
422of requests required by the server.
423As another example, an email may be submitted to an SMTP server using:
424.Bd -literal -offset indent
425$ nc localhost 25 \*(Lt\*(Lt EOF
426HELO host.example.com
427MAIL FROM:\*(Ltuser@host.example.com\*(Gt
428RCPT TO:\*(Ltuser2@host.example.com\*(Gt
429DATA
430Body of email.
431\&.
432QUIT
433EOF
434.Ed
435.Sh PORT SCANNING
436It may be useful to know which ports are open and running services on
437a target machine.
438The
439.Fl z
440flag can be used to tell
441.Nm
442to report open ports,
443rather than initiate a connection.
444For example:
445.Bd -literal -offset indent
446$ nc -z host.example.com 20-30
447Connection to host.example.com 22 port [tcp/ssh] succeeded!
448Connection to host.example.com 25 port [tcp/smtp] succeeded!
449.Ed
450.Pp
451The port range was specified to limit the search to ports 20 \- 30.
452.Pp
453Alternatively, it might be useful to know which server software
454is running, and which versions.
455This information is often contained within the greeting banners.
456In order to retrieve these, it is necessary to first make a connection,
457and then break the connection when the banner has been retrieved.
458This can be accomplished by specifying a small timeout with the
459.Fl w
460flag, or perhaps by issuing a
461.Qq Dv QUIT
462command to the server:
463.Bd -literal -offset indent
464$ echo "QUIT" | nc host.example.com 20-30
465SSH-1.99-OpenSSH_3.6.1p2
466Protocol mismatch.
467220 host.example.com IMS SMTP Receiver Version 0.84 Ready
468.Ed
469.Sh EXAMPLES
470Open a TCP connection to port 42 of host.example.com, using port 31337 as
471the source port, with a timeout of 5 seconds:
472.Pp
473.Dl $ nc -p 31337 -w 5 host.example.com 42
474.Pp
475Open a UDP connection to port 53 of host.example.com:
476.Pp
477.Dl $ nc -u host.example.com 53
478.Pp
479Open a TCP connection to port 42 of host.example.com using 10.1.2.3 as the
480IP for the local end of the connection:
481.Pp
482.Dl $ nc -s 10.1.2.3 host.example.com 42
483.Pp
484Open a TCP connection to port 42 of host.example.com using IPsec ESP for
485incoming and outgoing traffic.
486.Pp
487.Dl $ nc -E host.example.com 42
488.Pp
489Open a TCP connection to port 42 of host.example.com using IPsec ESP for
490outgoing traffic only.
491.Pp
492.Dl $ nc -e 'out ipsec esp/transport//require' host.example.com 42
493.Pp
494Create and listen on a
495.Ux Ns -domain
496stream socket:
497.Pp
498.Dl $ nc -lU /var/tmp/dsocket
499.Pp
500Connect to port 42 of host.example.com via an HTTP proxy at 10.2.3.4,
501port 8080.
502This example could also be used by
503.Xr ssh 1 ;
504see the
505.Cm ProxyCommand
506directive in
507.Xr ssh_config 5
508for more information.
509.Pp
510.Dl $ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
511.Pp
512The same example again, this time enabling proxy authentication with username
513.Dq ruser
514if the proxy requires it:
515.Pp
516.Dl $ nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42
517.Sh EXIT STATUS
518.Ex -std
519.Sh SEE ALSO
520.Xr cat 1 ,
521.Xr setfib 1 ,
522.Xr ssh 1 ,
523.Xr tcp 4
524.Sh AUTHORS
525Original implementation by *Hobbit*
526.Aq Mt hobbit@avian.org .
527.br
528Rewritten with IPv6 support by
529.An Eric Jackson Aq Mt ericj@monkey.org .
530.Sh CAVEATS
531UDP port scans using the
532.Fl uz
533combination of flags will always report success irrespective of
534the target machine's state.
535However,
536in conjunction with a traffic sniffer either on the target machine
537or an intermediary device,
538the
539.Fl uz
540combination could be useful for communications diagnostics.
541Note that the amount of UDP traffic generated may be limited either
542due to hardware resources and/or configuration settings.
543