Lesson 1: From Ping to HTTP
내 컴퓨터에 이것저것 깔기 싫으니 이럴때 c9을 쓴다. 아래와같이 명령어를 입력해 networking 환경을 만들어준다. 대부분은 이미 설치되어잇다.
sudo apt-get update
sudo apt-get install netcat-openbsd tcpdump traceroute mtr
Try some network things!
몇가지 해보라니깐 해본다. 아직 이게 뭔지 모르겠다.
ip addr show eth0
ip route show
ping -c3 8.8.8.8
host -t aaaa google.com
host -t mx udacity.com
tcpdump -n -c5 -i eth0 port 22
traceroute www.udacity.com
mtr www.udacity.com
printf 'HEAD / HTTP/1.1\r\nHost: en.wikipedia.org\r\n\r\n' | nc en.wikipedia.org 80
ping
ping -c3 8.8.8.8
8.8.8.8
은 google의 어떤 서비스의 주소이다. 핑(ping
)은 상대방과 내가 통신할때 메시지(패킷)가 왔다갔다 걸리는 평균시간을 알수 있다. -c3
는 세번 테스트 메시지를 보냈음을 뜻한다.
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=0.788 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=52 time=0.350 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=52 time=0.313 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2025ms
rtt min/avg/max/mdev = 0.313/0.483/0.788/0.217 ms
핑은 서버를 이용한 시스템이 아니라 os를 이용하는 시스템이다. url
이나 ip
에 echo
를 요청(request)하여 응답을 받는 시스템으로 인터넷만 연결되어 있다면 매우간단하게 상대방과 연결가능한지(running) 여부만 확인한다.
http
나 ssh
는 서버 프로그램이다.
HTTP
http는 GET, POST과 같은 요청(request)를 보내는거로 프로토콜로 생각하자. 80포트가 기본이고 ssh 22포트로 생각한다. 가장 높은 포트넘버는 65535(2^16-1) 가장낮은 포트넘버는 1이다.
printf & netcat
printf 는 서식화된 출력을 하는 명령어다.(f가 formatting의 약자)
\r
은 캐럿이 그 줄 맨 앞으로 간다.(Carriage return)
\n
은 캐럿이 다음 줄로 간다.(Line feed)
printf 'HEAD / HTTP/1.1\r\nHost: en.wikipedia.org\r\n\r\n'
HEAD / HTTP/1.1
Host: en.wikipedia.org
nc(netcat)은 네트워크 연결에서 데이터를 읽고 쓰는 간단한 유틸리티 프로그램이다. 이것을 이용해 서버와 대화를 나눌수도 있다. nc는 curl같은거의 하위호환같은거다.
printf 'HEAD / HTTP/1.1\r\nHost: en.wikipedia.org\r\n\r\n' | nc en.wikipedia.org 80
HTTP/1.1 301 TLS Redirect
Date: Thu, 13 Jul 2017 14:01:14 GMT
Server: Varnish
X-Varnish: 254384402
X-Cache: cp4009 int
X-Cache-Status: int
Set-Cookie: WMF-Last-Access=13-Jul-2017;Path=/;HttpOnly;secure;Expires=Mon, 14 Aug 2017 12:00:00 GMT
Set-Cookie: WMF-Last-Access-Global=13-Jul-2017;Path=/;Domain=.wikipedia.org;HttpOnly;secure;Expires=Mon, 14 Aug 2017 12:00:00 GMT
X-Client-IP: 104.155.216.0
Location: https://en.wikipedia.org/
Content-Length: 0
Connection: keep-alive
근데 도통왜 이렇게 되는지 잘모르겠따. 아마도 HEAD
가 http명령어 인듯하다. 정확히 저것들이 어떻게 |
를 통해 nc로 들어가는지 잘 모르겠다.
printf 'HEAD / HTTP/1.1\r\nHost: en.wikipedia.org\r\n\r\n' | nc en.wikipedia.org 80 > wikipeida.txt
결과를 txt파일로 저장할수 있다.
nc로 간단한 서버를 만들 수 있다. 이서버는 1234 port에서 통신한다.
nc -l 1234
다른 터미널을 열어 nc localhost 1234
를 하면 두터미널간에 대화를 할 수 있다.(내컴퓨터와 c9사이에서 확인해봤는데 이유는 모르겠지만 안된다. 이런걸로 해킹하는건가?)
웹브라우저에서 1234포트로 접속하면 브라우저상에서는 아무것도 뜨지않는다. 반면 터미널에는 아래와같은 메시지가 뜬다. 어 뭐지 싶다.
GET / HTTP/1.1
Host: localhost:8484
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4
이번엔 아까와 비슷한 코드를 터미널에 입력했다. 앞의 코드를 |
를통에 뒤에있는 코드에 넣는것이라고 했고, nc -l 2345
는 내컴퓨터에서 서버를 여는것이라고 했다. 브라우저에서 localhost:2345
로 들어가면 eff.org
페이지가 표시된다.
printf 'HTTP/1.1 302 Moved\r\nLocation: https://www.eff.org/' | nc -l 2345
Layer | Protocols | Concept |
---|---|---|
Application | HTTP, SSH | URLs. Password |
Transport | TCP, UCP | Port number |
Internet | IP | IP addresses |
Hardware | wifi, ethernet, DSL | signal strength, access points |