..

Tổng hợp về mạng máy tính

Các kiến thức cơ bản

OSI Model

Mô hình OSI là một mô hình tham chiếu để mô tả cách mà các hệ thống mạng hoạt động. Nó phân chia quá trình xử lí dữ liệu ra thành nhiều phần. Các tầng trong mô hình OSI bao gồm:

  • Tầng 7: Ứng dụng (Application Layer)
  • Tầng 6: Trình bày (Presentation Layer)
  • Tầng 5: Phiên (Session Layer)
  • Tầng 4: Vận chuyển (Transport Layer)
  • Tầng 3: Mạng (Network Layer)
  • Tầng 2: Liên kết dữ liệu (Data Link Layer)
  • Tầng 1: Vật lý (Physical Layer)

...

Để hiểu rõ hơn về chức năng của từng tầng thì mọi người có thể tham khảo cuốn Computer Network - A Top-Down Approach.

Ngoài ra ta còn có mô hình TCP/IP, đây là phiên bản ngắn gọn của OSI Model và được sử dụng rộng rãi trong thực tế.

Mô hình TCP/IP là một bộ giao thức mạng được thiết kế để kết nối mạng máy tính với nhau. Nó là một hệ thống các giao thức liên kết với nhau, cung cấp khả năng truyền dữ liệu từ máy này sang máy khác qua mạng.

...

Có 4 tầng với các chức năng lần lượt như sau:

  • Tầng truy cập mạng (network access): đảm bảo việc gửi và nhận dữ liệu trên phương tiện vật lý của mạng. Tầng này xử lí tất cả các vấn đề liên quan đến cách dữ liệu được truyền từ thiết bị này sang thiết bị khác.

  • Tầng network (mạng): Chịu trách nhiệm định tuyến và chuyển tiếp các gói dữ liệu giữa các mạng khác nhau
  • Tầng transport (giao vận): chịu trách nhiệm cho việc truyền dữ liệu đáng tin cậy giữa các ứng dụng chạy trên các thiết bị khác nhau.

  • Tầng application (ứng dụng): tầng ứng dụng trong mô hình TCP/IP cung cấp các dịch vụ mạng cần thiết cho các ứng dụng mà người dùng sử dụng, như trình duyệt web, email, và các dịch vụ truyền file.

Protocol

Protocol là một tập hợp các quy tắc xác định cách dữ liệu được truyền và nhận giữa các thiết bị với nhau. Một số giao thức phổ biến cần nắm rõ như : TCP, UDP, IP

  • TCP (Transmission Control Protocol):
    • TCP hoạt động ở tầng vận chuyển của mô hình OSI. Nó thiết lập một kết nối giữa hai thiết bị trước khi trao đổi dữ liệu, đảm bảo việc truyền thông tin đáng tin cậy và theo thứ tự.
    • Tiến trình thiết lập kết nối ở TCP được gọi là tiến trình bắt tay 3 bước (three way handshake).

Cấu trúc gói tin TCP:

...

  • UDP (User Datagram Protocol):
    • UDP cũng hoạt động ở tầng vận chuyển của mô hình OSI, tuy nhiên UDP khác với TCP ở chỗ nó là connectionless, tức là khi gửi dữ liệu nó không cần thiết lập kết nối giữa hai thiết bị. Nó chỉ cần xác định thiết bị đích và gửi dữ liệu.
    • UDP không cần xác nhận lại xem dữ liệu có được gửi tới thiết bị đích hay không cho nên UDP nhanh hơn so với TCP.
  • IP (Internet Protocol):
    • IP hoạt động ở tầng mạng của mô hình OSI. Nó chịu trách nhiệm xử lí địa chỉ và định tuyến để đảm bảo các gói dữ liệu đến đúng đích
    • Mỗi thiết bị trong mạng sẽ được gán cho một địa chỉ IP duy nhất.

Ports

Port là một khái niệm dùng để chỉ cổng truy cập kết nối. Các port là các cổng ảo trên máy tính, cho phép truyền và nhận dữ liệu. Việc sử dụng port giúp máy tính phân biệt dễ dàng giữa các loại dữ liệu khác nhau đi vào nó. Ví dụ port 80 là http, port 443 là https, port 22 là ssh.

Ports hoạt động ở tầng 4 trong mô hình OSI (transport layer)

IP hoạt động ở tầng 3 (network layer), có nhiệm vụ định tuyến data packet tới địa chỉ IP nào. TCP và UDP hoạt động ở tầng 4 (transport layer) xác định data packet nên đi tới port nào trên máy chủ, trong header của TCP và UDP có một phần để chỉ định port.

Subnetting

IP được chia ra làm hai loại là IPv4 và IPv6:

  • IPv4: sử dụng 32 bit nhị phân được chia thành 4 cụm 8 bit (octet) để làm địa chỉ. Ví dụ : 192.0.2.126 là một địa chỉ IPv4. Với 32 bit thì có tối đa khoảng 4 tỷ địa chỉ IP
  • IPv6 là phiên bản mới nhất của giao thức Internet, IPv6 sử dụng 128 bit để làm địa chỉ, chi tiết về cấu trúc địa chỉ IPv6 thì mình sẽ nói sau.

Về phần subnetting thì mọi người tham khảo tại đây

Ta sẽ đi tìm hiểu một số topic nâng cao hơn về mạng ở các phần sau đây.

Tunneling

Tunneling là một kĩ thuật truyền tin qua mạng bằng cách đóng gói các gói tin ( tức là ta có một gói tin lớn, đóng gói gói tin nhỏ hơn rồi chuyển đi) và ở đích đến thì người nhận có thể mở ra và xem (encap và decap).

Mục đích của việc đóng gói như vậy là để đi qua một mạng trung gian mà bình thường gói tin không đi được.

Một ví dụ dễ hiểu là việc ta gửi thư thông qua bưu điện, thay vì gửi trực tiếp lá thư đó thì ta sẽ bỏ vào phong bì, ở trên phong bì này sẽ chứa thông tin về người nhận, địa chỉ của bức thư.

Một gói tin đi qua tunnel gồm hai phần chính: phần header bên ngoài chứa thông tin định tuyến của tunnel, và phần payload chứa toàn bộ gói tin gốc đã được đóng gói.

Lợi ích của việc đóng gói gói tin có thể kể đến như sau: Giả sử ta muốn thiết lập kết nối WAN giữa 2 cụm mạng A và B. Giao thức mà ta muốn triển khai là IPv6, tuy nhiên có một số network giữa 2 cụm A và B chỉ hỗ trợ IPv4. Lúc này ta sẽ đóng gói gói tin IPv6 vào trong gói tin IPv4 để có thể tiếp tục kết nối

  • Note: https://viblo.asia/p/ky-thuat-chuyen-doi-ipv4-sang-ipv6-su-dung-cong-nghe-duong-ham-tunnel-m68Z08XXZkG

Ngoài ra tunnel cũng có hỗ trợ mã hóa để thiết lập kênh truyền tin an toàn.

Nổi bật nhất như ta đã biết đó là VPN Tunnel

Đa số VPNs sử dụng IPsec protocol. IPsec là một nhóm các protocols chạy trực tiếp trên IP của tầng mạng (network layer)

  • Note: https://viblo.asia/p/giao-thuc-ipsec-trong-linh-vuc-an-toan-thong-tin-oOVlYdPQZ8W

Khi một user kết nối thiết bị tới VPN, mặc định toàn bộ lưu lượng mạng của máy sẽ đi qua VPN Tunnel. Tuy nhiên việc kết nối thông qua VPN Tunnel sẽ khiến tốc độ mạng trở nên chậm đi và không phải kết nối nào cũng cần tới VPN. Vì vậy ta mới cần đến một cơ chế gọi là split tunneling

Split tunneling cho phép một số mạng/đích cần thiết đi qua VPN còn phần còn lại thì không

Tiếp theo ta có khái niệm về GRE Tunneling

GRE là Generic Routing Encapsulation, đây là một giao thức được phát triển bởi Cisco, cho phép đóng gói nhiều loại giao thức lớp Network trong các liên kết Point-to-Point

Một GRE Tunnel được sử dụng khi các gói dữ liệu cần được gửi giữa các mạng khác nhau thông qua internet. Với GRE được cấu hình, 1 đường hầm ảo được tạo giữa 2 Router và các gói tin gửi giữa 2 mạng nội bộ sẽ được truyền qua GRE Tunnel.

Tuy nhiên GRE Tunnel không được mã hóa, để bảo vệ dữ liệu ta cần sử dụng IPsec kết hợp kèm với GRE.

IPsec GRE Tunnel về cơ bản giống với IPsec VPN site to site khi cả hai giao thức đều tạo 1 tunnel để kết nối giữa 2 site cho phép truyền dữ liệu qua chúng.

Một khái niệm đơn giản gần gũi hơn đó là IP-in-IP. IP-in-IP là một giao thức tunneling có vai trò đóng gói các gói tin IP vào bên trong các gói tin IP khác rồi gửi chúng đi —> việc gửi đi không hề được thiết lập thêm các thuật toán mã hóa cho nên sẽ không an toàn và mục đích chính của việc sử dụng giao thức này là để phục vụ định tuyến/kết nối giữa các mạng khi mạng trung gian không hỗ trợ trực tiếp

mTLS - Mutual TLS

mTLS là viết tắt của Mutual Transport Layer Security, phát triển từ TLS.

Trước tiên ta nhắc lại cách mà TLS hoạt động:

...

  1. ‘Client hello’ message: Client bắt đầu quy trình bắt tay bằng cách gửi một gói tin hello tới server. Trong message cũng đính kèm thêm thông tin về phiên bản TLS mà client hỗ trợ, các thuật toán mã hóa cùng một số thông tin khác
  2. ‘Server hello’ message: Server đáp lại gói tin hello của client bằng việc gửi lại một gói tin hello khác. Gói tin này cũng bao gồm chứng chỉ SSL của server, và một số thông tin khác.
  3. Authentication: Client sẽ kiểm tra chứng chỉ của server và kiểm tra thêm rằng liệu chứng chỉ này có được một CA tin cậy kí hay không. Ngoài ra nó cũng sẽ kiểm tra thêm các thông tin khác để đảm bảo rằng mình đang giao tiếp với server thực sự.
  4. Premaster key: Client sinh một khóa ngẫu nhiên gọi là premaster-key rồi gửi cho Server key đã mã hóa bằng public key của server. Sau đó server sẽ giải mã và lấy lại key này bằng khóa riêng của mình.
  5. Như vậy cả hai đều đạt được một khóa chung và sẽ dùng khóa này để mã hóa các đoạn tin nhắn về sau.

-> Vai trò của TLS là giúp đảm bảo 3 yếu tố CIA khi giao tiếp qua mạng.

mTLS sẽ mở rộng quy trình xác thực của TLS ra, thay vì chỉ mỗi client xác minh server thì giờ đây server cũng sẽ xác minh client bằng cert bên phía client.

Demo: Bây giờ ta sẽ đóng vai trò là CA root để xác minh cho cert từ phía server và client. Server và Client sẽ cung cấp các file, server.crt cũng như là client.crt cho bên CA để cung cấp cert. Hai file server.key và client.key là các khóa bí mật sẽ được mỗi bên tự quản lí.

File ca.conf để tạo ca.crt trông như sau:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
CN = localhost

[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
IP.1 = 127.0.0.1

...

Cấu trúc cây thư mục:

.
├── certs
│   ├── ca.conf
│   ├── ca.crt
│   ├── ca.key
│   ├── ca.srl
│   ├── client.crt
│   ├── client.csr
│   ├── client.key
│   ├── server.crt
│   ├── server.csr
│   └── server.key
├── client
│   └── main.go
└── server
    └── main.go

Quy trình thực hiện như sau:

Tạo cert cho client và server:

openssl req -newkey rsa:2048 -nodes -keyout ca.key -x509 -days 365 -out ca.crt -subj "/CN=MyCA"

openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr -subj "/CN=localhost"


openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -extfile ca.conf -extensions v3_req


openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr -subj "/CN=MyClientUser"

openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365

Bên phía client:


package main

import (
	"crypto/tls"
	"crypto/x509"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
)

func main() {
	caCert, err := os.ReadFile("../certs/ca.crt")
	if err != nil {
		log.Fatal(err)
	}
	caCertPool := x509.NewCertPool()
	caCertPool.AppendCertsFromPEM(caCert)

	cert, err := tls.LoadX509KeyPair("../certs/client.crt", "../certs/client.key")
	if err != nil {
		log.Fatal(err)
	}

	client := &http.Client{
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{
				RootCAs:      caCertPool,
				Certificates: []tls.Certificate{cert},
			},
		},
	}

	resp, err := client.Get("https://localhost:8443")
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("Status: %s\nBody: %s\n", resp.Status, body)
}

Bên phía server:

package main

import (
	"crypto/tls"
	"crypto/x509"
	"fmt"
	"log"
	"net/http"
	"os"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello %s, mTLS handshake success!", r.TLS.PeerCertificates[0].Subject.CommonName)
}

func main() {
	caCert, err := os.ReadFile("../certs/ca.crt")
	if err != nil {
		log.Fatal(err)
	}

	caCertPool := x509.NewCertPool()
	caCertPool.AppendCertsFromPEM(caCert)

	tlsConfig := &tls.Config{
		ClientCAs:  caCertPool,
		ClientAuth: tls.RequireAndVerifyClientCert,
		MinVersion: tls.VersionTLS13,
	}

	server := &http.Server{
		Addr:      ":8443",
		TLSConfig: tlsConfig,
		Handler:   http.HandlerFunc(handler),
	}

	err = server.ListenAndServeTLS("../certs/server.crt", "../certs/server.key")
	if err != nil {
		log.Fatal(err)
	}
}

Chạy hai file main.go trong từng thư mục và quan sát kết quả:

go run main.go 

Switch, Hub và Router

LAN, WAN, vLAN

  • LAN là viết tắt của Local Area Network hay còn gọi là mạng cục bộ.

Mạng cục bộ là mạng máy tính kết nối các máy tính trong một khu vực giới hạn như nhà, trường học, v.v…

...

  • WAN – Wide Area Network là mạng diện rộng

Mạng diện rộng (WAN) là mạng bao phủ một khu vực rộng (tức là, bất kỳ mạng viễn thông nào liên kết qua các ranh giới đô thị, khu vực, quốc gia hoặc quốc tế) bằng cách sử dụng các đường viễn thông cho thuê. Các thực thể kinh doanh và chính phủ sử dụng WAN để chuyển tiếp dữ liệu giữa các nhân viên, khách hàng, người mua và nhà cung cấp từ các vị trí địa lý khác nhau.LAN

...

Cuối cùng là vLAN.

vLAN hay còn gọi là mạng LAN ảo (viết tắt của virtual LAN). Mạng này được xây dựng từ một hoặc nhiều mạng LAN hiện có.

Bài toán đặt ra như sau:

Routing

Routing là quá trình quản lý và điều hướng gói dữ liệu (data packet) từ nguồn tới đích một cách hiệu quả.

Để làm được điều đó thì router sử dụng route table và protocol.

Network troubleshooting