Mạng máy tính hoạt động như thế nào?

08:13 PM 20/05/2019 In bài viết

Thật không may, chủ đề về mạng được các nhà phân tích đánh giá là khá nhàm chán đối với hầu hết dân CNTT. Tất cả các công nghệ, giao thức và thực tiễn tốt nhất được sử dụng đều khá cũ; chúng đã ở xung quanh chúng ta và đảm bảo khả năng liên lạc giữa hàng triệu thiết bị trong một thời gian dài. Ngay cả các lập trình viên cũng thường coi mạng là một điều hiển nhiên và thường không nghĩ nhiều về cách chúng làm việc.

Tương tự, chúng ta cũng sử dụng các từ như IP và DNS mỗi ngày nhưng lại không hiểu cách thức nó hoạt động và thử nó như thế nào. Một thái độ như vậy không chỉ không đúng mà còn sai đối với sự nghiệp của các kỹ sư CNTT có lòng tự trọng. Không quan trọng bạn đã học được bao nhiêu khung phần mềm; nếu không có kiến ​​thức về mạng, bạn vẫn chưa thực sự nghiêm túc. Không có thành phần nào của cơ sở hạ tầng là nằm trong hộp đen, đối với cả nhà phát triển, quản trị viên và chính bạn.

Mục tiêu của bài viết này không phải là hướng dẫn toàn diện về mạng nhưng chúng ta sẽ tập trung vào cấu trúc mạng, các thành phần cơ bản của nó và xem cách chúng được sử dụng trong thực tế với sự trợ giúp của máy ảo và ảo hóa phần cứng.

Mô hình OSI

Trước hết, chúng ta cần làm quen với OSI (Open Systems Interconnection Reference Model -  Mô hình tham chiếu kết nối các hệ thống mở), một mô hình chuẩn hóa giao tiếp giữa các giao thức mạng.

OSI chia giao tiếp thành bảy lớp, mỗi lớp có một bộ giao thức riêng. Trên thực tế, bạn sẽ nghe những điều như "nó xảy ra ở lớp thứ ba" rất nhiều.

Bảy lớp của OSI bao gồm:

  1. Lớp vật lý (Physical Layer)
  2. Lớp liên kết dữ liệu (Data link layer)
  3. Lớp mạng (Network layer)
  4. Lớp giao vận (Transport layer)
  5. Lớp phiên (Session layer)
  6. Lớp trình diễn (Presentation layer)
  7. Lớp ứng dụng (Application layer)

Lớp vật lý

Các giao thức của lớp này chịu trách nhiệm cho giao tiếp phần cứng ở cấp độ thấp nhất. Việc truyền dữ liệu bằng dây (hoặc không dây) được mô tả trong lớp này. Ví dụ về các giao thức bao gồm Wi-Fi, Bluetooth và DSL (kết nối kỹ thuật số thông qua cáp đồng của mạng điện thoại).

Lớp liên kết dữ liệu

Lớp liên kết dữ liệu chịu trách nhiệm truyền dữ liệu giữa hai thiết bị trong một mạng. Dữ liệu được truyền trong các khung (đơn vị truyền dữ liệu kỹ thuật số trong mạng máy tính và viễn thông, mỗi khung chứa địa chỉ vật lý của người gửi và người nhận). Địa chỉ này được gọi là địa chỉ MAC (Media Access Control-kiểm soát truy cập phương tiện truyền thông).

Vậy, ai là người gửi và ai là người nhận?

Trước hết, mọi thiết bị (bao gồm cả máy tính xách tay của bạn) đều có một bộ điều khiển giao diện mạng (Network Interface Controller – NIC). Đây là một phần cứng (hoặc phần cứng ảo) chịu trách nhiệm gửi và nhận các khung. NIC có một địa chỉ MAC và nó là duy nhất thường được nhúng trong phần cứng hoặc được tạo ra bởi hệ thống ảo hóa.

Tất nhiên, một thiết bị có thể có nhiều NIC. Một ví dụ về các giao diện sử dụng lệnh “ip”:

[root@localhost ~]$ ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 52:54:00:05:36:e6 brd ff:ff:ff:ff:ff:ff

Trong trường hợp này, một giao diện được sử dụng để liên lạc với thế giới qua mạng là “eth0” và nó có địa chỉ MAC là “52: 54: 00: 05: 36: e6”. Nhưng “lo” là gì?

“lo” là một giao diện ảo cụ thể mà hệ thống sử dụng để giao tiếp với chính nó. Nhờ có “lo”, các ứng dụng nội bộ có thể giao tiếp với nhau, thậm chí không cần kết nối mạng.

Có thể bạn đã nhận thấy rằng máy tính của bạn có hàng tỷ dây cáp được kết nối trực tiếp với tất cả các máy tính trên thế giới. Một mạng cần các thiết bị bổ sung cho tổ chức của nó.

Ví dụ, bộ chuyển mạch, hay còn được gọi là switch.

Switch là một thiết bị cấu thành mạng và tất cả thiết bị của chúng ta được kết nối với nó thông qua các cổng. Nhiệm vụ của bộ chuyển mạch L2 (có nhiều công cụ nâng cao hơn như L3 và thậm chí L7) là chuyển tiếp các khung từ địa chỉ MAC người gửi sang địa chỉ MAC người nhận. Nhiều thiết bị được kết nối với một bộ chuyển mạch tạo thành một mạng cục bộ, hay còn gọi là mạng LAN.

Tất nhiên, một loạt các máy chủ được kết nối với một bộ chuyển mạch là cách để tạo ra một mạng. Nhưng điều gì sẽ xảy ra nếu chúng ta muốn thiết lập một mạng lưới các máy chủ được đặt ở những nơi khác nhau? Hoặc giả sử, chúng ta muốn phân tách hợp lý các máy chủ được kết nối với một bộ chuyển mạch thành các mạng khác nhau?

Trong những trường hợp như vậy, Vlan (mạng lan ảo cục bộ) được tạo ra. Bạn có thể triển khai bằng cách sử dụng một bộ chuyển mạch. Nó hoạt động khá đơn giản: Một tiêu đề bổ sung dán nhãn Vlan được thêm vào khung và nó xác định mạng của khung mà nó thuộc về.

Một thiết bị khác cần có là cầu nối. Cầu L2 được sử dụng để kết nối hai mạng. Nó được hình thành bằng cách sử dụng các bộ chuyển mạch như được mô tả theo hình dưới đây:

Bộ chuyển mạch và cầu nối giúp kết nối nhiều thiết bị với nhau thành một mạng. Ngoài ra còn có các bộ định tuyến kết nối mạng; chúng làm việc trên L3. Ví dụ: bộ định tuyến Wi-Fi của bạn kết nối mạng cục bộ của bạn (nơi có máy tính xách tay, điện thoại di động và máy tính bảng của bạn) với Internet.

Ngoài LAN chúng ta còn có một số loại mạng khác: Ví dụ: mạng diện rộng WAN, mạng dữ liệu được thiết kế để kết nối giữa các mạng đô thị giữa các khu vực địa lý cách xa nhau, ngoại trừ việc Internet hoàn toàn xóa các ranh giới địa lý của một mạng. Bạn có thể coi Internet là một mạng WAN,

Như đã đề cập ở trên, chúng ta còn có các bộ chuyển mạch L3. Nó không chỉ chuyển tiếp các khung từ thiết bị này sang thiết bị khác mà còn có một số tính năng nâng cao như định tuyến. Đó là sự khác biệt giữa bộ định tuyến và bộ chuyển mạch L3.

Lớp mạng

Trên lớp mạng thứ ba, địa chỉ IP được sử dụng thay vì địa chỉ MAC. Hãy xem IP của thiết bị chúng ta đang sử dụng trong bài viết này bằng cách sử dụng cùng một lệnh “ip”:

[root@localhost ~]$ ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:05:36:e6 brd ff:ff:ff:ff:ff:ff inet 192.168.122.212/24 brd 192.168.122.255 scope global dynamic eth0 valid_lft 2930sec preferred_lft 2930sec inet6 fe80::5054:ff:fe05:36e6/64 scope link valid_lft forever preferred_lft forever

Địa chỉ  được gán cho giao diện eth0 là “192.168.122.212/24”

Nhưng “/24” là gì? Và tại sao giao diện logic ảo trong bộ định tuyến có “/8”? Có lẽ bạn đã từng nghe nói về việc có bốn địa chỉ IPv4 294 967 296. Internet không phải là một mạng lớn mà là nhiều mạng nhỏ. Hơn thế nữa, các khối riêng biệt của địa chỉ IP là dành cho các loại mạng khác nhau (ví dụ: mạng riêng tư không thể truy cập từ bên ngoài).

Ở đây chúng ta tìm hiểu về địa chỉ IPv4 thay vì IPv6 vì quá trình chuyển đổi hoàn toàn sang IPv6 vẫn chưa xảy ra.

CIDR là phương pháp phân bổ địa chỉ IP cho các loại mạng khác nhau. Và ký hiệu CIDR là một cách để viết khối này theo định dạng “192.168.122.212/24”, trong đó số “/24” được gọi là mặt nạ mạng, giúp nó có thể biết được có bao nhiêu địa chỉ trong khối này.

IPv4 là một số đơn giản với độ dài 32 bit, có thể được biểu diễn dưới dạng mã nhị phân. Với định dạng mã nhị phân, địa chỉ IP đi từ 00000000000000000000000000000000 đến 1111111111111111111111111111111111. Để thuận tiện, hãy chia số này thành bốn phần, mỗi phần có tám chữ số: 11111111.1111111.1111111.1111111. Trong hệ thống thập phân mà chúng ta đã quen, địa chỉ này sẽ là: 255.255.255.255.

“/24” có thể được biểu diễn dưới dạng 255.255.255.0 hoặc theo ký hiệu nhị phân, 11111111.11111111.1111111.00000000. Để tìm địa chỉ đầu tiên và địa chỉ cuối cùng của mạng, chúng ta có thể sử dụng một trong các địa chỉ và một mặt nạ mạng, áp dụng phép toán thao tác bit cho ký hiệu nhị phân của chúng:

11000000.10101000.01111010.11010100 & 11111111.11111111.1111111.00000000 = 11000000.10101000.01110100000000000

Dịch kết quả dưới dạng có thể đọc được: 192.168.122.0 là địa chỉ bắt đầu của mạng của chúng ta. Để đếm số lượng của tất cả các địa chỉ có thể truy cập, chúng ta cần đếm số không trong mặt nạ mạng. Trong trường hợp này, có tám số không, hoặc vị trí. Mỗi vị trí trong đó có thể sở hữu giá trị 1 hoặc 0, đó là lý do tại sao chúng ta nhận được 28 hay 256 địa chỉ. Điều đó có nghĩa là địa chỉ cuối cùng sẽ là 192.168.122.255.

ARP

Chúng ta đều biết rằng L2 sử dụng địa chỉ MAC và L3 - địa chỉ IP. Phải có một số cơ chế liên kết địa chỉ MAC với địa chỉ IP của nó. Cơ chế này được gọi là ARP (Address Resolution Protocol-Giao thức phân giải địa chỉ).

Linux có một lệnh cùng tên “arp” cho phép chúng ta xem bảng địa chỉ MAC mà thiết bị biết và địa chỉ IP được ánh xạ tới chúng.

[root @ localhost] # arp -n Địa chỉ HWtype HWaddress Flag Mask Iface 192.168.178.1 ether 5c: 49: 79: 99: f3: 23 C wlp3s0

Trong trường hợp này, 192.168.178.1 là địa chỉ IP của bộ định tuyến Wi-Fi mà máy tính xách tay của tôi được kết nối qua giao diện wlp3s0.

Lệnh “arp” được coi là lỗi thời và chúng tôi khuyên bạn nên sử dụng “ip neigh” thay vì nó.

Một trong các kiểu tấn công mạng được kết nối với ARP và nó được gọi là giả mạo ARP. Mục tiêu của một cuộc tấn công như vậy là để thay thế địa chỉ MAC được liên kết với một địa chỉ IP nhất định bằng địa chỉ từ thiết bị của kẻ tấn công.

DHCP

Nhưng chính xác thì một giao diện mạng được gán cho địa chỉ IP như thế nào? Một trong các tùy chọn là thủ công. Nhược điểm là bạn phải tự mình thực hiện. Nếu bạn không tự tin với khả năng của mình, bạn có thể định cấu hình các địa chỉ trùng lặp và gây xung đột.

Tùy chọn khác: Giao thức cấu hình máy chủ động (Dynamic Host Configuration Protocol-DHCP), giao thức được sử dụng để đặt cấu hình, bao gồm địa chỉ IP một cách  tự động.

Để DHCP hoạt động, bạn cần một máy chủ DHCP, nơi sẽ gán địa chỉ IP và máy khách DHCP trên thiết bị của bạn. Đối với người dùng cá nhân, máy chủ DHCP thường được đặt trong bộ định tuyến.

Để hiểu chính xác DHCP hoạt động như thế nào, bạn cần tập trung vào "phát sóng”.

Đây là một quá trình trong đó máy chủ của chúng ta chuyển một tin nhắn đến tất cả các máy chủ trong mạng vì nó không biết chính xác thông tin cần thiết nằm ở đâu.

Quá trình xảy ra như sau:

  1. Máy khách DHCP gửi tin nhắn phát sóng với yêu cầu "Tôi cần địa chỉ IP"
  2. Máy chủ DHCP bắt được nó và gửi lại tin nhắn phát sóng "Tôi có địa chỉ IP x.x.x.x, bạn có muốn không?"
  3. Máy khách DHCP nhận được tin nhắn và gửi một tin nhắn khác: "Có, tôi muốn địa chỉ x.x.x.x"
  4. Máy chủ DHCP trả lời "Ok, x.x.x.x thuộc về bạn"

Và các cài đặt kết nối được lưu trữ ở đâu?

Các cài đặt kết nối được lưu trữ trong “/etc/sysconfig/network-scripts”. Đó là nơi bạn có thể chỉnh sửa những thứ như cách gán địa chỉ IP (tự động hoặc tĩnh), cho dù để bắt đầu kết nối tự động khi hệ thống tải hay không, v.v. Ví dụ, dưới đây là cách cấu hình kết nối Wi-Fi của tôi trông như thế nào :

[root@localhost network-scripts]# cat ifcfg-FRITZ-Box_7490

HWADDR=4C:34:88:54:C1:2B

ESSID="FRITZ!Box 7490"

MODE=Managed

KEY_MGMT=WPA-PSK

TYPE=Wireless

BOOTPROTO=dhcp

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

NAME="FRITZ!Box 7490"

UUID=55ba9218-1d2f-407d-af13-51502d542edb

ONBOOT=yes

SECURITYMODE=open

PEERDNS=yes

PEERROUTES=yes

IPV6_PEERDNS=yes

IPV6_PEERROUTES=yes

Hãy chú ý đến “BOOTPROTO=dhcp”,  tùy chọn này có nghĩa là máy tính của tôi sẽ sử dụng máy chủ DHCP để nhận địa chỉ IP. Để so sánh, dưới đây cấu hình kết nối cho thiết bị giao diện ảo:

[root@localhost network-scripts]# cat ifcfg-lo

DEVICE=lo

IPADDR=127.0.0.1

NETMASK=255.0.0.0

NETWORK=127.0.0.0

# If you're having problems with gated making 127.0.0.0/8 a martian,

# you can change this to something else (255.255.255.255, for example)

BROADCAST=127.255.255.255

ONBOOT=yes

NAME=loopback

Địa chỉ tĩnh được chỉ định ở đây là: “IPADDR = 127.0.0.1”. Ở nhà, bạn có thể sử dụng công cụ “nmcli” hoặc cài đặt gói “Networkmanager-tui”, nó sẽ cung cấp giao diện văn bản thân thiện với người dùng ngay trong bảng điều khiển của bạn thay vì chỉnh sửa cấu hình thủ công. Trong các điều kiện trường, trên các máy chủ, tốt nhất bạn không nên làm điều này mà sử dụng hệ thống cấu hình (Puppet, Chef, Salt) thay thế.

Một phần quan trọng hơn của cấu hình: định tuyến. Làm thế nào để biết được lưu lượng sẽ chảy tới đâu? Mọi thứ đều khá đơn giản: Chỉ cần xem bảng định tuyến cục bộ bằng lệnh “ip_r”. Tại thời điểm viết bài, tôi đang ngồi trong quán cà phê với máy tính xách tay, sử dụng điện thoại di động làm bộ định tuyến. Đây là những gì “ip_r” thể hiện:

default via 172.20.10.1 dev wlp3s0 proto static metric 600

172.20.10.0/28 dev wlp3s0 proto kernel scope link src 172.20.10.3 metric 600

192.168.100.0/24 dev virbr2 proto kernel scope link src 192.168.100.1

192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1

Như bạn có thể thấy, tất cả lưu lượng truy cập theo mặc định cho thiết bị có địa chỉ 172.20.10.1. Và nếu tôi chạy “ip addr show”, chúng ta sẽ thấy giao diện mạng trên máy tính xách tay của tôi cũng có một địa chỉ IP từ mạng này:

4: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000

    link/ether 4c:34:88:54:c1:2b brd ff:ff:ff:ff:ff:ff

    inet 172.20.10.3/28 brd 172.20.10.15 scope global dynamic wlp3s0

       valid_lft 83892sec preferred_lft 83892sec

    inet6 fe80::4e34:88ff:fe54:c12b/64 scope link

       valid_lft forever preferred_lft forever

Bạn có thể thêm đường dẫn mới bằng lệnh “ip r add” và xóa chúng bằng lệnh “ip r del”.

DNS

Bạn có thể đã nghe nói về DNS. Ý tưởng rất đơn giản: yêu cầu máy chủ không phải bằng địa chỉ IP (thật khó nhớ đối với mọi người) mà bằng tên bình thường của nó.

Máy chủ DNS lâu đời và phổ biến nhất (máy chủ lưu trữ thông tin về địa chỉ và phản hồi yêu cầu) là BIND. Có rất nhiều lựa chọn thay thế, nhưng trước hết, bạn nên hiểu điều cơ bản trước.

Tài liệu từ Cisco về DNS phải có trong danh sách cần đọc của bạn - ở đó, bạn sẽ học không chỉ các kiến ​​thức cơ bản về DNS mà còn rất nhiều khuyến nghị hữu ích về việc tạo một máy chủ DNS an toàn và bền vững.

Các bản ghi trong máy chủ DNS có thể tự động cập nhật. Bạn có thể đọc về tiện ích cập nhật động DNS (nsupdate) tại đây. Đây là một hướng dẫn tuyệt vời về cấu hình, bao gồm cập nhật bản ghi an toàn.

Trước DNS, tất cả những gì chúng ta có là một tập tin “/etc/hosts”. Ngày nay, nó vẫn thường được sử dụng.

Nếu bạn mở “/etc/hosts” trên máy tính của bất kỳ ai và thêm vào đó một dòng “52.28.20.212 facebook.com.”, họ sẽ không thể mở Facebook được nữa.

Có một tệp thú vị hơn: “/etc/nsswitch.conf”. Đây là nơi được nó được xác định theo thứ tự và nơi tìm thông tin khác nhau, bao gồm cả nơi để tìm máy chủ. Theo mặc định, chúng được tìm kiếm trong “/etc/hosts” chỉ sau khi một yêu cầu đến máy chủ DNS được gửi.

Nhân tiện, máy chủ được sử dụng để phân giải tên DNS được xác định trong “/etc/resolv.conf”.

Tốt hơn hết là gỡ lỗi các vấn đề DNS bằng cách sử dụng các lệnh “dig “và “nslookup”. Ví dụ: để yêu cầu thông tin từ máy chủ tên miền “8.8.8.8” về “mkdev.me”, tất cả những gì bạn cần làm là:

# dig mkdev.me @8.8.8.8

; <<>> DiG 9.10.3-P4-RedHat-9.10.3-12.P4.fc23 <<>> mkdev.me @8.8.8.8

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3320

;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:

; EDNS: version: 0, flags:; udp: 512

;; QUESTION SECTION:

;mkdev.me. IN A

;; ANSWER SECTION:

mkdev.me. 299 IN A 52.28.20.212

;; Query time: 355 msec

;; SERVER: 8.8.8.8#53(8.8.8.8)

;; WHEN: Fri May 27 12:51:04 CEST 2016

;; MSG SIZE rcvd: 53

Máy ảo

Trước đó, tất cả các ví dụ được được thực hiện ở trên là với một thiết bị cục bộ. Tất nhiên, nó hữu ích cho nhận thức của bạn nhưng nó không thú vị. Đó là lý do tại sao chúng ta sẽ củng cố mọi thứ chúng ta đã đọc bằng máy ảo và “libvirt”, và cũng có thể làm quen với một vài thuật ngữ mới.

Trước hết, hãy tạo một máy ảo bằng cách sử dụng virt-install:

sudo virt-install --name mkdev-networking-basics-1 \

--location ~/Downloads/CentOS-7-x86_64-Minimal-1511.iso \

--initrd-inject /path/to/ks.cfg \

--extra-args ks=file:/ks.cfg \

--memory=1024 --vcpus=1 --disk size=8

Theo mặc định, “libvirt” tạo một mạng:

[root@localhost]# virsh net-list

 Name State Autostart Persistent

----------------------------------------------------------

 default active yes yes

Khối 192.168.0.0/16 được phân bổ cho các mạng riêng. “libvirt” phân bổ một khối 192.168.122.212/24 cho mạng của mình - có nghĩa là tất cả các địa chỉ chạy từ 192.168.122.0 cho đến 192.168.122.255.

Để xem thông tin chi tiết về một mạng nhất định, bạn có thể sử dụng “virsh net-information” hoặc “virsh net-dumpxml”. Lệnh thứ hai sẽ trả về nhiều chi tiết hơn, đó là lý do tại sao chúng ta sẽ sử dụng nó:

[root@CentOS-72-64-minimal ~]# virsh net-dumpxml default

<network connections='1'>

  <name>default</name>

  <uuid>f2ee9249-6bed-451f-a248-9cd223a80702</uuid>

  <forward mode='nat'>

    <nat>

      <port start='1024' end='65535'/>

    </nat>

  </forward>

  <bridge name='virbr0' stp='on' delay='0'/>

  <mac address='52:54:00:83:b4:74'/>

  <ip address='192.168.122.1' netmask='255.255.255.0'>

    <dhcp>

      <range start='192.168.122.2' end='192.168.122.254'/>

    </dhcp>

  </ip>

</network>

“connections” cho thấy số lượng máy được kết nối với mạng này. Bạn có thể đọc một mô tả chi tiết về tất cả các tùy chọn có thể có của tệp XML này tại đây. Nhưng ngay bây giờ, chúng ta quan tâm đến hai từ: “bridge” và “dhcp”.

“bridge”, hoặc thiết bị “virbr0” hoặc bộ chuyển mạch mạng ảo, là một thiết bị đặc biệt trong đó tất cả các máy ảo trong mạng được kết nối với nó. Tất cả các yêu cầu từ máy ảo này sang máy ảo khác trong một mạng đều đi qua bộ chuyển mạch này. Libvirt tạo một bộ chuyển mạch ảo cho mỗi mạng và mọi bộ chuyển mạch được nhận dạng là một thiết bị riêng biệt trên máy chủ:

[root@localhost]# ip link show

8: virbr1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT

    link/ether 52:54:00:a8:02:f2 brd ff:ff:ff:ff:ff:ff

Theo mặc định, việc tạo một mạng trong “libvirt” tương đương với việc tạo ra một bộ chuyển mạch ảo mà tất cả các máy ảo được kết nối với, do đó tạo ra một mạng cục bộ, LAN.

Bộ chuyển mạch “virbr0” được triển khai bằng  cách sử dụng Linux Bridge - một công nghệ ban đầu được dự định để tạo các mạng cục bộ ảo. Bạn có thể thấy một danh sách tất cả các bộ chuyển mạch thực hiện lệnh “show brctl” trên máy chủ.

Linux Bridge "hơi" khác so với bộ chuyển mạch L2 phần cứng thông thường. Trong những năm nó tồn tại, có rất nhiều tính năng đã được thêm vào, như lọc lưu lượng và tường lửa. Cách thích hợp nhất để gọi nó là bộ chuyển mạch L3.

Bây giờ, hãy chú ý đến phần sau:

<ip address='192.168.122.1' netmask='255.255.255.0'>

    <dhcp>

      <range start='192.168.122.2' end='192.168.122.254'/>

    </dhcp>

  </ip>

Tại đây, một khối địa chỉ được sử dụng cho các máy ảo trong mạng này được khai báo. 192.168.122.1 là địa chỉ IP của máy chủ trong mạng ảo này.

Nếu chạy “ip r” trong máy ảo, chúng ta sẽ thấy:

[vagrant@localhost ~]$ ip r

default via 192.168.122.1 dev eth0 proto static metric 100

192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.209 metric 100

Theo mặc định, lưu lượng truy cập từ máy ảo đi ra ngoài thông qua một máy chủ. Bạn có thể đặt cấu hình cho lưu lượng truy cập đến một máy ảo thông qua một máy ảo khác.

Như chúng ta đã biết, dịch vụ DHCP chịu trách nhiệm gán địa chỉ IP. “Libvirt” sử dụng dnsmaq, một công cụ được thiết kế để phù hợp với các bộ định tuyến và tường lửa bị hạn chế tài nguyên, để cung cấp cơ sở hạ tầng mạng mạng nhỏ như DNS, DHCP và chạy một phiên bản “dnsmasq” cho mỗi mạng.

`[root@CentOS-72-64-minimal ~]# ps aux | grep dns

nobody 10600 0.0 0.0 15548 856 ? S Apr01 0:02 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper

root 10601 0.0 0.0 15520 312 ? S Apr01 0:00 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper

Bây giờ, chúng ta có thể nhìn vào bảng DHCP, bảng này sẽ hiển thị cho chúng ta các địa chỉ được gán:

[root@loclahost]# virsh net-dhcp-leases default

Expiry Time MAC address Protocol IP address Hostname Client ID or DUID

------------------------------------------------------------------------------------------------------------------- 2016-04-29 16:31:19 52:54:00:05:36:e6 ipv4 192.168.122.212/24 - -

Hãy chú ý rằng 52: 54: 00: 05: 36: e6 là địa chỉ MAC của máy ảo trong ví dụ chúng ta đang sử dụng của giao diện “eth0”.

NAT

Khi đọc về CIDR, có một điều có thể thu hút sự chú ý của bạn: Ngay cả khi chúng ta chia mạng thành nhiều khối, tổng số địa chỉ IP sẽ không tăng. Trên thực tế, một sự kết hợp của các địa chỉ riêng tư và công khai luôn được sử dụng. Thông thường, một địa chỉ công cộng ẩn rất nhiều thiết bị, mỗi thiết bị có một địa chỉ riêng tư.

Điều này cũng đúng với máy ảo của chúng ta. Mỗi máy ảo có địa chỉ IP riêng từ khối 192.168.122.0/24 và tất cả chúng đều được ẩn đằng sau địa chỉ công khai của máy chủ.

Nếu chúng ta sử dụng máy tính xách tay cá nhân ở nhà, máy chủ sẽ bị ẩn đằng sau bộ định tuyến Wi-Fi và không có địa chỉ công khai.

Thoạt nhìn, máy ảo có quyền truy cập Internet dường như là một điều hiển nhiên. Nhưng máy ảo chỉ có một địa chỉ riêng, không thể truy cập bên ngoài máy chủ. Một máy chủ ảo công cộng yêu cầu các nhu cầu chuyển tiếp phản hồi ở đâu đó, nhưng nó sẽ không thể tìm thấy địa chỉ IP riêng của máy ảo (vì nó là riêng tư).

NAT (Network Address Translation – Biên dịch địa chỉ mạng) sẽ giải quyết vấn đề này. Nó là một cơ chế phân giải địa chỉ IP trong các gói mạng. Thông thường, địa chỉ IP của người gửi và người nhận được bao gồm trong một gói. NAT cho phép thay đổi các địa chỉ này một cách linh hoạt và lưu bảng địa chỉ đã thay đổi.

Ngoài ra còn có SNAT (NAT nguồn), nó được sử dụng bởi các máy ảo để truy cập Internet. Khi một gói tin được gửi, địa chỉ nguồn của nó được thay thế bằng địa chỉ máy chủ. Khi một phản hồi từ máy chủ đích quay trở lại, địa chỉ được thay đổi từ địa chỉ máy chủ thành địa chỉ máy ảo. SNAT chính là bộ định tuyến thay đổi địa chỉ.

DNAT (NAT đích) hoạt động khá giống SNAT nhưng theo chiều ngược lại: Khi bạn yêu cầu một số địa chỉ công cộng ẩn địa chỉ riêng, địa phương.

NAT là cách giao tiếp mặc định của máy ảo với thế giới. Nhưng libvirt là một điều linh hoạt. Ví dụ: bạn có thể kết nối các máy ảo trực tiếp với giao diện vật lý của máy chủ thay vì bộ chuyển mạch ảo. Trên thực tế, có rất nhiều cách để tạo ra một mạng.

Libvirt sử dụng “iptables” cho NAT. Nói tóm lại, đây là một công cụ chịu trách nhiệm lọc các gói mạng. “iptables” được cấu hình với sự trợ giúp của các quy tắc đặc biệt, kết hợp thành chuỗi. Bằng cách thêm các quy tắc như vậy, libvirt cho phép máy ảo của chúng ta truy cập Internet bằng NAT.

Ngoài ra, tùy chọn “ipforward” phải được bật trong cài đặt lõi để gói tin chuyển hướng hoạt động trên máy chủ. Bạn có thể kích hoạt nó dễ dàng bằng: “`echo 1> / Proc / sys / net / ipv4 / ipforward`”

tcpdump

Có lẽ, công cụ cần thiết nhất cho các sự cố mạng là tcpdump. Biết được làm thế nào để sử dụng nó là một điều quan trọng. Ví dụ, hãy xem điều gì đang xảy ra trên virbr0 của chúng ta khi khởi động lại máy ảo.

Hãy mở giao diện điều khiển trên máy chủ và chạy “tcpdump -i virbr0”.

Mở một cửa sổ riêng và chạy “virsh restart # {number_of_VM}”.

Nhìn vào kết quả trong cửa sổ đầu tiên và xem yêu cầu đến từ đâu.

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on virbr0, link-type EN10MB (Ethernet), capture size 262144 bytes

12:57:31.339135 IP6 :: > ff02::16: HBH ICMP6, multicast listener report v2, 1 group record(s), length 28

12:57:31.397937 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 52:54:00:e0:06:54 (oui Unknown), length 300

12:57:31.398182 IP linux.fritz.box.bootps > 192.168.122.209.bootpc: BOOTP/DHCP, Reply, length 301

12:57:31.590332 ARP, Request who-has linux.fritz.box tell 192.168.122.209, length 28 12:57:31.590373 ARP, Reply linux.fritz.box is-at 52:54:00:7e:33:23 (oui Unknown), length 28 12:57:31.590409 IP 192.168.122.209.38438 > linux.fritz.box.domain: 61342+ A? 0.centos.pool.ntp.org. (39)

12:57:31.590458 IP 192.168.122.209.38438 > linux.fritz.box.domain: 25671+ AAAA? 0.centos.pool.ntp.org. (39)

12:57:31.590618 IP linux.fritz.box.domain > 192.168.122.209.38438: 25671 0/0/0 (39) ### And so on

Ví dụ, đây là một phát sóng đến từ VM: 12:57:31.397937 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 52:54:00:e0:06:54 (oui Unknown), length 300.

Ngoài ra, hãy nhìn vào bảng ARP:

Address HWtype HWaddress Flags Mask Iface

# ...

192.168.122.209 ether 52:54:00:e0:06:54 C virbr0

# ...

VPN

Thỉnh thoảng chúng ta cần phải làm cho cả máy khách và máy chủ giống như nằm trong một mạng riêng. Ví dụ: khi tất cả các dịch vụ của công ty nằm trong một mạng riêng, lúc này bạn chỉ có thể truy cập vào mạng khi ở văn phòng, nhưng bạn cần cấp quyền truy cập từ xa cho nhân viên của công ty hoặc khi công ty có một số văn phòng hoặc trung tâm dữ liệu cần được kết nối với lẫn nhau theo cách mà tất cả các mạng vẫn không thể truy cập được bằng Internet.

Thực tế, mạng riêng ảo (VPN) đặt một gói tcp/ip vào một gói khác và mã hóa nội dung. Kết quả là chúng ta có một mạng ảo hoạt động bên trong một mạng thực. Các thiết bị mạng ảo được tạo cho các mạng ảo. Chúng có địa chỉ IP ảo chỉ có thể truy cập trong mạng được mã hóa ảo của chúng ta.

Chúng ta sẽ không đề cập đến cấu hình VPN trong bài viết này. Nếu bạn quan tâm, bạn có thể thử bằng cách sử dụng OpenVPN hoặc strongSwan.

Vấn đề về “khả năng tự học”

Chúng ta mới chỉ đề cập đến những điều cơ bản nhất của mạng, tất nhiên, có gần một tá các công nghệ khác cần xem xét. Tự mình tìm hiểu VXLAN, TCP và UDP (và xác định cái nào nên sử dụng), IMCP - bạn sẽ gặp các thuật ngữ mới liên tục, nhưng, như mọi khi, điều quan trọng nhất là tìm hiểu các nguyên tắc cơ bản.

Chúng ta chưa tìm hiểu đến các lớp OSI cao hơn cũng xem xét các giao thức khác nhau mà các ứng dụng web hoạt động với như HTTP (S), FTP, SSH, NTP và nhiều hơn nữa.

Qua bài viết này, hy vọng rằng các độc giả có thể hiểu biết thêm một chút về các thành phần cơ bản liên quan đến giao tiếp mạng và trong tương lai, bạn sẽ có thể giải quyết các vấn đề phát sinh nhanh hơn - bởi vì bạn biết trước những gì và nơi mà mọi thứ có thể sẽ sai.

Thanh Hương