포트 접속가능 여부를 체크할 때 telnet을 사용하곤 했는데 telnet이 없는 서버가 있어서 방법을 찾다가 발견한 툴.
이게 훨씬 킹왕짱임.
netcat은 Linux에서 네트워크 관련 많은 것을 할 수 있게 해주는 가볍지만 강력한 프로그램임.
[포트 접속가능 여부 확인]
// google.com의 443 포트가 접속가능한 지 체크
[root@localhost]# nc -z google.com 443
Connection to google.com 443 port [tcp/https] succeeded!
// google.com의 440~450 포트 사이에 접속가능한 포트 스캔
[root@localhost]# nc -z -w 1 -v google.com 440-450 2>&1 | grep succeeded
[listening server]
// netcat은 listening 서버로도 사용가능.
// 서버에서 2222 포트로 listen
[root@server.com]# nc -l localhost 2222
// 클라이언트에서 서버의 2222 포트로 접속해서 hello 문자열 전송
[root@client.com]# nc server.com 2222
hello
// 서버에서 띄운 shell에 보면 클라이언트에서 보낸 hello 문자열이 찍혀 있음
[root@server.com]# nc -l localhost 2222
hello
[파일전송]
// 서버에서 2222 포트로 listen. 넘어온 데이터는 ./recv.dat 로 저장
[root@server.com]# nc -l localhost 2222 > ./recv.dat
// 클라이언트에서 파일을 읽어 서버로 전송
[root@client.com]# cat ./test.txt | nc server.com 2222
// 서버에서 전송받은 데이터를 recv.dat 에 기록하고 nc 프로세스는 종료됨
// recv.dat 파일을 열어보면 클라이언트에서 전송한 test.txt 파일의 내용이 들어있음을 확인 가능
-l 옵션으로 listening 하는 서버로 실행했을 때, 클라이언트가 접속해서 데이터를 보내고 종료되면 서버도 함께 종료됨.
종료되지 않고 계속 떠 있게 하려면 -k 옵션을 붙여주면 됨.
// 서버에서 2222 포트로 listen. -k 옵션이 함께 있으므로 클라이언트가 접속을 종료해도 서버는 안죽음.
[root@server.com]# nc -k -l localhost 2222
// 클라이언트에서 접속해서 hello 문자열을 보내고 ctrl + C로 종료
[root@client.com]# nc server.com 2222
hello
^C
// 그래도 서버는 살아있음
[root@server.com]# nc -k -l localhost 2222
hello
timeout 설정은 -w 옵션.
// connection timeout 1초 설정
[root@client.com]# nc -w 1 server.com 2222
아래는 nc의 옵션 리스트
-4: IPv4
-6: IPv6
-D: socket 디버깅 가능
-d: STDIN 입력을 읽어들이지 않음
-h: help
-i: send/recv, multiple port 연결 사이의 interval 지정.
-k: listening 모드로 실행되었을 때 연결이 완료되더라도 프로세스가 종료되지 않도록 하는 옵션. -l 옵션과 함께 사용되지 않으면 에러.
-l: listening 모드로 실행. -p, -s, -z 옵션과 함께 사용되면 에러. -w 옵션은 무시됨.
-n: hostname을 ip로만 지정.
-p: source port 지정. -l 옵션과 함께 사용되면 에러.
-r: source/destination port를 범위로 지정했을 때 랜덤한 순서로 연결시도.
-S: RFC 2385 TCP MD5 signature 옵션.
-s: 패킷을 전송할 IP 지정. -l 옵션과 함께 사용되면 에러.
-T: 연결에 ToS 지정.
-C: CRLF line-ending 전송.
-t: netcat을 telnet session으로 사용가능 하게.
-U: Unix Domain Socket을 사용하도록 지정.
-u: UDP 사용.
-v: verbose output.
-w: connection/stdin timeout 지정. -l 옵션과 함께 사용하면 무시됨.
-X: proxy version 지정.
-x: proxy server의 hostname, port 지정.
-z: 아무 데이터도 전송하지 않고 listening daemong만 스캔. -l 옵션과 함께 사용하면 에러.