nc
스크립트에서 명령을 실행하려고 하는데 내 스크립트가 nc
동일한 소스 포트를 사용하여 대상의 다른 포트에서 명령을 실행하고 있습니다.
예를 들어:
nc -p 8140 -z -v -n 10.X.X.9 9090
nc -p 8140 -z -v -n 10.X.X.9 9091
nc -p 8140 -z -v -n 10.X.X.9 9092
nc -p 8140 -z -v -n 10.X.X.9 9093
and so on ...
첫 번째 nc 실행 후 나머지 모든 줄에 대해 아래에 언급된 오류 메시지가 나타납니다.
nc: bind failed: Address already in use
nc: bind failed: Address already in use
nc: bind failed: Address already in use
이것을 피할 수 있는 방법이 있나요?
답변1
배경
이 방법을 사용 하려고 하면 nc
TCP 포트를 계속 열어두고 대상이 완료된 요청의 수신을 승인할 때까지 기다립니다. 이 점은Wikipedia의 TCP 기사.
기다리는 시간
(서버 또는 클라이언트) 원격 TCP가 연결 종료 요청에 대한 승인을 받을 수 있도록 충분한 시간을 대기함을 나타냅니다. [RFC 793에 따르면 연결은 MSL(Maximum Segment Lifetime)이라고 하는 최대 4분 동안 TIME-WAIT 상태에 있을 수 있습니다. ]
다음과 같은 것을 사용할 때 효과를 볼 수 있습니다 nc
.
$ nc -p 8140 -v -n 192.168.1.105 80
포트 8140의 상태를 확인하십시오.
$ netstat -anpt | grep 8140
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
실제로 대부분의 Linux 시스템에서는 이 시간이 TIME_WAIT
60초로 설정되어 있습니다.
$ cat /proc/sys/net/ipv4/tcp_fin_timeout
60
효과를 직접 확인하려면 이 코드 조각을 사용하여 포트가 릴리스되는 시기를 관찰할 수 있습니다.
$ date; nc -p 8140 -v -n 192.168.1.105 80 -w 1; date; \
while netstat -anpt | grep 8140; do date; sleep 10; done; date
Tue Mar 25 09:46:59 EDT 2014
Connection to 192.168.1.105 80 port [tcp/*] succeeded!
Tue Mar 25 09:47:00 EDT 2014
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
Tue Mar 25 09:47:00 EDT 2014
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
Tue Mar 25 09:47:10 EDT 2014
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
Tue Mar 25 09:47:20 EDT 2014
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
Tue Mar 25 09:47:30 EDT 2014
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
Tue Mar 25 09:47:40 EDT 2014
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
Tue Mar 25 09:47:50 EDT 2014
Tue Mar 25 09:48:00 EDT 2014
$
방법 #1 - NC 사용
포트 8140이 해제되는 데는 시간이 좀 걸립니다. 완전히 해제될 때까지 기다리거나(그동안 잠자기 상태를 유지하는 것이 쉬운 방법입니다) 다른 포트를 사용해야 합니다.
port@host가 열려 있는지 확인하고 싶다면 직접 삭제할 수 있습니다 -p 8140
.
$ nc -zv -n 10.X.X.9 9090-9093
예
$ nc -zv -n 192.168.1.200 2024-50000 |& grep -v refu
Connection to 192.168.1.200 5672 port [tcp/*] succeeded!
Connection to 192.168.1.200 35766 port [tcp/*] succeeded!
노트:특정 시간 동안만 기다리도록 지시하는 -w
옵션 을 추가해 볼 수도 있습니다 . nc
기본값은 nc
영원히 기다리는 것입니다. 따라서 귀하의 명령은 다음과 같습니다.
$ nc -p 8140 -zv -n 10.X.X.9 9090 -w 1
-w 60
하지만 1.84를 사용하는 CentOS 5.9 시스템에서 테스트한 결과 그 후에도 포트가 계속 사용되었으므로 적용되기까지 의 최소한의 시간이므로 사용하는 것이 가장 좋습니다 .TIME_WAIT
방법 #2 - nmap 사용
포트 세트를 스캔하는 데 더 적합한 애플리케이션을 사용하려면 이 를 사용하는 것이 좋습니다 nmap
.
$ sudo nmap -sS --source-port 8140 -p 9090-9093 10.X.X.9
예
$ sudo nmap -sS --source-port 8140 -p 80-85 homer
Starting Nmap 6.40 ( http://nmap.org ) at 2014-03-24 21:22 EDT
Nmap scan report for homer (192.168.1.105)
Host is up (0.0059s latency).
PORT STATE SERVICE
80/tcp open http
81/tcp closed hosts2-ns
82/tcp closed xfer
83/tcp closed mit-ml-dev
84/tcp closed ctf
85/tcp closed mit-ml-dev
MAC Address: 00:18:51:43:84:87 (SWsoft)
Nmap done: 1 IP address (1 host up) scanned in 11.36 seconds
iptraf
여기에서는 소스 포트 8140을 사용하여 트래픽이 이러한 포트로 전송된다는 것을 증명하는 필터를 설정했습니다 .
노트:주의를 기울이다#1다이어그램에는 소스 포트 8140이 표시되어 있지만#2내가 선택한 몇 개의 대상 포트(주로 80과 83)가 표시됩니다.
인용하다
답변2
나는 이것이 대답일지도 모른다고 생각했기 때문에 적어도 읽을 수 있습니다.
i=0 ; until {
nc -p 8140 -av -n 10.X.X.9 909${i} &&
[ $((i=i+1)) -gt 4 ]
} 2>&-
do sleep 1
done
사실 @slm에는 일리가 있습니다.nmap
- 웹 및 펜 테스트 작업에 없어서는 안 될 도구이며, 익숙해지는 데 시간을 투자할 가치가 있습니다. 그러나 5:1 포트 구성에서 두 시스템 간의 연결을 테스트하는 데는 약간의 시간이 걸릴 수 있습니다. 그렇다면 아마도 이것이 그것을 사용하는 방법을 배울 수 있는 완벽한 기회일 것입니다.
어쨌든, 아직 사용할 수 있는 것이 없다면,netcat
매우 유연합니다. 그리고 아마도 더 중요한 것은,nc
불필요한su root
해입력/출력 0개동일한 작업nmap
.
위의 답변에서 방금 사용했습니다.$i
대상 포트의 마지막 숫자를 다음으로 바꿉니다.0
첫 번째 라운드와$i
~의이후 가치가 추가됩니다. 왜냐면 내가 믿는 대로,nc
당신에게 반환해야true
로컬 포트를 바인딩할 수 있는 한 변수는$i
8140이 열려 있고nc
이를 사용하여 전화를 걸 수 있습니다.
$i
초과하지 않도록 테스트 증가9094
지정한 포트 범위(이 시점에서 결국 반환됨)true
그로 인해 만족스러운until
그리고 루프를 종료합니다.
말하자면,until
너할 수 있는bind
현지의8140 -p
성인귀하의 루프는sleep 1
두 번째로(@slm이 제안한 대로) 다시 시도하세요.
난 그냥 놓아버렸어stderr
그리고2>&-
그러니까 굳이 볼 필요 없어바인딩할 수 없습니다...터미널에 스팸을 보내세요. 그러나 쓰여진 대로 이것은 결코 필요하지 않을 수도 있습니다.sleep
매번 호출됩니다$i
루프가 중단되는 마지막 포트를 제외하고도 증가합니다. 따라서 반복 사이에 1초의 일시 중지는 바인딩된 로컬 포트를 제거하고 다음 반복에서 사용하기 위해 다시 여는 데 충분할 수 있습니다.
내가 뭔가 착각하고 있다면nc
반환 값과returns false
설령 그럴지라도할 수 있는8140은 로컬로 보호되지만 대상 포트는 닫혀 있으므로 보다 구체적인 용도로 쉽게 처리할 수 있습니다.$?
- 알려주세요.