Skip to the content.

Mạng hoạt động như thế nào?

OSI model

Đầu tiên, chúng ta cần làm quen với mô hình OSI. Mô hình này chuẩn hóa giao tiếp giữa các giao thức mạng. Mô hình OSI chia giao tiếp thành 7 lớp, mỗi lớp có một bộ giao thức riêng. Bạn có thể sẽ nghe “nó sảy ra ở lớp 3” rất nhiều. Dưới đây là bảy lớp của mô hình OSI:

  1. Lớp Physical
  2. Lớp Data Link
  3. Lớp Network
  4. Lớp Transport
  5. Lớp Session
  6. Lớp Presentation
  7. Lớp Application

Lớp Physical.

Các giao thức của lớp này chịu trách nhiệm truyền thông phần cứng ở mức 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.

Lớp Data Link chịu trách nhiệm truyền gói tin giữa hai thiết bị trong một mạng. Dữ liệu được truyền trong frame; một frame chứa địa chỉ phần cứng của người nhận và người gửi. Địa chỉ này gọi là địa chỉ MAC. Vậy ai là người gửi và người nhận? Đầu tiên, tất cả các thiết bị tham gia vào mạng đều có NIC-Network Interface Card. Nó là một phần của Phần cứng (hoặc phần cứng ảo) mà chịu trách nhiệm gửi và nhận những frame. NIC có một địa chỉ MAC - một địa chỉ duy nhất được nhúng vào phần cứng hoặc được tạo ra bởi hệ thống ảo hóa. Một máy có thể có nhiều NIC. Kiểm tra Interface bằng câu 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, interface sử dụng để giao tiếp với thế giới qua mạng là eth0, với địa chỉ MAC là 52:54:00:05:36:e6. Nhưng lo là gì? lo là một thiết bị loopback, một interface ảo, mà hệ thống sử dụng để giao tiếp với chính nó. Nhờ lo, những ứng dụng nội bộ có thể giao tiếp với nhau kể cả khi không có kết nối mạng. Bạn đã biết được rằng máy tính của bạn có hàng tỷ dây cáp nối trực tiếp với các máy tính khác trên toàn thế giới. Một hệ thống mạng cần có thêm thiết bị để quản lý. Ví dụ như switch Switch là một thiết bị mà xây dựng lên hệ thống mạng, và tất cả máy của cúng ta kết nối đến nó qua một port. Công việc của switch L2 ( có những phiên bản cao hơn như switch L3, thậm chí là L7) là chuyển hướng frame từ MAC gửi đến MAC nhận. Rất nhiều thiết bị kết nối với switch trong mạng LAN.

Trong trường hợp muốn chia các server mà kết nối với một switch ở một vị trí thành các mạng khác nhau, Chúng ta sử dụng VLAN(Virtual local area network). Nó hoạt động khá đơn giản: Một tiêu đề bổ sung có thẻ Vlan được thêm vào frame và nó xác định mạng của frame mà nó thuộc về.

Một thiết bị khác là bridge. Một bridge L2 dùng để kết nối hai mạng, được hình thành từ các switch, với nhau như thế này: Cả hai switch và bridge (và cả các hub) 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 router 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 Lan 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, còn có một số loại mạng khác: Ví dụ: WAN . Bạn có thể tính Internet là mạng WAN ngoại trừ Internet xóa hoàn toàn ranh giới địa lý của mạng. Có cả switch L3, nó không chỉ chuyển hướng frame từ một thiết bị sang thiết bị khác mà còn có một số tính năng đặc biệt như định tuyến.

Lớp Network

Ở lớp thứ 3, địa chỉ IP được thay thế cho địa chỉ MAC. Xem IP của máy bằng câu 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ỉ 192.168.122.212/24 được gán cho interface eth0.

Nhưng /24 là gì? Và tại sao interface loopback có /8?. Internet không phải là một mạng lớn mà là nhiều mạng nhỏ. Ngoài ra, các khối địa chỉ IP riêng biệt được dành riêng cho các loại mạng khác nhau (ví dụ: mạng riêng, không thể truy cập từ bên ngoài).

Có rất nhiều địa chỉ IPv6. Nhưng 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à mask, giúp có thể hiểu 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. Trong mã nhị phân, địa chỉ IP đi từ 00000000000000000000000000000000đến 11111111111111111111111111111111. Để thuận tiện, chúng ta hãy chia số này thành bốn phần, mỗi phần có tám chữ số : 11111111.11111111.11111111.11111111. Trong hệ thống thập phânmà chúng ta đã quen, địa chỉ này trông như thế này : 255.255.255.255.

Mask /24có thể được biểu diễn dưới dạng 255.255.255.0, hoặc, trong ký hiệu nhị phân , 11111111.11111111.11111111.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 nạ mạng và áp dụng một bit AND cho ký hiệu nhị phân của chúng:

11000000.10101000.01111010.11010100
&
11111111.1111111.1111111.00000000
=
11000000.10101000.01111010.00000000

Hãy dịch kết quả theo cách trình bày có thể đọc được của con người: 192.168.122.0là địa chỉ bắt đầu của mạng của chúng tôi. Để đế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ạ. Trong trường hợp của chúng tôi, có tám số không, hoặc vị trí. Mỗi người trong số họ có thể sở hữu giá trị 1 hoặc 0, đó là lý do tại sao trong toàn bộ chúng tôi nhận được 2 ^ 8 độ hoặc 256 địa chỉ. Nó có nghĩa là địa chỉ cuối cùng sẽ là 192.168.122.255.

ARP

Chúng ta đã 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 (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  Flags  Mask  iface
192.168 . 178,1  ether  5 c : 49 : 79 : 99 : f3 : 23  C  wlp3s0

Trong trường hợp này, 192.168.178.1 là địa chỉ IP của Wi-Fi router của tôi, mà máy tính xách tay của tôi được kết nối qua interface wlp3s0. Một trong những loại tấn công mạng được kết nối với ARP và đượ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ế một địa chỉ MAC, được liên kết với một địa chỉ IP nhất định, bằng địa chỉ thiết bị của hacker. Cuộc sống là một điều đáng sợ, thực sự.

DHCP

Nhưng làm thế nào chính xác một giao diện mạng được gán một địa chỉ IP? Một trong các tùy chọn là: thủ công. Nhược điểm: thủ công. Nếu bạn không tốt với đôi tay 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 (DHCP), giao thức được sử dụng để đặt cấu hình khác nhau, bao gồm địa chỉ IP, 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, sẽ yêu cầu một địa chỉ. Ở nhà, 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 tôi 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. Truyền thông như vậy là gần với phát thanh.

Trong trường hợp DHCP, nó xảy ra như thế này:

  1. Máy khách DHCP gửi tin nhắn quảng bá với yêu cầu “Tôi cần địa chỉ IP”
  2. Máy chủ DHCP bắt nó và gửi lại tin nhắn quảng bá “Tôi có địa chỉ IP xxxx, 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ỉ xxxx”
  4. Máy chủ DHCP trả lời “Ok, sau đó xxxx 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ụ, đó 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, cấu hình kết nối cho thiết bị loopback:

[root@localhost network-scripts]# cat ifcfg-lo
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0

Địa chỉ tĩnh được chỉ định ở đây : IPADDR=127.0.0.1. Ở nhà, bạn có thể sử dụng công cụ nmclihoặ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 đ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 và 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 để hiểu lưu lượng sẽ lưu thông ở đâu? Mọi thứ khá đơn giản: Nó đủ để xem bảng định tuyến cục bộ bằng ip_rlệnh. 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. Đó là những gì ip_rhiển thị:

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
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

Như bạn có thể thấy, tất cả lưu lượng truy cập theo mặc định cho máy có địa chỉ 172.20.10.1. Và nếu tôi chạy ip addr show, tôi sẽ thấy giao diện mạng trên máy tính xách tay của tôi cũng có đị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 ip r addlệnh và xóa chúng bằng ip r dellệnh.

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 của nó (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 nhất 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 triển khai cục bộ.

Có thể tự động cập nhật hồ sơ trong máy chủ DNS. Bạn có thể đọc về nsupdate ở đây. Bạn sẽ tìm thấy một liên kết đến một hướng dẫn tuyệt vời về cấu hình, bao gồm cập nhật hồ sơ an toàn, bên dưới. Một trong những công dụng thú vị là khám phá dịch vụ.

Trước DNS, tất cả những gì chúng tôi có là một tập tin / etc / hosts. Nó thường được sử dụng ngay cả bây giờ.

Có một tập tin thú vị hơn : /etc/nsswitch.conf. Đây là nơi đượ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 /etc/hostsvà chỉ sau đó, một yêu cầu đến máy chủ DNS được gửi.

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

Tốt hơn là gỡ lỗi các vấn đề DNS bằng cách sử dụng các lệnh dignslookup. Ví dụ, để yêu cầu thông tin từ máy chủ tên 8.8.8.8 về mkdev.me, tất cả các 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

NAT

Khi bạn đang đọc về CIDR, có một điều có thể thu hút sự chú ý của bạn: Ngay cả khi chúng tôi 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ỉ private và public luôn được sử dụng. Thông thường, một địa chỉ public ẩn rất nhiều máy, mỗi máy có một địa chỉ riêng.

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

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

Thoạt nhìn, thực tế là máy ảo có quyền truy cập Internet dường như là điều hiển nhiên. Nhưng VM 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ủ public yêu cầu cần chuyển tiếp phản hồi ở đâu đó, nhưng nó sẽ không thể tìm thấy địa chỉ IP private của máy ảo (vì nó là riêng tư).

NAT (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 (source NAT), là máy ảo được sử dụng bởi các máy ảo của chúng tôi để truy cập Internet. Khi một gói đượ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ỉ VM. Đây là bộ định tuyến thay đổi địa chỉ.

DNAT (destination NAT) thực hiện khá giống nhau và ngược lại: Đây là khi bạn yêu cầu một số địa chỉ public ẩn địa chỉ private, local.

NAT là cách giao tiếp mặc định của VM 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 máy ảo trực tiếp với giao diện vật lý của máy chủ thay vì chuyển đổi ả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 tôi truy cập Internet bằng NAT. Chúng tôi sẽ trở lại iptables khi chúng ta nói về an toàn nói chung.

Ngoài ra, tùy chọn ipforward phải được bật trong cài đặt lõi để chuyển hướng gói hoạt động trên máy chủ. Nó rất dễ dàng để kích hoạt nó: 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, hoặc, cụ thể hơn, lưu lượng truy cập thông qua gỡ lỗi máy của chúng tôi là tcpdump. Nó là rất quan trọng để biết làm thế nào để sử dụng nó. Ví dụ, hãy xem điều gì đang xảy ra virbr0 khi khởi động lại máy ảo.

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

Mở cửa sổ riêng và chạy virsh reboot #{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

Đây là, ví dụ, một phát sóng 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

Đôi khi (để nói sự thật, rất thường xuyên), cần phải làm cho nó trông giống như cả máy khách và máy chủ 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, chỉ có thể truy cập từ 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ông ty hoặc khi một 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 trên Internet.

Bản thân VPN đang đặ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à, 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 (tun / tap) được tạo cho các mạng ảo. Họ có địa chỉ IP ảo chỉ có thể truy cập trong mạng được mã hóa ảo của chúng tôi.

Tôi sẽ rời khỏi cấu hình VPN ra khỏi bài viết này. Theo lương tâm của độc giả, hãy cố gắng tự mình làm điều đó bằng cách sử dụng OpenVPN hoặc strongSwan .

Chúng tôi sẽ trở lại chủ đề an toàn sau này, nhưng bạn đã có thể đọc về IPsec - đây là giao thức được sử dụng bởi strongSwan.