기타

linux - network, curl, netstat

whyHbr 2025. 2. 23. 19:39
728x90
반응형

curl

  • url을 통해 데이터를 전송하거나, 받을 때 시용되는 명령어
  • 주로 HTTP. HTTPS, FTP 등 다양한 프로토콜을 지원하여 웹 요청을 주고 받는데 사용한다.
  • //설치
    sudo apt update
    sudo apt install curl
    
    //버전 확인
    curl -V
    
    //전체 명령어
    curl --help all
    //기본적인 도움말
    curl --help
    
    //기본 문법
    curl [option] [URL]
    
    //HTTP GET 요청 보내기
    curl "<http://www.naver.com>
    curl -X GET <https://www.google.com/>
    
    //GET 요청 시 헤더만 보기. 서버가 응답하는지 확인 시 사용
    curl -I "<http://www.naver.com>
    
    //POST 요청 보내기
    curl -X POST -d "username=admin&password=12345" <https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com/>
    //POST 를 사용해 서버의 JSON 데이터 {"a":"1"} 를 전송 
    curl -X POST "<http://www.naver.com>" -H "Content-Type: application/json" -d '{"a": "1"}'
    //POST를 사용해 ./temp/a.jspn 파일의 내용을 서버에 전송
    
    //PUT
    curl -X PUT file.txt https:sfddsf.com
    
    //DELETE
    curl -X DELETE <https://sdfsa.com>
    
    //파일 다운로드
    curl -O http://"<http://www.naver.com>
    
    //파일 업로드
    curl -T file.txt 
    
    //헤더 포함 요청 보내기
    curl -H "Authorization: Bearer " <https://naver.com>
    
    //리디렉션 처리
    curl -L <https://naver.com>
    

 


netstat

  • 네트워크 연결 상태 확인, 네트워크 인터페이스 정보를 조회하는 명령어
  • 주로 TCP/UDP 연결 상태. 포트 사용 현황, 라우팅 테이블 조회 등 을 확인 하는데 사용.
    //기본 문법
    netstat  [option]
    
    //모든 네트워크 연결 보기
    netstat -a
    
    //활성 연결 및 상태 보기
    //t: tcp, u:udp, l: 수신 대기 상태인 소켓만 보기
    // n: ip주소와 포트 번호를 숫자 형태로 출력 (호스트 이름 해석하지 않음)
    netstat -tuln
    
    //특정 포트에 대한 연결 상태 확인
    netstat -an | grep :323
    
    //프로세스 id와 연결된 포트 보기
    //p: 해당 연결을 사용 중인 프로세스 PID화 함께 표시. 프로그램 이름도 출력
    netstat -tulnp
    
    //네트워크 인터페이스 정보
    netstat -i
    
    //라우팅 테이블 확인 
    netstat -r
    
    //-antp : 시스템에서 현재 활성화된 네트워크 연결 상태를 표시하는 명령어
    // -a: 모든 연결과 리스닝 소켓을 표시. 연결상태와 연결 대기 모두 보여준다
    // -n: 숫자 형식으로 출력. 호스트, 서비스 이름을 해석하지 않고 ip 주소와 포트 번호를 숫자 형태로 출력
    // -t: tcp 연결만 표시한다.
    // -p: 연결된 프로세스 PID를 표시한다.
    netstat -antp
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -
    
    ​
  • Recv-Q: 수신 대기 큐 (받을 데이터) 가 얼마나 있는지 나타냄.
  • send-Q: 송신 대기 큐(보낼 데이터) 가 얼마나 있는지 나타낸다.
  • Local Address: 로컬 시스템 IP 주소와 포트 번호. 모든 53번 포트를 리스닝 하고 있다는 뜻.
  • Foerign address: 원격 시스템의 IP주소와 포트 번호. 0.0.0.0:*는 연결된 원격 시스템의 IP 와 포트이다.
  • State: 연결된 상태를 나타낸다. Listen = 포트 대기 상태.
  • PID: 해당 연결을 사용하고 있는 PID와 이름.

TCP 상태값 (State 값)

  • SYN, ACK?
    • SYN: Synchronize
      • TCP 3 way handshakes 과정에서 사용되는 플래그
        • syn → syn-ack →ack
        • syn: 연결을 시작하는 요청을 나타내는 플래그.
        클라이언트가 서버와의 연결을 시작하면, 클라이언트는 syn 플래그를 설정한 패킷을 서버로 전송. 이때 클라이언트는 자신이 시작한 연결을 알리고, 서버가 연결 준비가 되었는지 확인
        • syn-ack: 서버가 연결을 수락하는 응답을 기다리는 플래그.
        서버가 클라이언트의 syn 연결을 받으면, 서버는 syn_ack 플래그를 설정. 응답한다. 이는 클라이언트가 보낸 연결 요청을 받았고, 연결을 수락한다는 것을 나타냄.
        • ack: 클라이언트와 서버 간의 연결을 확인하거나, 데이터가 잘 전달되었음을 확인하는 응답을 나타내는 플래그.
        클라이언트는 서버의 syn-ack 패킷을 받은 후, 연결을 확립했다는 것을 알리기 위해 ack 플래그를 설정한 패킷을 서버로 전송
      • 이 과정을 통해 연결이 확립, 데이터 전송이 시작된다.
  • LISTEN: 리스닝
    • 서버 측에서 설명을 기다리는 상태. 포트가 외부의 연결을 수신할 준비가 되어 있음을 나타낸다.
    • ex) 서비스가 특정 포트에서 연결을 기다리고 있을 때( 서버가 80번 포트에서 연결을 기다리는 상태)
    • 상황: 대기 상태
  • SYN_SENT: Synchronize 전송 대기. TCP 연결을 위한 플래그
    • 클라이언트가 SYN 패킷을 보내고, 서버의 응답을 기다리는 상태.
    • ex) 클라이언트가 서버에 연결 요청을 보내고, 서버가 이를 받았다는 응답을 기다리는 상태.
    • 상황: 연결 설정을 위한 초기 단계
  • SYN_RECEIVED: SYN 수신대기
    • 서버가 SYN 패킷을 받았고, SYN+ACK 응답을 받은 상태.
    • ex) 서버가 클라이언트의 연결 요청을 수락. 연결을 확립하기 위해 ACK를 기다리는 상태.
    • 상황: 연결 설정을 위한 두 번째 단계
  • ESTABLISHED : 연결 확립
    • 연결이 완전히 설정된 상태. 클라이언트와 서버 모두 데이터를 송수신할 수 있는 상태.
    • ex) 클라이언트와 서버가 데이터 통신을 하고 있는 상태
    • 연결이 성공적으로 설정되어 데이터 전송이 가능한 상태
  • FIN_WAIT_1: 종료대기 1
    • 한 쪽이 연결 종료를 보낸 상태.
    • ex) 클라이언트가 FIN 패킷을 보내고, 서버의 종료 응답을 기다리는 상태
    • 연결 종료를 시작한 단계
  • FIN_WAIT_2: 종료대기 2
    • 한 쪽이 FIN 상태를 보내고, 상대방이 그 패킷을 확인한 후 응답을 보낸 상태
    • ex) 서버가 클라이언트의 종료 요청을 받고, 응답을 보내면서 FIN_WAIT_2 상태로 넘어가는 경우
    • 상황: 종료 대기 상태, 상대방의 종료 요청을 기다리는 상태
  • CLOSE_WAIT : 종료대기
    • 상대방이 연결 종료 요청을 보낸 상태.
    • 상대방이 종료 요청을 보냈고, 현재 해당 요청에 대한 응답을 기다리면서 종료를 준비하는 상태
    • 서버가 클라이언트의 종료 요청을 받고, 응답을 기다리는 상황
    • 상황: 종료 대기 상태
  • CLOSING: 종료 중
    • 양쪽이 연결 종료를 동시에 시도하고 있는 상태. FIN 패킷을 양측이 동시에 보낸 상태에서 나타난다.
    • 상황: 종료 중, 양쪽 모두 종료 요청을 보내는 상태.
  • LAST_ACK: 최종 확인 대기
    • 종료 요청을 한 쪽에서 종료 응답을 기다리는 상태. 상대방이 종료 패킷을 보내면 이를 확인하고 연결을 종료한다.
    • 클라이언트가 연결 종료를 요청하고, 서버의 FIN 패킷을 보낸 후 마지막 ACK 를 기다리는 상태.
    • 상황: 종료를 마무리하는 단계에서의 대기 상대
  • TIME_WAIT: 시간 대기
    • 연결 종료 후, 잠시 동안 기다리는 상태. 이 상태에서는 상대방이 마지막 ACK 패킷을 수신했는지 확인, 포트를 다시 사용하기까지 일정 시간 대기
    • 클라이언트가 종료 패킷을 보낸 후, 마지막 ACK 를 기다리고 있는 상태
    • 상황: 종료가 완전히 이뤄진 후, 시스템이 잠시 동안 종료 상태를 유지하는 단계.
  • CLOSED: 종료됨
    • 연결이 완전히 종료된 상태. 더 이상 연결 할 수 없으며, 모든 자원 해지

curl, netstat 활용 시나리오

// 1.curl 사용해 서버가 응답하는지 확인
curl -I <https://example.com>

// 2. 특정 포트에서 서버가 수신 대기 중인지 확인
netstat -tuln | grep :80

//3. 웹서버가 응답하는 http 코드 확인
curl -I <https://naver.com>

//4. 연결된 포트와 PID 확인
netstat -tulnp
728x90