How Linux Works Chương 9 · Understanding Your Network and Its Configuration

Chương 9 · Hiểu mạng và cấu hình mạng Chapter 9 · Understanding Your Network and Its Configuration

Mạng chỉ sáng ra khi bạn xếp nó thành bốn tầng và hỏi đúng hai câu Mạng là một chồng bốn tầng, và chỉ có hai câu hỏi thôi Networking only clears up once you stack it into four layers and ask the right two questions

Ward mở chương bằng một định nghĩa nghe có vẻ tầm thường: nối mạng là việc kết nối các máy tính và gửi dữ liệu giữa chúng. Nhưng để hiểu nó vận hành ra sao, ông nói, bạn phải đặt hai câu hỏi nền tảng: máy gửi làm sao biết phải gửi dữ liệu đi đâu, và khi máy nhận nhận được, nó làm sao biết mình vừa nhận cái gì.1 Máy tính trả lời hai câu đó bằng một loạt thành phần, mỗi thành phần chịu trách nhiệm một khía cạnh, và các thành phần được gom thành những tầng mạng xếp chồng lên nhau thành một hệ thống hoàn chỉnh.1

Nối mạng chỉ là chuyện nối máy này với máy kia rồi gửi dữ liệu qua lại. Nhưng muốn hiểu, bạn chỉ cần nhớ hai câu hỏi: “gửi đi đâu?” và “vừa nhận được cái gì?”. Mỗi câu hỏi do một nhóm thợ lo, và các nhóm thợ xếp chồng lên nhau thành tầng. Nhớ nhé: mạng chỉ có hai câu hỏi — đi đâu, và là cái gì.

Ward opens the chapter with a definition that sounds trivial: networking is the practice of connecting computers and sending data between them. But to understand how it works, he says, you must ask two fundamental questions: how does the sending computer know where to send its data, and when the destination receives it, how does it know what it just received.1 A computer answers both with a series of components, each responsible for one aspect, arranged into network layers that stack on top of each other to form a complete system.1

Điểm khiến chương này khó với người mới không phải là độ phức tạp của từng tầng, mà là tính độc lập của chúng. Ward nói thẳng: vì mỗi tầng có xu hướng độc lập, người ta có thể dựng mạng bằng rất nhiều tổ hợp thành phần khác nhau — và đó chính là chỗ cấu hình mạng trở nên vô cùng rắc rối.1 Vì thế ông chọn lối đi ngược trực giác: bắt đầu từ các tầng trong một mạng rất đơn giản, học cách xem cấu hình của chính mình, rồi mới học cách tự cấu hình. Ông cũng so sánh: nhân Linux xử lý mạng theo cách tương tự phân hệ SCSI ở Chương 3.1

Luận đề của chương: mọi cấu hình mạng trên Linux — từ một địa chỉ IP đến một luật tường lửa — đều là việc đặt đúng một mảnh vào đúng một tầng trong ngăn xếp bốn tầng: application, transport, internet, physical; biết mảnh nào thuộc tầng nào là biết phải gõ lệnh nào và sửa tệp nào.1

Ý chính: mạng có bốn tầng. Mỗi thứ bạn cấu hình đều thuộc về đúng một tầng. Biết nó ở tầng nào là biết phải sửa ở đâu. Nhớ nhé: bốn tầng — chương trình, vận chuyển, internet, dây/sóng.

The chapter's thesis: every piece of network configuration on Linux — from one IP address to one firewall rule — is the act of placing a piece into exactly one layer of a four-layer stack: application, transport, internet, physical; knowing which layer a piece belongs to tells you which command to type and which file to edit.1

Cụm khái niệm 01 Concept cluster 01

Gói tin, mạng cục bộ, và ngăn xếp bốn tầng Dữ liệu được cắt nhỏ rồi đi qua bốn tầng Packets, the local network, and the four-layer stack

Trước khi bàn lý thuyết, Ward đặt ra một mạng rất quen: vài máy nối với nhau thành một LAN, cộng một router nối LAN đó ra internet. Mỗi máy nối vào mạng gọi là một host; router là một host có thể chuyển dữ liệu từ mạng này sang mạng khác. Đường nối router ra internet gọi là uplink hay kết nối WAN.1 Ông nói thẳng là không có định nghĩa chặt chẽ cho LAN: các máy trên một LAN thường gần nhau về vật lý và chia sẻ phần lớn cấu hình cùng quyền truy cập.1

Hãy tưởng tượng mấy cái máy ở nhà bạn nối chung một mạng, rồi có một cái hộp — cái router — nối cả nhà ra internet. Mỗi máy gọi là một “host”. Router là cái máy đặc biệt biết chuyển đồ từ mạng này sang mạng kia. Nhớ nhé: router là cái cửa ra của cả nhà.

Before the theory, Ward sets up a very familiar network: a few machines connected into a LAN, plus a router connecting that LAN to the internet. Each machine attached to the network is a host; a router is a host that can move data from one network to another. The router's link to the internet is called the uplink, or the WAN connection.1 He is explicit that there is no strict definition of a LAN: machines on one are usually physically close and share much of the same configuration and access rights.1

Định nghĩa. Máy tính truyền dữ liệu qua mạng thành những khối nhỏ gọi là gói tin (packet), gồm hai phần: header chứa thông tin nhận dạng như máy nguồn, máy đích và giao thức cơ bản; và payload là dữ liệu ứng dụng thật sự mà máy muốn gửi — chẳng hạn dữ liệu HTML hay hình ảnh.1

Nói đơn giản. Dữ liệu không đi nguyên khối, nó bị cắt thành từng gói nhỏ. Mỗi gói như một cái phong bì: ngoài bì ghi ai gửi ai nhận, bên trong là nội dung. Nhớ nhé: gói tin = phong bì + thư.

Definition. A computer transmits data over a network in small chunks called packets, consisting of two parts: a header carrying identifying information such as the source and destination hosts and the basic protocol; and a payload, the actual application data the computer wants to send — HTML or image data, for example.1

packet = header + payload

stack (trên → dưới) =
  application
  transport
  internet
  physical

gói = ngoài bì + ruột thư

bốn tầng, từ trên xuống:
  chương trình
  vận chuyển
  internet
  dây / sóng

packet = header + payload

stack (top → bottom) =
  application
  transport
  internet
  physical

  1. packet

    Packet — vì sao phải cắt nhỏ dữ liệu Gói tin — vì sao không gửi nguyên khối Packet — why data gets chopped up

    Một host có thể gửi, nhận và xử lý gói tin theo bất kỳ thứ tự nào, bất kể chúng từ đâu tới hay đi đâu — chính điều đó cho phép nhiều host giao tiếp “đồng thời”. Ward lấy ví dụ: nếu một host cần truyền dữ liệu tới hai host khác cùng lúc, nó có thể luân phiên giữa hai đích trong các gói đi ra.1 Cắt nhỏ thông điệp còn khiến việc phát hiện và bù lỗi truyền dễ hơn.1

    Vì thư bị cắt thành nhiều phong bì nhỏ, máy có thể gửi xen kẽ cho hai người cùng lúc — gửi một phong bì cho người này, rồi một phong bì cho người kia. Và nếu một phong bì hỏng, chỉ cần gửi lại đúng cái đó thôi. Nhớ nhé: cắt nhỏ để vừa chia lượt vừa dễ sửa sai.

    A host can send, receive and process packets in any order, regardless of where they came from or where they're going — which is what makes it possible for several hosts to communicate "simultaneously." Ward's example: a host needing to transmit to two others at once can alternate between destinations in its outgoing packets.1 Breaking messages into smaller units also makes it easier to detect and compensate for transmission errors.1

    Bạn gặp nó ở đâuWhere you meet it Phần lớn thời gian bạn không phải lo chuyện dịch qua lại giữa gói tin và dữ liệu ứng dụng — hệ điều hành làm hộ bạn.1 Bạn không phải tự cắt hay tự ráp gì cả — máy làm hộ rồi. For the most part you don't have to worry about translating between packets and the data your application uses — the operating system does it for you.1

    Vì sao phải biết đến nó

    Ward không đòi bạn thao tác trực tiếp với gói tin; ông chỉ nói rằng biết vai trò của gói tin trong các tầng mạng sắp tới là hữu ích.1 Cái “hữu ích” đó lộ ra ở phần tường lửa: iptables lọc chính xác ở mức gói tin, chứ không ở mức tầng ứng dụng.1

    Một gói đi qua tầng mấy lần

    Dữ liệu của bạn phải đi qua các tầng ít nhất hai lần trước khi tới được một chương trình ở đích: rời tầng ứng dụng trên Host A, xuống qua transport và internet, xuống môi trường vật lý, băng qua, rồi lại đi ngược lên các tầng ở Host B.1

  2. network stack

    Network stack — bốn tầng, và ranh giới nhân/người dùng Ngăn xếp mạng — bốn tầng chồng lên nhau Network stack — four layers, and the kernel/user boundary

    Ngăn xếp internet điển hình, từ trên xuống, gồm: tầng ứng dụng (HTTP, TLS, FTP — xử lý ở không gian người dùng); tầng vận chuyển (TCP, UDP — đôi khi gọi là tầng giao thức); tầng mạng hay tầng internet (IP); và tầng vật lý (Ethernet, modem — còn gọi là tầng liên kết hoặc tầng host-to-network).1 Ward chỉ rõ ranh giới quan trọng nhất với người quản trị: trên Linux, tầng vận chuyển và mọi tầng bên dưới chủ yếu do nhân xử lý, tuy có vài ngoại lệ khi gói được đẩy lên không gian người dùng.1

    Bốn tầng, từ trên xuống: chương trình nói chuyện với nhau; tầng vận chuyển chia và ráp; tầng internet ghi địa chỉ; tầng dưới cùng là dây với sóng. Ba tầng dưới hầu hết do nhân lo, tầng trên cùng là việc của chương trình. Nhớ nhé: tầng trên là chương trình, ba tầng dưới là nhân.

    The typical internet stack, from top to bottom: the application layer (HTTP, TLS, FTP — processed in user space); the transport layer (TCP, UDP — sometimes called the protocol layer); the network or internet layer (IP); and the physical layer (Ethernet, modems — also called the link or host-to-network layer).1 Ward marks the boundary that matters most to an administrator: on Linux, the transport layer and everything below it are primarily handled by the kernel, with some exceptions where packets are sent into user space.1

    Bạn gặp nó ở đâuWhere you meet it Vì các tầng mạng được thiết kế độc lập phần cứng, bạn có thể cấu hình đồng thời nhiều tầng mạng độc lập — IPv4, IPv6, IPX, AppleTalk — trên cùng một host.1 Một máy có thể nói nhiều “thứ tiếng mạng” cùng lúc. Because network layers are meant to be hardware independent, you can configure several independent network layers — IP (IPv4), IPv6, IPX, AppleTalk — on a single host at once.1

    Bốn tầng, không phải bảy

    Ward có nhắc tới mô hình tham chiếu bảy tầng OSI (Open Systems Interconnection), nhưng ông cố ý không dùng nó: quyển sách làm việc trực tiếp với bốn tầng vừa mô tả. Ông giới thiệu Computer Networks (Tanenbaum & Wetherall, ấn bản 5, Prentice Hall, 2010) cho ai muốn đi sâu.12

    Các tầng “rỉ” vào nhau

    Ward cảnh báo rằng đôi khi các tầng lẫn vào nhau một cách kỳ quặc vì xử lý tuần tự đủ cả bốn tầng có thể kém hiệu quả: thiết bị vốn chỉ lo tầng vật lý nay đôi khi đọc luôn dữ liệu tầng transport và internet để lọc và định tuyến nhanh.1 Chính thuật ngữ cũng gây nhầm: TLS viết tắt của Transport Layer Security, nhưng thực tế nó nằm cao hơn một tầng, ở tầng ứng dụng.1

  3. host / router / LAN

    Host, router, LAN — ba danh từ chi phối cả chương Máy, router, mạng nhà — ba từ cần nhớ Host, router, LAN — the three nouns that run the chapter

    Ward định nghĩa gọn: host là bất kỳ máy nào nối vào mạng; router là một host có thể chuyển dữ liệu từ mạng này sang mạng khác — và ông cho biết một tên gọi khác của router là gateway;1 LAN là nhóm các host gần nhau, thường trùng với một subnet.1 Vì router nối cả vào LAN lẫn internet, mọi máy trên LAN đều ra được internet thông qua nó — và một trong các mục tiêu của chương là cho thấy router cung cấp lối ra đó bằng cách nào.1

    Host là bất kỳ máy nào cắm vào mạng. Router là cái máy đứng giữa hai mạng, chuyển đồ qua lại. LAN là “mạng nhà mình”. Vì router đứng một chân ở nhà, một chân ngoài đường, nên cả nhà đi ra ngoài được. Nhớ nhé: host là máy, router là cửa, LAN là nhà.

    Ward's definitions are compact: a host is any machine connected to the network; a router is a host that can move data from one network to another — and he notes that another term for router is gateway;1 a LAN is a group of nearby hosts, normally a single subnet.1 Because the router connects to both the LAN and the internet, every machine on the LAN reaches the internet through it — and one of the chapter's goals is to show exactly how it provides that access.1

    Bạn gặp nó ở đâuWhere you meet it Ward nói loại mạng này “có mặt khắp nơi”: hầu hết mạng gia đình và văn phòng nhỏ đều được cấu hình đúng như vậy.1 Mạng nhà bạn gần như chắc chắn đúng kiểu này. Ward calls this kind of network ubiquitous: most home and small office networks are configured exactly this way.1

    Một host có thể nằm trên nhiều subnet

    Một host có thể gắn vào nhiều subnet cùng lúc; khi nó có khả năng truyền dữ liệu giữa các subnet đó thì nó là router.1 Router trong ví dụ của sách có hai địa chỉ: một trên subnet cục bộ 10.23.2.1, một trên đường uplink.1

    Góc nhìn của chương

    Ward định rõ điểm đứng: bạn nhìn mạng từ một máy Linux như Host A trên LAN.1 Mọi lệnh trong chương đều là lệnh gõ từ chỗ đó, cho tới khi ông đổi vai và bảo bạn biến máy Linux thành chính cái router.1

Cụm khái niệm 02 Concept cluster 02

Tầng internet: địa chỉ, subnet, bảng định tuyến và IPv6 Địa chỉ nhà, khu phố, và tấm bản đồ đi đường The internet layer: addresses, subnets, the routing table and IPv6

Điều Ward coi là quan trọng bậc nhất ở tầng internet: nó được thiết kế để là một mạng phần mềm, không đặt yêu cầu cụ thể nào lên phần cứng hay hệ điều hành — ý tưởng là bạn gửi và nhận gói tin internet trên bất kỳ loại phần cứng nào, bằng bất kỳ hệ điều hành nào.1 Cấu trúc của internet là phi tập trung: nó được tạo thành từ các mạng nhỏ hơn gọi là subnet, và mọi subnet đều được liên kết với nhau bằng cách nào đó.1

Internet không nằm trong một cái máy nào cả — nó là một bộ luật, và luật đó chạy được trên mọi loại máy. Internet được ghép từ rất nhiều mạng nhỏ, mỗi mạng nhỏ gọi là một subnet, giống như thành phố ghép từ nhiều khu phố. Nhớ nhé: internet là một đống khu phố nối với nhau.

What Ward considers most important about the internet layer: it is meant to be a software network that places no particular requirements on hardware or operating systems — the idea being that you can send and receive internet packets over any kind of hardware, using any operating system.1 The internet's topology is decentralised: it is made up of smaller networks called subnets, all interconnected in some way.1

Định nghĩa. Mỗi host trên internet có ít nhất một địa chỉ IP bằng số. Với IPv4 nó có dạng a.b.c.d, ví dụ 10.23.2.37 — ký pháp này gọi là dotted-quad sequence. Nếu một host nối vào nhiều subnet, nó có ít nhất một địa chỉ IP cho mỗi subnet. Về nguyên tắc, địa chỉ IP của mỗi host phải là duy nhất trên toàn internet — nhưng mạng riêng và NAT làm chuyện đó rối hơn một chút.1

Nói đơn giản. Địa chỉ IP giống địa chỉ nhà: bốn con số cách nhau bằng dấu chấm, ví dụ 10.23.2.37. Muốn gửi thư cho ai, bạn phải biết địa chỉ nhà họ. Nhớ nhé: IP là địa chỉ nhà của máy.

Definition. Each internet host has at least one numeric IP address. For IPv4 it takes the form a.b.c.d, such as 10.23.2.37 — notation known as a dotted-quad sequence. A host connected to multiple subnets has at least one IP address per subnet. Each host's IP address should be unique across the entire internet — though private networks and NAT make that a little confusing.1

$ ip address show
  inet 10.23.2.4/24 …

$ ip route show
  default via 10.23.2.1 dev enp0s31f6
  10.23.2.0/24 dev enp0s31f6 …

xem địa chỉ:
  ip address show

xem đường đi:
  ip route show

$ ip address show
  inet 10.23.2.4/24 …

$ ip route show
  default via 10.23.2.1 dev enp0s31f6
  10.23.2.0/24 dev enp0s31f6 …

  1. subnet & CIDR

    Subnet và ký pháp CIDR — /24 đến từ đâu Subnet — khu phố, và con số sau dấu gạch chéo Subnets and CIDR notation — where /24 comes from

    Một subnet được định nghĩa bằng hai mảnh: một network prefix (còn gọi routing prefix) và một subnet mask (còn gọi network mask hay routing mask).1 Với dải 10.23.2.1–10.23.2.254, prefix là 10.23.2.0 và mask là 255.255.255.0; mask đánh dấu những vị trí bit chung cho cả subnet, và bạn ghi trọn subnet là 10.23.2.0/255.255.255.0.1 Ký pháp CIDR (Classless Inter-Domain Routing) rút gọn chuyện đó thành 10.23.2.0/24 — con số chính là số bit 1 dẫn đầu trong mask.13

    Subnet là “khu phố”. Muốn nói rõ khu phố nào, bạn cần biết phần đầu địa chỉ nào là chung cho cả khu. Con số sau dấu gạch chéo — ví dụ /24 — nói rằng 24 chữ số nhị phân đầu tiên là phần chung. Nhớ nhé: số sau gạch chéo = bao nhiêu phần đầu địa chỉ là “tên khu phố”.

    A subnet is defined by two pieces: a network prefix (also called a routing prefix) and a subnet mask (also network mask or routing mask).1 For the range 10.23.2.1–10.23.2.254 the prefix is 10.23.2.0 and the mask is 255.255.255.0; the mask marks the bit locations common to the subnet, and you denote the whole subnet as 10.23.2.0/255.255.255.0.1 CIDR (Classless Inter-Domain Routing) notation shortens that to 10.23.2.0/24 — the number being the count of leading 1-bits in the mask.13

    Bạn gặp nó ở đâuWhere you meet it Ward nói mask /24 là phổ biến nhất trên mạng người dùng cuối, và thường đi kèm một trong các mạng riêng.1 Mạng nhà bạn gần như chắc chắn là /24. Ward notes the /24 mask is the most common on local end-user networks, usually combined with one of the private networks.1

    Vì sao rút gọn được

    Ward dẫn chuẩn: mọi subnet mask phải là một khối bit 1 liền nhau rồi tới một khối bit 0, theo RFC 1812.14 Chính mẫu đơn giản đó khiến chỉ cần một con số là đủ mô tả mask. Bảng 9-1 của sách liệt kê: 255.0.0.0 = /8, 255.255.0.0 = /16, 255.240.0.0 = /12, 255.255.255.0 = /24, 255.255.255.192 = /26.1

    Mẹo đổi cơ số của tác giả

    Nếu bạn chưa quen đổi giữa thập phân, nhị phân và thập lục phân, Ward gợi ý dùng bc hoặc dc: trong bc, lệnh obase=2; 240 in số 240 ở dạng nhị phân.1

    Một địa chỉ IPv4 là gì, chính xác

    Theo ghi chú của sách, một địa chỉ IP gồm 4 byte (32 bit); byte a và d là số từ 1 đến 254, còn b và c từ 0 đến 255. Máy tính xử lý địa chỉ IP như byte thô — 10.23.2.37 với máy chỉ là 0x0A170225; dotted-quad tồn tại vì con người dễ đọc hơn.1

  2. routing table

    Bảng định tuyến — nhân chọn đường bằng prefix dài nhất Bảng đường đi — chọn chỉ dẫn cụ thể nhất The routing table — the kernel picks the longest prefix

    Nhân Linux phân biệt hai loại đích — đích trong subnet cục bộ và đích ở phần còn lại của internet — bằng một bảng định tuyến.1 Với ip route show, mỗi dòng là một luật: dòng 10.23.2.0/24 dev enp0s31f6 nói host tới thẳng subnet cục bộ qua giao diện đó, còn dòng default via 10.23.2.1 nói lưu lượng dùng tuyến mặc định phải gửi tới 10.23.2.1.15 Chi tiết hóc búa mà Ward tách riêng thành hộp: thứ tự trong bảng không quan trọng — nhân chọn prefix đích dài nhất khớp được.1

    Máy có một cuốn sổ ghi đường đi. Một dòng nói “nhà trong khu phố thì đi thẳng”, một dòng nói “mọi nơi khác thì đưa cho router”. Khi hai dòng cùng đúng, máy chọn dòng nào nói cụ thể hơn. Nhớ nhé: chỉ dẫn càng cụ thể càng được ưu tiên.

    The Linux kernel distinguishes the two kinds of destination — inside the local subnet and the rest of the internet — using a routing table.1 In ip route show, each line is a rule: 10.23.2.0/24 dev enp0s31f6 says the host reaches the local subnet directly through that interface, while default via 10.23.2.1 says traffic on the default route goes to 10.23.2.1.15 The tricky detail Ward pulls into its own box: the order in the table does not matter — the kernel chooses the longest matching destination prefix.1

    Bạn gặp nó ở đâuWhere you meet it Gửi tới 10.23.2.132 khớp cả hai luật; 10.23.2.0/24 có prefix dài 24 bit, còn 0.0.0.0/0 dài 0 bit — nên luật subnet thắng.1 Gửi cho hàng xóm thì đi thẳng, không vòng qua router. Sending to 10.23.2.132 matches both rules; 10.23.2.0/24 has a 24-bit prefix while 0.0.0.0/0 has none — so the subnet rule wins.1

    Default gateway

    Mục default có ý nghĩa đặc biệt vì nó khớp mọi địa chỉ trên internet; ở ký pháp CIDR nó là 0.0.0.0/0 với IPv4.1 Địa chỉ được cấu hình làm trung gian cho tuyến mặc định chính là default gateway: nơi bạn gửi thông điệp khi không còn lựa chọn nào khác.1 Bạn có thể cấu hình một host không có default gateway, nhưng khi đó nó không tới được host nào ngoài các đích có trong bảng định tuyến.1

    Vì sao router hay là “.1”

    Trên hầu hết mạng có netmask /24, router thường ở địa chỉ số 1 của subnet — ví dụ 10.23.2.1 trong 10.23.2.0/24. Ward nói rõ đây chỉ là quy ước, và có thể có ngoại lệ.1

    Công cụ cũ và tuỳ chọn -n

    Công cụ truyền thống để xem tuyến là route, chạy với route -n; tuỳ chọn -n bảo nó hiện địa chỉ IP thay vì cố tra tên. Ward nhấn mạnh nên nhớ tuỳ chọn này vì nó dùng được ở nhiều lệnh mạng khác, chẳng hạn netstat.1 Ông cũng lưu ý ip là công cụ cấu hình mạng chuẩn hiện nay, thay cho ifconfig, route và arp — những lệnh cũ hơn và kém khả năng hơn.16

  3. IPv6

    IPv6 — 128 bit, hai địa chỉ, và prefix fe80::/10 IPv6 — địa chỉ dài hơn, và mỗi máy có hai cái IPv6 — 128 bits, two addresses, and the fe80::/10 prefix

    Địa chỉ IPv4 có 32 bit, tức khoảng 4,3 tỉ địa chỉ — không đủ cho quy mô internet hiện nay, nên IETF phát triển IPv6.1 Một địa chỉ IPv6 có 128 bit, viết ở dạng thập lục phân, ví dụ 2001:0db8:0a0b:12f0:0000:0000:0000:8b6e. Có hai cách viết tắt: bỏ các số 0 dẫn đầu (0db8 → db8), và một — và chỉ một — dãy nhóm 0 liên tiếp có thể thu thành ::, cho ra 2001:db8:a0b:12f0::8b6e.17

    Địa chỉ kiểu cũ hết chỗ, nên người ta làm kiểu mới dài hơn nhiều, viết bằng chữ và số cách nhau bởi dấu hai chấm. Có mẹo viết tắt: bỏ số 0 thừa, và một chỗ toàn số 0 được thay bằng :: — nhưng chỉ được thay một chỗ thôi. Nhớ nhé: :: chỉ dùng được một lần trong một địa chỉ.

    An IPv4 address has 32 bits, yielding roughly 4.3 billion addresses — insufficient for the internet's current scale, so the IETF developed IPv6.1 An IPv6 address has 128 bits, written in hexadecimal, e.g. 2001:0db8:0a0b:12f0:0000:0000:0000:8b6e. Two abbreviations apply: drop leading zeros (0db8 → db8), and one — and only one — set of contiguous zero groups may become ::, giving 2001:db8:a0b:12f0::8b6e.17

    Bạn gặp nó ở đâuWhere you meet it Chạy ip -6 address show: bạn sẽ thấy một địa chỉ scope global và một địa chỉ scope link — đúng hai loại mà Ward nói mỗi host IPv6 thường có.1 Gõ ip -6 address show là thấy ngay hai địa chỉ. Run ip -6 address show: you'll see one address with scope global and one with scope link — exactly the two kinds Ward says an IPv6 host normally has.1

    Subnet và interface ID

    Subnet IPv6 vẫn ghi bằng CIDR; với người dùng cuối chúng thường chiếm một nửa không gian bit (/64), dù có trường hợp dùng ít hơn. Phần địa chỉ riêng cho mỗi host gọi là interface ID.1

    Hai địa chỉ: global unicast và link-local

    Địa chỉ có giá trị trên toàn internet là global unicast address; địa chỉ cho mạng cục bộ là link-local address. Link-local luôn có prefix fe80::/10, theo sau là network ID 54 bit toàn 0, rồi interface ID 64 bit — kết quả là địa chỉ link-local bạn thấy trên máy nằm trong subnet fe80::/64.17 Ghi chú của sách: global unicast có prefix 2000::/3, nên một địa chỉ global unicast luôn bắt đầu bằng 2 hoặc 3.18

    Tuyến mặc định đi qua địa chỉ link-local

    Trong ip -6 route show, tuyến mặc định (viết là ::/0 trong IPv6) thường trỏ tới router ở địa chỉ link-local chứ không phải địa chỉ global của nó. Ward giải thích lợi thế: dùng link-local làm default gateway thì không cần đổi khi không gian địa chỉ global đổi.1

    Một chỗ vênh trong bản in — 32 byte hay 16 byte

    Bản in 3rd ed. viết “An IPv6 address has 128 bits—32 bytes, arranged in eight sets of 4 bytes”.1 Con số 128 bit là đúng và là điều cần nhớ; nhưng 128 bit bằng 16 byte, xếp thành tám nhóm 2 byte (mỗi nhóm bốn chữ số thập lục phân) — đúng như RFC 4291 mô tả.7 Ở đây ta giữ khung của sách (128 bit, tám nhóm) và ghi rõ chênh lệch theo nguồn chuẩn, thay vì im lặng chọn một phía.

    Dual-stack

    Có thể cấu hình host chạy đồng thời IPv4 và IPv6 — thường gọi là mạng dual-stack, dù Ward cho rằng chữ “stack” hơi cường điệu vì thực ra chỉ một tầng của ngăn xếp bị nhân đôi.1 Hai giao thức độc lập và chạy song song; chính ứng dụng (như trình duyệt) chọn dùng IPv4 hay IPv6 để kết nối.1 Ứng dụng viết cho IPv4 không tự nhiên có IPv6, nhưng vì các tầng phía trên không đổi nên lượng mã cần thêm là rất nhỏ.1

  4. ping & host

    ICMP và DNS — hai công cụ chẩn đoán đầu tiên ping và host — gọi thử và tra tên ICMP and DNS — the first two diagnostic tools

    ICMP (Internet Control Message Protocol) là giao thức tầng vận chuyển dùng để cấu hình và chẩn đoán mạng; nó khác các giao thức transport khác ở chỗ không mang dữ liệu người dùng thật sự, nên không có tầng ứng dụng nào ở trên nó.19 DNS thì ngược lại: một giao thức tầng ứng dụng ánh xạ tên người đọc được sang địa chỉ internet.1 ping gửi gói ICMP echo request; nếu host nhận được và được cấu hình để trả lời, nó gửi lại một gói ICMP echo response.110

    ping giống như gọi với sang nhà hàng xóm “có đó không?” rồi đếm xem bao lâu thì họ trả lời. host thì giống tra danh bạ: đưa tên, nhận lại số. Nhớ nhé: ping để thử đường, host để tra tên.

    ICMP (Internet Control Message Protocol) is a transport layer protocol used to configure and diagnose internet networks; it differs from other transport protocols in that it carries no true user data, so there is no application layer above it.19 DNS is the opposite: an application layer protocol mapping human-readable names to internet addresses.1 ping sends ICMP echo request packets; if the recipient gets one and is configured to reply, it returns an ICMP echo response.110

    Bạn gặp nó ở đâuWhere you meet it Hai trường quan trọng nhất trong đầu ra ping là số thứ tự (icmp_req) và thời gian khứ hồi (time); một lỗ hổng trong dãy số thứ tự thường nghĩa là có vấn đề kết nối.1 Thiếu số thứ tự là có gói bị rơi đâu đó. The two most important fields in ping output are the sequence number (icmp_req) and the round-trip time (time); a gap in the sequence numbers usually means some kind of connectivity problem.1

    Đọc đầu ra ping cho đúng

    Dòng đầu cho biết bạn đang gửi gói 56 byte (84 byte nếu tính cả header), mặc định mỗi giây một gói; số byte trả về bằng kích thước gói gửi cộng 8.1 Gói không nên tới sai thứ tự, vì ping chỉ gửi một gói mỗi giây; nếu một phản hồi mất hơn một giây (1.000 ms) thì kết nối cực chậm.1 Trên LAN có dây, Ward nói bạn nên kỳ vọng tuyệt đối không mất gói và thời gian khứ hồi rất thấp.1

    Khi ping im lặng mà web vẫn chạy

    Vì lý do an ninh, một số host trên internet tắt phản hồi gói ICMP echo request — nên có thể bạn mở được website trên một host mà không nhận được phản hồi ping.1 Nếu hoàn toàn không có đường tới đích, router cuối cùng nhìn thấy gói sẽ trả về một gói ICMP “host unreachable”.1

    Tuỳ chọn -4/-6 không giống nhau ở hai lệnh

    Với ping, -4 và -6 ép dùng IPv4 hay IPv6.1 Với host thì khác: chúng ép host lấy thông tin qua IPv4 hoặc IPv6, nhưng vì thông tin đó vốn như nhau bất kể giao thức, đầu ra vẫn có thể gồm cả địa chỉ IPv4 lẫn IPv6.1

    Tra ngược không đáng tin

    Bạn có thể đưa địa chỉ IP cho host để tìm tên máy, nhưng Ward dặn đừng kỳ vọng nó chạy ổn định: một địa chỉ IP có thể gắn với nhiều tên máy và DNS không biết chọn tên nào; ngoài ra quản trị viên phải tự tay thiết lập tra ngược, mà họ thường không làm.1

Cụm khái niệm 03 Concept cluster 03

Giao diện mạng của nhân, cấu hình tay, và người quản lý cấu hình Card mạng, cấu hình bằng tay, và ai làm hộ bạn Kernel network interfaces, manual setup, and the configuration managers

Nhân Linux tự duy trì ranh giới giữa tầng vật lý và tầng internet, và cung cấp một chuẩn giao tiếp nối hai tầng đó lại, gọi là giao diện mạng (của nhân). Khi bạn cấu hình một giao diện mạng, bạn đang nối thiết lập địa chỉ IP ở phía internet với định danh phần cứng ở phía thiết bị vật lý.1

Nhân giữ hai thế giới tách nhau: một bên là địa chỉ, một bên là dây. Giao diện mạng là cái móc nối hai bên. Cấu hình giao diện nghĩa là bảo: “địa chỉ này thuộc về cái card này”. Nhớ nhé: giao diện mạng là cái móc giữa địa chỉ và card.

The Linux kernel maintains its own division between the physical and internet layers and provides a communication standard linking them, called a (kernel) network interface. Configuring a network interface means linking the IP address settings on the internet side with the hardware identification on the physical device side.1

Định nghĩa. Giao diện mạng thường mang tên gợi ý loại phần cứng bên dưới, như enp0s31f6 (một giao diện ở khe PCI). Tên kiểu đó gọi là predictable network interface device name, vì nó giữ nguyên sau khi khởi động lại. Lúc khởi động, các giao diện mang tên truyền thống như eth0 (card Ethernet đầu tiên) và wlan0 (giao diện không dây), nhưng trên hầu hết máy chạy systemd chúng được đổi tên rất nhanh.1

Nói đơn giản. Mỗi card mạng có một cái tên. Tên kiểu enp0s31f6 nhìn xấu nhưng có lợi: nó không đổi sau mỗi lần bật máy. Tên cũ kiểu eth0 dễ đọc hơn nhưng dễ tráo chỗ. Nhớ nhé: tên xấu mà ổn định thì vẫn hơn tên đẹp mà đổi lung tung.

Definition. Network interfaces usually have names indicating the hardware underneath, such as enp0s31f6 (an interface in a PCI slot). Such a name is a predictable network interface device name, because it stays the same after a reboot. At boot time interfaces carry traditional names like eth0 (the first Ethernet card) and wlan0 (a wireless interface), but on most machines running systemd they are quickly renamed.1

# ip address add addr/subnet dev iface
# ip route add default via gw dev iface
# ip route del default

$ resolvectl status
$ nmcli

gán địa chỉ:
  ip address add …
thêm cửa ra:
  ip route add default via …
xem DNS:
  resolvectl status

# ip address add addr/subnet dev iface
# ip route add default via gw dev iface
# ip route del default

$ resolvectl status
$ nmcli

  1. interface configuration

    Bốn bước để nối một máy Linux vào internet Bốn việc phải làm để máy lên mạng Four steps to connect a Linux machine to the internet

    Ward liệt kê đúng bốn việc mà bạn — hoặc một phần mềm nào đó — phải làm: (1) nối phần cứng mạng và bảo đảm nhân có trình điều khiển cho nó; nếu có driver thì ip address show sẽ liệt kê thiết bị ngay cả khi nó chưa được cấu hình; (2) thiết lập thêm ở tầng vật lý nếu cần, như chọn tên mạng hay mật khẩu; (3) gán địa chỉ IP và subnet cho giao diện mạng của nhân để driver thiết bị và phân hệ internet nói chuyện được với nhau; (4) thêm các tuyến cần thiết, gồm cả default gateway.1

    Bốn việc: cắm dây và bảo đảm máy nhận ra card; nếu là Wi-Fi thì chọn mạng và nhập mật khẩu; gán địa chỉ; rồi chỉ cho máy biết cửa ra ở đâu. Nhớ nhé: nhận card → chọn mạng → gán địa chỉ → chỉ cửa ra.

    Ward lists exactly four things you — or some piece of software — must do: (1) connect the network hardware and ensure the kernel has a driver for it; if the driver is present, ip address show lists the device even when unconfigured; (2) perform any additional physical layer setup, such as choosing a network name or password; (3) assign IP address(es) and subnets to the kernel network interface so the device drivers and internet subsystems can talk; (4) add any additional necessary routes, including the default gateway.1

    Bạn gặp nó ở đâuWhere you meet it Thời mọi máy còn là hộp lớn đứng yên nối dây với nhau, chuyện này khá đơn giản: nhân lo bước 1, bước 2 không cần, bước 3 dùng ifconfig cũ và bước 4 dùng route cũ.1 Ngày xưa máy không di chuyển nên bốn bước này dễ hơn nhiều. When all machines were big stationary boxes wired together this was relatively straightforward: the kernel did step 1, you didn't need step 2, and you did step 3 with the old ifconfig and step 4 with the old route.1

    Cú pháp tay, và lời dặn kèm theo

    Gán địa chỉ: ip address add address/subnet dev interface; thêm tuyến mặc định: ip route add default via gw-address dev interface; xoá: ip route del default.1115 Ward nói rõ ông không đi sâu vì làm tay hiếm khi cần và dễ sai; đây thường chỉ là việc bạn làm khi thử nghiệm với hệ thống của mình.1 Tham số gw-address bắt buộc phải là một địa chỉ trong subnet nối trực tiếp đã gán cho một giao diện của bạn.1

    Tuyến không-mặc-định, và cái bẫy hai chiều

    Muốn gửi lưu lượng tới 192.168.45.0/24 qua host 10.23.2.44: ip route add 192.168.45.0/24 via 10.23.2.44; xoá thì không cần nêu router: ip route del 192.168.45.0/24.1 Nhưng Ward cảnh báo ngay: bạn còn phải bảo đảm đường về từ mọi host bên 192.168.45.0/24 dẫn được ngược lại 10.23.2.0/24, nếu không thì tuyến vừa thêm về cơ bản là vô dụng.1

    Lời khuyên giữ mọi thứ đơn giản

    Ward khuyên thiết kế mạng cục bộ sao cho các host chỉ cần một tuyến mặc định; nếu cần nhiều subnet và định tuyến giữa chúng thì tốt nhất là cấu hình chính các router đóng vai default gateway làm toàn bộ việc định tuyến.1

  2. NetworkManager

    NetworkManager — vì sao script khởi động không đủ nữa NetworkManager — người trực mạng cho bạn NetworkManager — why boot scripts are no longer enough

    Cách truyền thống là để init chạy một script gọi ip lúc khởi động.1 Nhưng tính động của mạng hiện đại khiến hầu hết máy không còn địa chỉ IP tĩnh; máy lấy thông tin đó từ đâu đó trên mạng vật lý cục bộ ngay khi vừa cắm vào.1 Câu trả lời, theo Ward, là một dịch vụ hệ thống biết theo dõi mạng vật lý, tự chọn và cấu hình giao diện mạng của nhân theo một bộ luật hợp lý với người dùng — và cũng phải đáp ứng được yêu cầu của người dùng, để họ đổi mạng Wi-Fi mà không cần trở thành root.1 Tuỳ chọn được dùng rộng rãi nhất trên desktop và laptop là NetworkManager.112

    Ngày xưa máy đứng một chỗ nên viết sẵn cấu hình lúc bật máy là đủ. Nay máy đi khắp nơi, mạng đổi liên tục, nên cần một “người trực” luôn để mắt tới mạng và tự nối lại giùm bạn. Người trực đó tên là NetworkManager. Nhớ nhé: mạng nay đổi liên tục, nên cần người trực chứ không phải tờ giấy dán sẵn.

    The traditional way was to have init run a script calling ip at boot time.1 But the dynamic nature of modern networks means most machines no longer have static IP addresses; a machine gets that information from somewhere on the local physical network as soon as it attaches.1 The answer, per Ward, is a system service that monitors physical networks and chooses and automatically configures kernel network interfaces from a set of rules that makes sense to the user — and that also responds to users, who should be able to change wireless network without becoming root.1 The most widely used option on desktops and notebooks is NetworkManager.112

    Bạn gặp nó ở đâuWhere you meet it Gõ nmcli không tham số để có bản tóm tắt rất nhanh trạng thái kết nối hiện tại — giống ip nhưng chi tiết hơn, nhất là với kết nối không dây.1 Gõ nmcli là thấy ngay đang nối mạng nào. Type nmcli with no arguments for a very quick summary of your current connection status — like ip but with more detail, especially for wireless.1

    Hai mức cấu hình nó giữ trong đầu

    NetworkManager là một daemon khởi động cùng hệ thống và, như hầu hết daemon, không phụ thuộc vào một thành phần desktop đang chạy.1 Nó duy trì hai mức cấu hình: thứ nhất là tập thông tin về các thiết bị phần cứng sẵn có, thường thu từ nhân và duy trì bằng cách theo dõi udev qua D-Bus; thứ hai là danh sách cụ thể hơn các connection — thiết bị phần cứng cộng tham số cấu hình tầng vật lý và tầng mạng. Một mạng không dây chẳng hạn được biểu diễn thành một connection.1

    Nó quyết định nối mạng nào theo thứ tự nào

    Ward liệt kê đúng ba bước cho giao diện Ethernet: (1) nếu có kết nối có dây, thử nối bằng nó, nếu không thì thử các kết nối không dây; (2) quét danh sách mạng không dây sẵn có — nếu có mạng bạn từng nối, NetworkManager sẽ thử lại; (3) nếu có hơn một mạng từng nối, chọn mạng nối gần đây nhất.1 Sau khi lập được kết nối, nó duy trì cho tới khi mất kết nối, có mạng tốt hơn xuất hiện (ví dụ bạn cắm dây trong lúc đang dùng Wi-Fi), hoặc người dùng ép đổi.1

    Nó không tự làm hết — nó uỷ nhiệm

    Để kích hoạt một connection, NetworkManager thường uỷ nhiệm cho các công cụ và daemon chuyên biệt khác, chẳng hạn dhclient, để lấy cấu hình tầng internet từ mạng vật lý đang nối.1 Vì công cụ và cách bố trí cấu hình khác nhau giữa các bản phân phối, nó dùng plug-in để ghép nối thay vì áp đặt chuẩn riêng — có plug-in cho kiểu Debian/Ubuntu và kiểu Red Hat.1

    Tệp cấu hình và cách bỏ qua một giao diện

    Thư mục cấu hình thường là /etc/NetworkManager, tệp chung là NetworkManager.conf, định dạng giống tệp .desktop kiểu XDG hoặc .ini của Microsoft, gần như tệp nào cũng có mục [main] khai báo plug-in.112 Với plug-in keyfile, mọi connection hệ thống biết nằm ở /etc/NetworkManager/system-connections.1 Muốn nó bỏ qua một giao diện: với ifupdown thì đặt managed=false; với ifcfg-rh thì dòng NM_CONTROLLED=yes vắng mặt hoặc đặt thành no; hoặc khai báo trực tiếp theo địa chỉ MAC trong mục [keyfile] bằng unmanaged-devices.1 Ward lấy chính localhost làm ví dụ: hầu hết bản phân phối giữ NetworkManager tránh xa nó, vì cấu hình của nó không bao giờ đổi và các dịch vụ hệ thống cơ bản thường phụ thuộc vào nó ngay từ sớm.1

    Dispatching

    Khi trạng thái một giao diện đổi, NetworkManager chạy mọi thứ trong /etc/NetworkManager/dispatcher.d với đối số như up hay down.1 Nhiều bản phân phối có script điều khiển riêng nên không đặt script lẻ ở đó: Ubuntu chẳng hạn chỉ có một script tên 01ifupdown chạy mọi thứ trong thư mục con thích hợp của /etc/network, như /etc/network/if-up.d.1

    Netplan và systemd-networkd

    Ward giới thiệu Netplan như một cách tiếp cận khác: nó không quản lý mạng, nó chỉ là một chuẩn cấu hình thống nhất cộng một công cụ biến cấu hình đó thành tệp mà các trình quản lý sẵn có dùng — hiện hỗ trợ NetworkManager và systemd-networkd. Tệp Netplan ở định dạng YAML và nằm trong /etc/netplan.113 Còn systemd-networkd làm cấu hình mạng cơ bản, hợp với máy không cần nhiều linh hoạt như máy chủ, nhưng thiếu năng lực động của NetworkManager; thiết lập mô tả ở trang systemd.network(5) và thư mục cấu hình là /etc/systemd/network.1 Các hệ khác mà Ward kể chủ yếu nhắm hệ nhúng nhỏ: netifd của OpenWRT, dịch vụ ConnectivityManager của Android, ConnMan và Wicd.1

  3. name resolution

    Phân giải tên — năm bước, ba tệp, một thư viện Tra tên thành số — đi qua những đâu Name resolution — five steps, three files, one library

    DNS khác mọi thứ khác trong chương này vì nó ở tầng ứng dụng, hoàn toàn trong không gian người dùng — nên về mặt kỹ thuật nó hơi lạc chỗ ở đây; nhưng Ward giữ nó lại vì không có cấu hình DNS đúng thì kết nối internet của bạn gần như vô dụng.1 Quy trình gồm năm bước: ứng dụng gọi một hàm trong thư viện dùng chung; hàm đó hành xử theo bộ luật trong /etc/nsswitch.conf; khi quyết định dùng DNS, nó tra một tệp cấu hình khác để tìm máy chủ tên; gửi yêu cầu tra cứu qua mạng; nhận địa chỉ IP và trả về cho ứng dụng.114

    Khi bạn gõ tên một trang web, máy phải đổi tên đó thành số. Nó xem sổ tay trong nhà trước (/etc/hosts), không thấy thì mới hỏi tổng đài bên ngoài. Nhớ nhé: hỏi trong nhà trước, hỏi tổng đài sau.

    DNS differs from everything else in this chapter because it is at the application layer, entirely in user space — technically slightly out of place here; but Ward keeps it because without proper DNS configuration your internet connection is practically worthless.1 The process has five steps: the application calls a function in the system's shared library; that function acts according to rules in /etc/nsswitch.conf; when it decides to use DNS it consults another configuration file to find a name server; it sends the lookup request over the network; the name server replies with the IP address and the function returns it.114

    Bạn gặp nó ở đâuWhere you meet it Dòng hosts: files dns trong /etc/nsswitch.conf đặt files trước dns, bảo đảm hệ thống xem /etc/hosts trước khi hỏi bất kỳ máy chủ DNS nào.114 Dòng đó chính là câu “hỏi trong nhà trước”. The line hosts: files dns in /etc/nsswitch.conf puts files ahead of dns, ensuring the system checks /etc/hosts before asking any DNS server.114

    /etc/hosts — và lời dặn giữ nó ngắn

    Trên hầu hết hệ thống bạn ghi đè việc tra tên bằng /etc/hosts; gần như bao giờ cũng thấy mục cho localhost ở đó.1 Ward khuyên giữ tệp này ngắn nhất có thể: đừng nhét thứ gì vào để tăng tốc, làm thế sẽ có ngày hại bạn; quy tắc chung là nếu một host đã có bản ghi DNS thì nó không có chỗ trong /etc/hosts.1 Tệp này vẫn hữu ích để phân giải tên ở giai đoạn đầu khởi động, khi mạng có thể chưa sẵn sàng.1 Ghi chú lịch sử của sách: thời xa xưa từng có một tệp hosts trung tâm mà mọi người chép về máy mình để cập nhật (xem RFC 606, 608, 623, 625), nhưng khi ARPANET/internet lớn lên thì chuyện đó nhanh chóng vượt tầm kiểm soát.115

    /etc/resolv.conf và dòng search

    Tệp cấu hình truyền thống cho máy chủ DNS là /etc/resolv.conf, với các dòng nameserver và một dòng search định luật cho tên máy chưa đầy đủ: với search mydomain.example.com example.com, thư viện phân giải sẽ thử lần lượt host.mydomain.example.com rồi host.example.com.116 Ward nói ngay: ngày nay việc tra tên nói chung không còn thẳng thớm như vậy nữa.1

    Hai vấn đề của cấu hình DNS truyền thống

    Thứ nhất, máy cục bộ không lưu đệm phản hồi, nên truy cập lặp lại có thể chậm không cần thiết; giải pháp là một daemon trung gian chặn yêu cầu và lưu đệm — phổ biến nhất là systemd-resolved, ngoài ra có dnsmasq hay nscd, và bạn cũng có thể dựng BIND làm cache.117 Dấu hiệu nhận biết: thấy 127.0.0.53 hoặc 127.0.0.1 trong /etc/resolv.conf, hoặc được liệt kê làm máy chủ khi chạy nslookup -debug host; nếu đang chạy systemd-resolved thì resolv.conf thậm chí không còn là một tệp trong /etc mà là liên kết tới tệp sinh tự động trong /run.1 Thứ hai, cách cũ kém linh hoạt khi bạn muốn tra tên trên mạng nội bộ mà không phải cấu hình nhiều — đó là ý tưởng sau các hệ tên gọi zero-configuration như mDNS (Multicast DNS) và LLMNR (Link-Local Multicast Name Resolution): tiến trình phát một yêu cầu ra toàn mạng, host đích nếu có mặt sẽ trả lời bằng địa chỉ của nó.118

    Kiểm tra bằng resolvectl status

    Lệnh resolvectl status (trên hệ cũ có thể gọi là systemd-resolve) cho một danh sách thiết lập chung rồi thiết lập cho từng giao diện, gồm các mục như LLMNR setting, MulticastDNS setting, DNSSEC setting và DNS Servers.117 Muốn đổi thiết lập, Ward chỉ tới trang resolved.conf(5) và tệp /etc/systemd/resolved.conf, đồng thời giới thiệu DNS and BIND, ấn bản 5, của Cricket Liu và Paul Albitz (O'Reilly, 2006) để học DNS nói chung.1

    Localhost — vì sao netmask là /8

    Giao diện lo là giao diện mạng ảo gọi là loopback vì nó “vòng lại chính nó”: nối tới 127.0.0.1 (hay ::1 với IPv6) là nối tới chính máy bạn đang dùng. Khi dữ liệu đi ra tới giao diện lo, nhân chỉ đóng gói lại thành dữ liệu đi vào và gửi ngược qua lo.1 Điểm lạ: netmask là /8, và bất cứ địa chỉ nào bắt đầu bằng 127 đều thuộc loopback — nhờ vậy bạn chạy được nhiều máy chủ trên nhiều địa chỉ IPv4 khác nhau trong không gian loopback mà không phải cấu hình thêm giao diện.1 Chính systemd-resolved tận dụng điều đó: nó dùng 127.0.0.53 để không đụng một máy chủ tên khác đang chạy trên 127.0.0.1.1 Ward ghi rằng tới nay IPv6 chỉ định nghĩa một địa chỉ loopback, dù có đề xuất thay đổi điều đó.1

Cụm khái niệm 04 Concept cluster 04

Tầng vận chuyển: cổng, kết nối TCP, và sự đơn giản của UDP Số hộp thư, cuộc gọi điện thoại, và tấm bưu thiếp The transport layer: ports, TCP connections, and the simplicity of UDP

Giao thức tầng vận chuyển bắc cầu giữa gói tin thô của tầng internet và nhu cầu tinh tế hơn của ứng dụng.1 Hai giao thức phổ biến nhất là TCP (Transmission Control Protocol) và UDP (User Datagram Protocol); Ward tập trung vào TCP vì nó phổ biến hơn hẳn, rồi ngó nhanh sang UDP.11920

Tầng này lo chuyện: thư đến nhà rồi thì đưa cho ai. Mỗi chương trình có một con số riêng gọi là cổng, giống số hộp thư trong chung cư. Nhớ nhé: địa chỉ IP là toà nhà, cổng là số hộp thư.

Transport layer protocols bridge the gap between the raw packets of the internet layer and the refined needs of applications.1 The two most popular are TCP (Transmission Control Protocol) and UDP (User Datagram Protocol); Ward concentrates on TCP because it is by far the most common, then takes a quick look at UDP.11920

Định nghĩa. TCP phục vụ nhiều ứng dụng mạng trên cùng một máy bằng cổng mạng — chỉ là những con số dùng kèm với một địa chỉ IP. Ward nói thẳng phép ví: nếu địa chỉ IP của một host giống địa chỉ bưu chính của một toà chung cư, thì số cổng giống số hộp thư — nó là một mức chia nhỏ thêm nữa.1 Một kết nối được nhận dạng bằng cặp địa chỉ IP và số cổng ở hai đầu.1

Nói đơn giản. Cổng là một con số. Nhờ nó, thư gửi tới cùng một máy vẫn biết đường vào đúng chương trình. Nhớ nhé: cổng là số hộp thư của từng chương trình.

Definition. TCP serves multiple network applications on one machine by means of network ports — just numbers used in conjunction with an IP address. Ward states the analogy plainly: if a host's IP address is like the postal address of an apartment building, a port number is like a mailbox number — a further subdivision.1 A connection is identified by the pair of IP addresses and port numbers.1

connection = (ip_a : port_a)
            ↔ (ip_b : port_b)

$ netstat -nt  # kết nối TCP
$ netstat -ntl # cổng đang nghe

kết nối = máy A + cổng A
           ↔ máy B + cổng B

xem: netstat -nt

connection = (ip_a : port_a)
            ↔ (ip_b : port_b)

$ netstat -nt  # TCP connections
$ netstat -ntl # listening ports

  1. client vs server port

    Đọc một dòng netstat là biết ai gọi ai Nhìn số cổng là đoán được ai gọi trước One netstat line tells you who called whom

    Điều quan trọng cần biết về cổng, theo Ward: client chọn một cổng đang rảnh ở phía mình, và gần như luôn nối tới một cổng nổi tiếng ở phía server.1 Nhờ vậy, chỉ cần một chút hiểu biết về quy ước đánh số cổng là bạn đọc được chiều của kết nối: cổng nội bộ 47626 nhìn như một con số cấp phát động, còn cổng phía xa 5222 là dịch vụ nổi tiếng có trong /etc/services (dịch vụ nhắn tin Jabber/XMPP) — nên kết nối này nhiều khả năng do client nội bộ khởi xướng.1 Cổng cấp phát động gọi là ephemeral port.1

    Nếu số cổng bên mình to và lạ, còn bên kia là số quen thuộc, thì chính máy bạn gọi đi. Nếu ngược lại — bên mình là số quen thuộc — thì có ai đó gọi vào máy bạn. Nhớ nhé: số lạ là bên gọi, số quen là bên nghe.

    The important thing to know about ports, per Ward: the client picks a port on its side that isn't currently in use, and nearly always connects to a well-known port on the server side.1 With a little knowledge of port-numbering conventions you can therefore read the direction of a connection: local port 47626 looks like a dynamically assigned number, while remote port 5222 is a well-known service listed in /etc/services (the Jabber or XMPP messaging service) — so a local client probably initiated it.1 A dynamically assigned port is called an ephemeral port.1

    Bạn gặp nó ở đâuWhere you meet it Ward nói bạn sẽ thấy rất nhiều kết nối tới cổng 443 — cổng mặc định của HTTPS — trên hầu hết máy desktop.1 Cổng 443 là cổng của web có khoá — bạn sẽ thấy nó khắp nơi. Ward notes you'll see many connections to port 443 — the default for HTTPS — on most desktop machines.1

    Xem ai đang nghe

    Thêm -l để liệt kê mọi cổng TCP máy bạn đang nghe: netstat -ntl.1 Địa chỉ nội bộ 0.0.0.0:80 nghĩa là máy nghe ở cổng 80 cho kết nối từ bất kỳ máy nào; một server cũng có thể giới hạn chỉ nghe trên một giao diện, như 127.0.0.53:53 — chính là systemd-resolved.1 Muốn biết tiến trình cụ thể nào đang nghe, Ward chỉ sang lsof ở Chương 10.1 Thêm -6 để chỉ xem kết nối IPv6.1

    Cổng đặc quyền: 1–1023

    Trên Linux, chỉ tiến trình chạy dưới quyền siêu người dùng mới dùng được cổng 1 đến 1023 — còn gọi là cổng hệ thống, cổng nổi tiếng, hay cổng đặc quyền. Mọi tiến trình người dùng có thể nghe và tạo kết nối từ cổng 1024 trở lên.1

    /etc/services và sổ đăng ký của IANA

    Không có cách duy nhất để biết một cổng có nổi tiếng hay không, nhưng chỗ tốt để bắt đầu là /etc/services — tệp văn bản thuần dịch số cổng nổi tiếng thành tên, với các mục như ssh 22/tcp, smtp 25/tcp, domain 53/udp.1 Cột đầu là tên, cột hai là số cổng cộng giao thức tầng vận chuyển cụ thể (có thể khác TCP).1 Ngoài tệp đó, Ward chỉ tới sổ đăng ký trực tuyến của IANA, chịu sự điều chỉnh của văn bản chuẩn RFC 6335.12122

  2. TCP

    TCP — đòi hỏi ít ở ứng dụng, làm rất nhiều ở dưới TCP — như gọi điện thoại TCP — asks little of the application, does a lot underneath

    Ward giải thích vì sao TCP phổ biến: nó đòi hỏi tương đối ít từ phía ứng dụng. Một tiến trình ứng dụng chỉ cần biết mở (hoặc nghe), đọc, ghi và đóng một kết nối; với ứng dụng thì trông như có dòng dữ liệu đi vào và đi ra, gần như đơn giản bằng làm việc với một tệp.1 Nhưng phía sau là rất nhiều việc: hiện thực TCP phải biết cắt dòng dữ liệu đi ra thành gói, và — phần khó hơn — biết biến một loạt gói đi vào thành dòng dữ liệu đầu vào, nhất là khi gói không nhất thiết đến đúng thứ tự; nó còn phải kiểm lỗi vì gói có thể mất hoặc méo khi băng qua internet.119

    TCP giống gọi điện thoại: hai bên bắt máy, nói qua nói lại, ai nói hụt câu thì nói lại. Chương trình chỉ việc nói; chuyện sắp xếp lại lời và sửa lỗi là của TCP. Nhớ nhé: TCP lo hết chuyện lộn xộn, bạn chỉ việc nói.

    Ward explains TCP's popularity: it requires relatively little from the application side. An application process need only know how to open (or listen for), read from, write to and close a connection; to the application it seems like incoming and outgoing streams of data, nearly as simple as working with a file.1 But a lot goes on behind the scenes: a TCP implementation must know how to break an outgoing stream into packets and — the harder part — how to convert a series of incoming packets into an input stream, especially when packets don't necessarily arrive in the correct order; it must also check for errors, since packets can get lost or mangled across the internet.119

    Bạn gặp nó ở đâuWhere you meet it Hiện thực TCP của Linux chủ yếu nằm trong nhân, nên các tiện ích làm việc với tầng vận chuyển có xu hướng thao tác lên cấu trúc dữ liệu của nhân — ví dụ điển hình là hệ lọc gói iptables.1 TCP nằm trong nhân, nên sửa nó là gõ lệnh nói chuyện với nhân. Linux's TCP implementation is primarily in the kernel, so utilities working with the transport layer tend to manipulate kernel data structures — the iptables packet-filtering system being the prime example.1

    Cách một kết nối được lập

    Để lập kết nối tầng vận chuyển, một tiến trình ở host này khởi xướng kết nối từ một cổng cục bộ tới một cổng trên host thứ hai bằng một chuỗi gói đặc biệt; để nhận ra và đáp lại, host thứ hai phải có một tiến trình đang nghe ở đúng cổng đó. Tiến trình kết nối tới thường gọi là client, bên nghe gọi là server.1

    Hình 9-4 của sách, tóm gọn

    Ward minh hoạ bằng một thông điệp bị cắt thành năm gói đánh số Seq: 1…Seq: 5, đi qua internet và tới đích không nhất thiết đúng thứ tự đã truyền, rồi host đích dựng lại thông điệp từ các gói.1 Đó là toàn bộ công việc mà ứng dụng không phải làm.

    Gói SYN — chi tiết quay lại ở phần tường lửa

    Mọi kết nối TCP bắt đầu bằng một gói SYN (gói yêu cầu kết nối).1 Chi tiết nhỏ này chính là bản lề của chiến lược tường lửa ở cuối chương: nếu bạn cho mọi gói TCP không phải SYN đi qua, máy bạn vẫn kết nối ra ngoài được trong khi vẫn từ chối kết nối vào.1

  3. UDP

    UDP — có cổng, nhưng không hề có kết nối UDP — như gửi bưu thiếp UDP — it has ports, but no connections at all

    UDP là tầng vận chuyển đơn giản hơn TCP rất nhiều: nó chỉ định nghĩa cách vận chuyển cho từng thông điệp đơn lẻ, không có dòng dữ liệu. Nó không sửa gói mất hay gói sai thứ tự; và Ward nhấn mạnh một điểm dễ bị bỏ qua — tuy UDP có cổng, nó thậm chí không có kết nối. Một host chỉ việc gửi một thông điệp từ một cổng của nó tới một cổng trên server, và server gửi lại cái gì đó nếu muốn.120 Tuy vậy UDP có phát hiện lỗi cho dữ liệu bên trong gói: host biết được gói có bị méo hay không, nhưng không buộc phải làm gì với chuyện đó.1

    UDP giống gửi bưu thiếp: viết xong thả vào thùng thư, không có chuyện bắt máy hay xác nhận. Nhanh, nhưng mất thì thôi. Nhớ nhé: TCP là gọi điện, UDP là gửi bưu thiếp.

    UDP is a far simpler transport layer than TCP: it defines transport only for single messages; there is no data stream. It won't correct for lost or out-of-order packets; and Ward stresses a point easily missed — although UDP has ports, it doesn't even have connections. One host simply sends a message from one of its ports to a port on a server, and the server sends something back if it wants to.120 UDP does have error detection for data inside a packet: a host can detect if a packet gets mangled, but doesn't have to do anything about it.1

    Bạn gặp nó ở đâuWhere you meet it Ward nêu hai ví dụ: NTP (Network Time Protocol) — client gửi yêu cầu ngắn để lấy giờ hiện tại, phản hồi cũng ngắn không kém; và trò chuyện video — nếu vài mảnh hình rơi mất dọc đường, client bên nhận bù lại tốt nhất có thể.1 Đồng hồ mạng và gọi video đều dùng UDP. Ward gives two examples: NTP (Network Time Protocol) — a client sends a short simple request for the current time and gets an equally brief reply; and video chat — if some pieces get lost along the way, the receiving client compensates as best it can.1

    Vì sao người ta chọn UDP

    Ứng dụng dùng UDP thường quan tâm tới tốc độ: gửi thông điệp nhanh nhất có thể. Chúng không muốn gánh nặng của TCP vì giả định mạng giữa hai host nói chung là tin cậy, và không cần sửa lỗi của TCP vì hoặc chúng có hệ phát hiện lỗi riêng, hoặc đơn giản là không bận tâm tới lỗi.1

    Phép so sánh của tác giả

    Ward viết: nếu TCP giống một cuộc trò chuyện qua điện thoại, thì UDP giống gửi một lá thư, một bức điện tín, hay một tin nhắn tức thời — “ngoại trừ chuyện tin nhắn tức thời thì đáng tin cậy hơn”.1

Cụm khái niệm 05 Concept cluster 05

DHCP, router, NAT, tường lửa — và tầng vật lý ở dưới cùng Máy tự xin địa chỉ, làm router, và dựng hàng rào DHCP, routers, NAT, firewalls — and the physical layer underneath

Nửa sau của chương đổi vai: thay vì dùng mạng, bạn dựng mạng. Ward liệt kê năm thứ sẽ học: một host trên subnet tự lấy cấu hình mạng bằng cách nào; cách thiết lập định tuyến; router thật ra là cái gì; làm sao biết dùng địa chỉ IP nào cho subnet; và cách dựng tường lửa để lọc lưu lượng không mong muốn từ internet.1

Nửa sau của chương là chuyện tự dựng mạng: máy tự xin địa chỉ ra sao, biến máy Linux thành router thế nào, chọn dãy địa chỉ nào cho nhà mình, và chặn những thứ không muốn cho vào. Nhớ nhé: nửa đầu là dùng mạng, nửa sau là dựng mạng.

The chapter's second half changes roles: instead of using a network, you build one. Ward lists five things you'll learn: how a host on the subnet automatically gets its network configuration; how to set up routing; what a router really is; which IP addresses to use for the subnet; and how to set up firewalls to filter out unwanted traffic from the internet.1

Định nghĩa. Với IPv4, khi bạn đặt một host lấy cấu hình tự động từ mạng, bạn đang bảo nó dùng DHCP (Dynamic Host Configuration Protocol) để lấy địa chỉ IP, subnet mask, default gateway và máy chủ DNS.123 Chính xác hơn, máy không “xin cấp” địa chỉ mà xin một lease — quyền dùng địa chỉ trong một khoảng thời gian nhất định; hết hạn, client có thể xin gia hạn.1

Nói đơn giản. Máy bạn không tự đặt địa chỉ. Nó hỏi cái router: “cho tôi mượn một địa chỉ”. Router cho mượn trong một thời gian, hết hạn thì mượn tiếp. Nhớ nhé: địa chỉ là đi mượn, không phải của mình.

Definition. Under IPv4, setting a host to get its configuration automatically means telling it to use DHCP (Dynamic Host Configuration Protocol) to get an IP address, subnet mask, default gateway and DNS servers.123 More precisely, the machine isn't asking to be assigned an address but for a lease on one for a certain amount of time; when the lease is up the client can ask to renew it.1

# sysctl -w net.ipv4.ip_forward=1
# iptables -t nat -A POSTROUTING \
    -o enp0s31f6 -j MASQUERADE

# iptables -P INPUT DROP
# iptables -A INPUT -p icmp -j ACCEPT

bật chuyển tiếp gói:
  sysctl -w net.ipv4.ip_forward=1

đóng cửa mặc định:
  iptables -P INPUT DROP

# sysctl -w net.ipv4.ip_forward=1
# iptables -t nat -A POSTROUTING \
    -o enp0s31f6 -j MASQUERADE

# iptables -P INPUT DROP
# iptables -A INPUT -p icmp -j ACCEPT

  1. DHCP / SLAAC

    DHCP và cấu hình IPv6 không trạng thái Mượn địa chỉ — và cách IPv6 tự lo DHCP and stateless IPv6 configuration

    Để lấy cấu hình bằng DHCP, host phải gửi được thông điệp tới một máy chủ DHCP trên mạng nó đang nối; vì thế mỗi mạng vật lý nên có máy chủ DHCP riêng, và trên mạng đơn giản thì chính router thường đóng vai đó.1 Ward nói thẳng: rất hiếm thấy mạng nào không dùng DHCP.1 Với IPv6 thì có một lối khác phổ biến hơn nhiều so với DHCPv6: cấu hình không trạng thái (stateless configuration) — gọi vậy vì client không cần lưu dữ liệu nào như thông tin lease.124

    Máy bạn hỏi router xin địa chỉ, router cho mượn. Với kiểu địa chỉ mới (IPv6), máy có thể tự chọn địa chỉ rồi hỏi to lên “có ai đang dùng cái này không?” — không cần ai phát cả. Nhớ nhé: IPv4 đi xin, IPv6 tự chọn rồi hỏi lại cho chắc.

    To get its configuration via DHCP, a host must be able to send messages to a DHCP server on its connected network; so each physical network should have its own DHCP server, and on a simple network the router usually acts as one.1 Ward is blunt: it's very rare to see a network that doesn't use DHCP.1 For IPv6 there is an alternative far more common than DHCPv6: stateless configuration — so called because clients don't need to store any data such as lease assignments.124

    Bạn gặp nó ở đâuWhere you meet it Điều quan trọng nhất về máy chủ DHCP, theo Ward: chỉ nên có đúng một cái chạy trên cùng một subnet, để tránh đụng địa chỉ IP và cấu hình sai.1 Một mạng chỉ nên có một người phát địa chỉ thôi. The most important thing about DHCP servers, per Ward: run only one on the same subnet, to avoid clashing IP addresses and incorrect configurations.1

    Hai client DHCP trên Linux

    Dù có nhiều hệ quản lý mạng khác nhau, Ward nói chỉ có hai client DHCP thật sự làm việc lấy lease: client chuẩn truyền thống là dhclient của ISC (Internet Software Consortium), và systemd-networkd nay cũng có client DHCP tích hợp.125 Khi khởi động, dhclient lưu PID của nó ở /var/run/dhclient.pid và thông tin lease ở /var/lib/dhcp/dhclient.leases.1 Bạn có thể thử dhclient bằng tay — dhclient enp0s31f6 — nhưng phải xoá tuyến default gateway trước đã.1 Client của systemd-networkd thì ngược lại: không chạy tay từ dòng lệnh được.1

    Yêu cầu DHCP đầu tiên là một lời gọi to

    Khi gửi yêu cầu DHCP lần đầu, host thậm chí còn chưa biết địa chỉ của máy chủ DHCP, nên nó phát quảng bá yêu cầu tới mọi host — thường là mọi host trên mạng vật lý của nó.1

    Cấu hình IPv6 không trạng thái, từng bước

    Quy trình bắt đầu ở mạng link-local (fe80::/64). Vì có quá nhiều địa chỉ khả dụng, host có thể sinh một địa chỉ khó trùng; prefix mạng lại đã cố định, nên host có thể phát ra mạng để hỏi xem có host nào đang dùng địa chỉ đó không.1 Có địa chỉ link-local rồi, host xác định địa chỉ global bằng cách lắng nghe thông điệp router advertisement (RA) mà router thỉnh thoảng gửi trên mạng link-local; thông điệp RA chứa prefix mạng global, địa chỉ IP của router, và có thể cả thông tin DNS.126 Ward nêu điều kiện: cấu hình không trạng thái dựa vào một prefix mạng global dài nhiều nhất 64 bit — nói cách khác netmask phải là /64 hoặc thấp hơn.1 Router cũng gửi RA để đáp lại thông điệp router solicitation từ host; các thông điệp này thuộc giao thức ICMP cho IPv6 (ICMPv6).127

  2. routing & NAT

    Router chỉ là máy có nhiều card — cộng một biến sysctl Router = máy có hai card mạng + một công tắc A router is just a machine with more NICs — plus one sysctl

    Ward gỡ bỏ hào quang của từ “router” bằng một câu: router chỉ là máy tính có nhiều hơn một giao diện mạng vật lý, và bạn dễ dàng cấu hình một máy Linux thành router.1 Nhưng ở vài cấu hình cơ bản, nhân Linux không tự chuyển gói từ subnet này sang subnet kia; bạn phải bật IP forwarding trong nhân của router bằng sysctl -w net.ipv4.ip_forward=1.128 Ngay khi gõ xong lệnh đó, máy bắt đầu định tuyến gói giữa các subnet — với điều kiện các host trên đó biết gửi gói tới router bạn vừa tạo.1

    Router không phải loại máy đặc biệt gì. Nó chỉ là máy có hai đường mạng và được bật một công tắc cho phép chuyển đồ qua lại. Nhớ nhé: hai card mạng + một công tắc = router.

    Ward strips the mystique from the word in one line: routers are just computers with more than one physical network interface, and you can easily configure a Linux machine to be one.1 But in some basic configurations the Linux kernel does not automatically move packets between subnets; you must enable IP forwarding in the router's kernel with sysctl -w net.ipv4.ip_forward=1.128 As soon as you enter that, the machine starts routing packets between subnets — assuming the hosts on them know to send their packets to the router you just created.1

    Bạn gặp nó ở đâuWhere you meet it Kiểm tra trạng thái bằng sysctl net.ipv4.ip_forward; muốn giữ sau khi khởi động lại thì thêm vào /etc/sysctl.conf, hoặc — tuỳ bản phân phối — vào một tệp trong /etc/sysctl.d để bản cập nhật không ghi đè thay đổi của bạn.1 Muốn giữ sau khi tắt máy thì ghi vào tệp cấu hình, đừng chỉ gõ lệnh. Check the status with sysctl net.ipv4.ip_forward; to make it survive a reboot add it to /etc/sysctl.conf, or — depending on your distribution — to a file in /etc/sysctl.d so distribution updates won't overwrite your change.1

    Mạng riêng: ba dải, và một RFC

    Nếu muốn một khối địa chỉ mà mọi host trên internet nhìn thấy, bạn phải mua từ ISP — nhưng vì dải IPv4 rất hạn chế, chuyện đó đắt và chẳng hữu dụng cho mấy ngoài việc chạy một máy chủ công khai.1 Lựa chọn thay thế quy ước và rẻ là chọn một subnet riêng trong các văn bản chuẩn RFC 1918/6761: 10.0.0.0/8, 192.168.0.0/16, và 172.16.0.0/12.12930 Ward khuyên: trừ khi bạn định có hơn 254 host trên một mạng, hãy chọn subnet nhỏ như 10.23.2.0/24. Ông ghi chú rằng mạng với netmask này đôi khi gọi là class C subnet, và nói thẳng rằng thuật ngữ đó về mặt kỹ thuật đã lỗi thời tuy vẫn còn tiện.1 Cái bẫy: host trên internet thật không biết gì về subnet riêng và sẽ không gửi gói tới đó.1

    NAT — router không chỉ chuyển gói, nó biến đổi gói

    NAT (Network Address Translation) là cách phổ biến nhất để chia sẻ một địa chỉ IP với cả một mạng riêng, gần như phổ quát ở mạng gia đình và văn phòng nhỏ; biến thể mà đa số dùng trên Linux gọi là IP masquerading.1 Ý tưởng cốt lõi: router không chỉ chuyển gói từ subnet này sang subnet kia, nó biến đổi gói trong lúc chuyển.1 Năm bước Ward liệt kê: host nội bộ gửi gói yêu cầu kết nối qua router; router chặn gói đó thay vì đẩy ra internet; router xác định đích và tự mở kết nối của chính nó tới đích; khi có kết nối, router giả một thông điệp “connection established” gửi ngược về host nội bộ; từ đó router là người trung gian, và phía đích chẳng biết gì về host nội bộ — kết nối trên host từ xa trông như đến từ router.1

    Vì sao NAT phải nhìn xuống tầng vận chuyển

    Định tuyến IP thông thường chỉ biết địa chỉ IP nguồn và đích ở tầng internet. Nếu router chỉ làm việc ở tầng đó, mỗi host nội bộ chỉ lập được một kết nối tới một đích tại một thời điểm, vì phần tầng internet của gói không có thông tin để phân biệt nhiều yêu cầu từ cùng một host tới cùng một đích.1 Vì vậy NAT buộc phải mổ gói để lấy thêm thông tin nhận dạng — cụ thể là số cổng UDP và TCP ở tầng vận chuyển. UDP khá dễ vì có cổng mà không có kết nối; tầng vận chuyển TCP thì phức tạp.1

    Bật NAT cần gì trong nhân

    Để một máy Linux làm router NAT, Ward liệt kê những thứ phải bật trong cấu hình nhân: lọc gói mạng (“firewall support”), theo dõi kết nối, hỗ trợ iptables, NAT đầy đủ, và hỗ trợ target MASQUERADE — và ông nói ngay rằng hầu hết nhân của các bản phân phối đã có sẵn.1 Chuỗi lệnh mẫu của ông cho mạng nội bộ trên enp0s2 chia sẻ kết nối ngoài trên enp0s31f6 gồm: bật ip_forward, đặt chính sách FORWARD thành DROP, thêm -t nat -A POSTROUTING -o enp0s31f6 -j MASQUERADE, rồi hai luật FORWARD — một cho chiều vào với -m state --state ESTABLISHED,RELATED -j ACCEPT, một cho chiều ra với -j ACCEPT.131 Lời cảnh tỉnh của ông về NAT: dù chạy tốt trong thực tế, về bản chất nó là một thủ thuật kéo dài tuổi thọ của không gian địa chỉ IPv4; IPv6 không cần NAT.1

    Vì sao router thương mại lại chạy Linux

    Các hãng đáp ứng thị trường chia sẻ băng thông rộng bằng phần cứng router chuyên dụng — bộ xử lý hiệu quả, ít bộ nhớ flash, vài cổng mạng — và nhiều hãng chọn Linux để chạy chúng.1 Ward kể chi tiết lịch sử: Linksys bị buộc phải phát hành mã nguồn phần mềm của mình theo điều khoản giấy phép của một thành phần, và ngay sau đó các bản phân phối Linux chuyên biệt cho router như OpenWRT xuất hiện — chữ “WRT” trong các tên này đến từ số hiệu model của Linksys.132 Ông cũng nêu lý do thực dụng để cài chúng: thường ổn định hơn firmware của hãng, nhất là trên phần cứng cũ, và thường có thêm tính năng.1 Bên trong, firmware mở hay dùng BusyBox — một chương trình thực thi duy nhất cung cấp chức năng hạn chế cho nhiều lệnh Unix như shell, ls, grep, cat — để tiết kiệm đáng kể bộ nhớ.1

  3. iptables

    Tường lửa — chain, table, và một chiến lược duy nhất đúng Tường lửa — danh sách luật đọc từ trên xuống Firewalls — chains, tables, and the one strategy that works

    Trên Linux, bạn tạo luật tường lửa trong một chuỗi gọi là chain; một tập chain tạo thành một table.1 Bạn sẽ làm việc chủ yếu với một table tên filter gồm ba chain cơ bản: INPUT cho gói đi vào, OUTPUT cho gói đi ra, và FORWARD cho gói được định tuyến.131 Mỗi chain có một chính sách mặc định quy định làm gì khi không luật nào khớp: ACCEPT cho gói đi qua, DROP bảo nhân vứt gói.1 Và nhân đọc chain từ trên xuống, dùng luật đầu tiên khớp — khi một luật khớp, nhân thi hành hành động đó và không nhìn tiếp xuống dưới.1

    Tường lửa là một danh sách luật. Máy đọc từ dòng đầu xuống, gặp dòng nào khớp trước thì làm theo dòng đó rồi dừng. Nên thứ tự các dòng cực kỳ quan trọng. Nhớ nhé: luật đứng trên thắng luật đứng dưới.

    On Linux you create firewall rules in a series known as a chain; a set of chains makes up a table.1 You'll work mostly with one table named filter holding three basic chains: INPUT for incoming packets, OUTPUT for outgoing, and FORWARD for routed packets.131 Each chain has a default policy specifying what to do when no rule matches: ACCEPT lets the packet through, DROP tells the kernel to discard it.1 And the kernel reads the chain top to bottom, using the first rule that matches — when one matches, it carries out the action and looks no further.1

    Bạn gặp nó ở đâuWhere you meet it Ward cảnh báo rất cụ thể: đừng chạy các lệnh này từng dòng trên máy bạn chỉ truy cập được từ xa — lệnh DROP đầu tiên sẽ chặn đường vào của chính bạn ngay lập tức, và bạn không lấy lại được quyền truy cập nếu không can thiệp trực tiếp, chẳng hạn khởi động lại máy.1 Đừng thử mấy lệnh này trên máy ở xa — bạn sẽ tự khoá mình ở ngoài. Ward's warning is very specific: don't run these commands one by one on a machine you only have remote access to — the very first DROP instantly blocks your own access, and you won't regain it without intervening directly, for example by rebooting.1

    Tường lửa lọc theo ba tiêu chí

    Tường lửa đặt trạm kiểm soát ở những điểm truyền dữ liệu: khi nhận gói, khi gửi gói, và khi chuyển tiếp gói tới host hay gateway khác. Trạm kiểm soát vứt, từ chối hoặc chấp nhận gói, thường dựa trên: địa chỉ IP hay subnet nguồn/đích; cổng nguồn/đích (ở thông tin tầng vận chuyển); và giao diện mạng của tường lửa.131 Ward gọi việc lọc trên từng máy lẻ là IP filtering, để phân biệt với tường lửa đặt ở router.1

    Bài học thứ tự, bằng ví dụ của tác giả

    Ward dựng một tình huống rất đời: bạn chặn 192.168.34.63 bằng iptables -A INPUT -s 192.168.34.63 -j DROP, rồi chặn cả subnet gửi tới cổng SMTP bằng -s 192.168.34.0/24 -p tcp --destination-port 25 -j DROP. Nhưng khi bạn muốn tha cho 192.168.34.37 và thêm -A INPUT -s 192.168.34.37 -j ACCEPT, nó không có tác dụng — vì luật DROP cho cả subnet đứng trước và khớp trước.1 Cách sửa: xoá luật thứ ba bằng iptables -D INPUT 3 rồi chèn lên đầu chain bằng iptables -I INPUT -s 192.168.34.37 -j ACCEPT; muốn chèn vào chỗ khác thì đặt số thứ tự sau tên chain, như iptables -I INPUT 4 ….1

    Chiến lược: chỉ cho qua thứ mình tin

    Ward nói rất dứt khoát: bạn không thể có an ninh nghiêm túc nếu dùng chính sách mặc định ACCEPT rồi liên tục chèn luật chặn những nguồn bắt đầu gửi thứ xấu. Bạn phải chỉ cho qua những gói mình tin, và từ chối tất cả phần còn lại.1 Bộ luật mẫu của ông cho máy chạy SSH ở cổng 22: đặt iptables -P INPUT DROP; cho ICMP qua (-p icmp -j ACCEPT) để ping và các tiện ích khác chạy được; chấp nhận gói từ 127.0.0.1 và từ chính địa chỉ mạng của bạn; cho qua mọi gói TCP không phải SYN bằng -p tcp '!' --syn -j ACCEPT (dấu ! là phủ định) để máy vẫn kết nối ra ngoài được; chấp nhận lưu lượng từ máy chủ tên bằng -p udp --source-port 53 -s ns_addr -j ACCEPT cho mọi máy chủ DNS trong /etc/resolv.conf; và cuối cùng cho phép SSH từ mọi nơi bằng -p tcp --destination-port 22 -j ACCEPT.131 Bạn có thể chuyển bộ luật này sang router bằng cách dùng chain FORWARD thay cho INPUT; với cấu hình phức tạp hơn, ông gợi ý công cụ như Shorewall.1 Và ông khép lại bằng một nhắc nhở về giới hạn: lọc IP chỉ là một mảnh của bức tranh an ninh.1

    iptables, nftables, bpfilter

    Ward ghi rõ bối cảnh: có một hệ mới hơn tên nftables nhằm thay thế iptables, nhưng tại thời điểm ông viết, iptables vẫn là hệ được dùng rộng rãi nhất; lệnh quản trị nftables là nft, và có bộ chuyển đổi iptables-translate cho các lệnh iptables trong sách.133 Ông còn nhắc tới bpfilter với một cách tiếp cận khác, rồi đưa lời khuyên đáng nhớ nhất của cả mục: “đừng sa lầy vào chi tiết của các lệnh — cái quan trọng là hiệu quả chúng tạo ra.”1

  4. Ethernet, ARP, NDP, Wi-Fi

    Tầng vật lý — khung, địa chỉ MAC, ARP và không dây Dây và sóng — làm sao tìm đúng cái card bên kia The physical layer — frames, MAC addresses, ARP and wireless

    Họ chuẩn IEEE 802 định nghĩa nhiều loại mạng Ethernet, từ có dây tới không dây, nhưng tất cả có vài điểm chung: mọi thiết bị đều có một địa chỉ MAC (Media Access Control, còn gọi địa chỉ phần cứng) — độc lập với địa chỉ IP của host và duy nhất trong mạng Ethernet của nó, tuy không nhất thiết duy nhất trên một mạng phần mềm lớn hơn như internet; và thiết bị gửi thông điệp trong các khung (frame) chứa địa chỉ MAC nguồn và đích.1 Câu hỏi còn treo: khi dựng khung Ethernet cho một gói IP, host làm sao biết địa chỉ MAC nào ứng với địa chỉ IP đích? Với IPv4, câu trả lời là ARP (Address Resolution Protocol).134

    Mỗi card mạng có một cái tên riêng bằng số, gọi là địa chỉ MAC — giống số khắc trên máy. Khi máy muốn gửi cho hàng xóm, nó hét lên trong khu phố: “ai đang giữ địa chỉ này?”, và chủ nhân trả lời. Máy ghi lại câu trả lời vào sổ tay để lần sau khỏi hỏi. Nhớ nhé: hỏi to một lần, ghi sổ dùng nhiều lần.

    The IEEE 802 family of standards defines many kinds of Ethernet network, wired to wireless, but all share a few things: every device has a MAC address (Media Access Control, sometimes called a hardware address) — independent of the host's IP address and unique to its Ethernet network, though not necessarily to a larger software network such as the internet; and devices send messages in frames, wrappers containing the origin and destination MAC addresses.1 The open question: when constructing an Ethernet frame for an IP packet, how does the host know which MAC address matches the destination IP? In IPv4 the answer is ARP (Address Resolution Protocol).134

    Bạn gặp nó ở đâuWhere you meet it Xem bộ đệm ARP bằng ip neigh (hoặc ip -4 neigh để chỉ lấy IPv4); trường cuối cho biết trạng thái mục: REACHABLE nghĩa là vừa có liên lạc gần đây, STALE nghĩa là đã lâu và nên làm mới.135 Gõ ip neigh là thấy cuốn sổ tay hàng xóm của máy bạn. View the ARP cache with ip neigh (or ip -4 neigh for IPv4 only); the last field gives the entry's status: REACHABLE means some communication happened recently, STALE means it's been a while and the entry should be refreshed.135

    Bốn bước của một lượt ARP

    Khi máy khởi động, bộ đệm ARP rỗng. Nếu địa chỉ IP đích không có trong bộ đệm: (1) host nguồn tạo một khung Ethernet đặc biệt chứa gói ARP request hỏi địa chỉ MAC ứng với địa chỉ IP đích; (2) nó phát quảng bá khung đó ra toàn mạng vật lý của subnet đích; (3) nếu một host trên subnet biết địa chỉ MAC đúng, nó tạo gói và khung trả lời chứa địa chỉ đó gửi về nguồn — thường host trả lời chính là host đích, đơn giản trả lời bằng địa chỉ MAC của mình; (4) host nguồn thêm cặp IP–MAC vào bộ đệm ARP và tiếp tục.134 Ward lưu ý phạm vi: ARP chỉ áp dụng cho máy trên subnet cục bộ; để tới đích ngoài subnet, host gửi gói cho router và sau đó là chuyện của người khác — dĩ nhiên host vẫn cần biết địa chỉ MAC của router, và nó dùng ARP để tìm.1

    Vì sao lệnh tên là neigh chứ không phải arp

    Trong IPv6 có một cơ chế mới tên NDP (Neighbor Discovery Protocol) dùng trên mạng link-local, và lệnh ip hợp nhất ARP của IPv4 với NDP của IPv6 — vì thế tên lệnh là neigh.126 NDP gồm hai loại thông điệp: neighbor solicitation để lấy thông tin về một host link-local, gồm cả địa chỉ phần cứng; và neighbor advertisement để đáp lại solicitation. Các thông điệp RA ở mục cấu hình IPv6 cũng là một phần của NDP.126 Đừng nhầm ARP với RARP (Reverse Address Resolution Protocol), thứ biến địa chỉ MAC ngược về tên máy hay địa chỉ IP: trước khi DHCP phổ biến, vài máy trạm không đĩa dùng RARP để lấy cấu hình, nhưng RARP nay hiếm.1

    Ethernet không tự vượt khỏi một mạng

    Ward nói rõ giới hạn: Ethernet không thật sự cố vượt ra ngoài phần cứng của một mạng đơn lẻ. Nếu bạn có hai mạng Ethernet khác nhau với một host gắn vào cả hai (và hai thiết bị giao diện khác nhau), bạn không thể truyền thẳng một khung từ mạng này sang mạng kia trừ khi dựng một Ethernet bridge.1 Đó chính là chỗ các tầng mạng cao hơn bước vào: theo quy ước, mỗi mạng Ethernet thường cũng là một subnet internet; dù khung không rời được một mạng vật lý, router có thể lấy dữ liệu ra khỏi khung, đóng gói lại, và gửi tới host trên một mạng vật lý khác — đúng những gì xảy ra trên internet.1 Muốn đào sâu phần cứng và tầng vật lý sau một giao diện, ông chỉ tới lệnh ethtool để hiển thị hoặc đổi thiết lập trên card Ethernet.1

    Đọc một khối ip address show

    Mỗi giao diện mạng được đánh số; giao diện số 1 gần như luôn là loopback.1 Cờ UP cho biết giao diện đang hoạt động, và dòng link/ether là địa chỉ MAC ở tầng vật lý.1 Ward nhắc rằng tuy ip có hiện một ít thông tin phần cứng, nó được thiết kế chủ yếu để xem và cấu hình các tầng phần mềm gắn vào giao diện.1

    Không dây: năm thành phần thêm, và hai công cụ

    Về nguyên tắc, mạng Ethernet không dây (“Wi-Fi”) không khác mấy mạng có dây: cũng có địa chỉ MAC, cũng dùng khung Ethernet, nên nhân nói chuyện với giao diện không dây gần như với giao diện có dây; mọi thứ từ tầng mạng trở lên là như nhau.1 Khác biệt nằm ở năm thành phần thêm vào tầng vật lý: chi tiết truyền (như tần số vô tuyến); nhận dạng mạng qua SSID (Service Set Identifier, tức “tên mạng”); quản lý qua một hoặc nhiều access point mà mọi lưu lượng đi qua — access point thường bắc cầu mạng không dây với mạng có dây, làm cả hai trông như một mạng duy nhất; xác thực; và mã hoá.1 Công cụ xem và đổi cấu hình thiết bị ở không gian nhân là iw: iw dev wlp1s0 scan quét mạng sẵn có (giao diện phải ở trạng thái up), iw dev wlp1s0 link xem chi tiết mạng đang nối — địa chỉ MAC trong đầu ra là của chính access point bạn đang nói chuyện — và iw wlp1s0 connect network_name nối vào mạng không bảo mật.136 Với mạng bảo mật, Linux dựa vào daemon wpa_supplicant, quản lý cả xác thực lẫn mã hoá; nó xử lý được WPA2 và WPA3, đọc tệp cấu hình mặc định /etc/wpa_supplicant.conf khi khởi động.137 Ward đưa hai lời khuyên an ninh rõ ràng: đừng dùng WEP (Wired Equivalent Privacy) vì nó không an toàn và gần như không mạng nào còn hỗ trợ; và đừng dùng WPA cũ, thứ ông gọi thẳng là không an toàn.1 Điểm chốt: toàn bộ công sức chạy iw và wpa_supplicant chỉ mới đưa máy bạn vào mạng vật lý không dây — nó còn chưa thiết lập tầng mạng; và đó chính là chỗ NetworkManager gỡ bớt đau đớn, không phải bằng cách tự làm mà bằng cách biết đúng trình tự và cấu hình cần cho từng bước.1

Đính chính Corrections

Ba ngộ nhận mà người đọc lần đầu hay mắc Ba chỗ hay hiểu nhầm Three misconceptions first readers hit

Phần này thuộc mức đọc Đầy đủ: nó đối chiếu điều người đọc thường nghĩ với điều bản văn thật sự nói.

Phần này hơi khó, bạn có thể bỏ qua và quay lại sau. Nhớ nhé: hiểu chậm mà chắc vẫn hơn.

This block belongs to the Đầy đủ (full) reading level: it sets what readers usually assume against what the text actually says.

“Thứ tự luật trong bảng định tuyến quyết định đường đi” "The order of rules in the routing table decides the route"

Ngộ nhận: nhân đọc bảng định tuyến từ trên xuống như đọc chain của iptables, nên dòng đứng trước thắng.

Bản văn nói: thứ tự trong bảng định tuyến không quan trọng; nhân chọn prefix đích dài nhất khớp được — 10.23.2.0/24 dài 24 bit thắng 0.0.0.0/0 dài 0 bit.1 Nhầm lẫn xảy ra vì với tường lửa thì ngược lại: ở đó nhân đọc chain từ trên xuống và dùng luật đầu tiên khớp.1 Hai cơ chế, hai quy tắc — đừng mang quy tắc này sang chỗ kia.

Misconception: the kernel reads the routing table top to bottom the way it reads an iptables chain, so the earlier line wins.

The text says: the order in the routing table doesn't matter; the kernel chooses the longest matching destination prefix — 10.23.2.0/24 at 24 bits beats 0.0.0.0/0 at zero.1 The confusion arises because firewalls work the opposite way: there the kernel reads the chain from top to bottom, using the first rule that matches.1 Two mechanisms, two rules — don't carry one across to the other.

“TCP và UDP khác nhau ở chỗ UDP không có cổng” "TCP and UDP differ in that UDP has no ports"

Ngộ nhận: vì UDP “không kết nối”, nó cũng chẳng có số cổng, nên không thể lọc theo cổng.

Bản văn nói: Ward viết chính xác điều ngược lại: UDP có cổng, nhưng nó thậm chí không có kết nối.1 Chính vì vậy luật tường lửa cho DNS vẫn lọc được theo cổng UDP 53 — iptables -A INPUT -p udp --source-port 53 -s ns_addr -j ACCEPT.1 Và cũng vì vậy Ward nói NAT xử lý UDP dễ hơn TCP: có cổng để phân biệt mà không có trạng thái kết nối phải theo dõi.1

Misconception: because UDP is "connectionless" it has no port numbers either, so it can't be filtered by port.

The text says: Ward writes exactly the opposite: UDP does have ports, but it doesn't even have connections.1 That is why a DNS firewall rule still filters on UDP port 53 — iptables -A INPUT -p udp --source-port 53 -s ns_addr -j ACCEPT.1 It is also why Ward says NAT handles UDP more easily than TCP: ports to distinguish by, and no connection state to track.1

“NAT là một tính năng bảo mật của IPv4” "NAT is a security feature of IPv4"

Ngộ nhận: NAT là một phần thiết kế của IP, và nó tự thân bảo vệ mạng riêng.

Bản văn nói: Ward gọi thẳng NAT là “về bản chất là một thủ thuật kéo dài tuổi thọ của không gian địa chỉ IPv4”, và nói IPv6 không cần NAT nhờ không gian địa chỉ lớn hơn và tinh vi hơn.1 Việc bảo vệ mạng là việc của tường lửa, mà ông xử lý ở một mục riêng với một chiến lược riêng: chỉ cho qua thứ bạn tin, từ chối tất cả phần còn lại.1 Chính chuỗi lệnh NAT mẫu của ông cũng phải kèm iptables -P FORWARD DROP — nghĩa là chính sách chặn được đặt thêm vào, không phải do NAT tự có.1

Misconception: NAT is part of IP's design, and it protects a private network by itself.

The text says: Ward calls NAT outright "essentially a hack that extends the lifetime of the IPv4 address space," and notes IPv6 does not need it thanks to its larger and more sophisticated address space.1 Protecting a network is the firewall's job, which he treats in its own section with its own strategy: permit only what you trust, deny everything else.1 His own sample NAT sequence has to include iptables -P FORWARD DROP — meaning the blocking policy is added on top, not supplied by NAT.1

Tự kiểm tra Self-check

Bạn đã đặt được mỗi mảnh vào đúng tầng chưa? Thử trả lời xem nào Can you place every piece in the right layer yet?

Trả lời bằng lời của bạn, không tra sách. Nếu một câu khiến bạn ngập ngừng, đó chính là tầng bạn nên đọc lại.

Thử trả lời miệng thôi, không cần giở lại. Câu nào bí thì quay lại đọc phần đó nhé. Nhớ nhé: chỗ bí chính là chỗ cần học.

Answer in your own words, without looking back. Whichever question makes you hesitate points at the layer you should reread.

  1. Bốn tầng của ngăn xếp internet là gì, và tầng nào trở xuống chủ yếu do nhân xử lý?

    Gợi ý sâu hơn: TLS viết tắt là “Transport Layer Security” — vậy nó thật sự nằm ở tầng nào?

  2. Con số sau dấu gạch chéo trong 10.23.2.0/24 đếm cái gì, và vì sao chỉ một con số là đủ mô tả cả subnet mask?

    Gợi ý sâu hơn: mọi subnet mask phải có hình dạng nào, theo văn bản chuẩn nào?

  3. Khi một địa chỉ đích khớp cả luật subnet lẫn luật default, nhân chọn luật nào — và theo tiêu chí gì?

    Gợi ý sâu hơn: hãy nói vì sao tiêu chí đó khác hẳn cách nhân đọc một chain của iptables.

  4. Nhìn một dòng netstat -nt, bạn dựa vào đâu để đoán kết nối đó do máy bạn khởi xướng hay do máy khác gọi vào?

    Gợi ý sâu hơn: dải cổng nào chỉ tiến trình siêu người dùng mới dùng được?

  5. Vì sao NAT buộc phải mổ gói xuống tận tầng vận chuyển thay vì chỉ làm việc ở tầng internet?

    Gợi ý sâu hơn: nếu chỉ dùng thông tin tầng internet, mỗi host nội bộ lập được tối đa bao nhiêu kết nối tới một đích?

  6. Chiến lược tường lửa mà Ward cho là không thể tạo ra an ninh nghiêm túc là chiến lược nào, và chiến lược đúng là gì?

    Gợi ý sâu hơn: vì sao luật cho qua mọi gói TCP không-phải-SYN lại vẫn an toàn?

  7. Bộ đệm ARP được điền vào bằng cách nào, và vì sao lệnh xem nó lại tên là ip neigh chứ không phải ip arp?

    Gợi ý sâu hơn: ARP có áp dụng cho đích nằm ngoài subnet của bạn không?

  1. Mạng có mấy tầng? Kể tên từ trên xuống.

  2. Gói tin gồm hai phần nào?

  3. Địa chỉ IP giống cái gì trong đời thường, còn số cổng giống cái gì?

  4. TCP và UDP khác nhau ra sao? Dùng phép so sánh điện thoại và bưu thiếp.

  5. Router là cái gì? Nó khác máy thường ở chỗ nào?

  6. Máy bạn lấy địa chỉ IP từ đâu khi vừa cắm mạng?

  7. Tường lửa đọc danh sách luật theo thứ tự nào?

  1. What are the four layers of the internet stack, and from which layer down does the kernel primarily do the work?

  2. What does the number after the slash in 10.23.2.0/24 count, and why is one number enough to describe a whole subnet mask?

  3. When a destination matches both the subnet rule and the default rule, which does the kernel choose — and by what criterion?

  4. Looking at one line of netstat -nt, what tells you whether your machine initiated the connection or another host did?

  5. Why must NAT dissect packets down to the transport layer instead of working purely at the internet layer?

  6. Which firewall strategy does Ward say cannot produce serious security, and what is the correct one?

  7. How does the ARP cache get filled, and why is the command called ip neigh rather than ip arp?

Khép lại chương Closing the chapter

Ward khép chương bằng đúng điều ông mở ra: hiểu vị trí và vai trò của các tầng mạng là điều tối quan trọng để hiểu mạng Linux vận hành ra sao và cấu hình nó thế nào.1 Bản thân các tầng lại thường được chia nhỏ thêm — như bạn vừa thấy với các mảnh của tầng vật lý trong một mạng không dây.1 Và rồi ông đẩy bạn đi tiếp: giờ hãy quay sang dùng mạng — tầng ứng dụng.1

Nhớ được vị trí của bốn tầng là bạn đã nắm gần hết chương này. Mỗi thứ bạn sửa đều thuộc về đúng một tầng. Và chương sau nói về phần vui nhất: các chương trình thật sự dùng mạng. Nhớ nhé: hỏi “cái này ở tầng nào?” trước khi hỏi “gõ lệnh gì?”.

Ward closes the chapter on exactly what he opened it with: understanding the positions and roles of the various network layers is critical to understanding how Linux networking operates and how to configure it.1 The layers themselves are often subdivided further — as you just saw with the pieces of the physical layer in a wireless network.1 And then he pushes you on: now turn to using the network — the application layer.1