Linux 小記 — 網絡管理
前言
前段時間需要配置一臺私網 ECS 聯外網,阿裏雲比較推薦的方案是創建一個 Nat 網關並綁定 EIP, 以此來統一所有 ECS 的網絡出口。由於我已經擁有一臺外網 ECS(不想多掏錢,且我自己的測試環境不需要嚴格的穩定性要求),因此我決定使用 Iptables 對私網 ECS 的請求進行源地址轉換,這臺外網 ECS 就作為其余私網 ECS 的跳板機和網絡代理機。雖然原理和最後的解決方案都非常簡單,但查資料的過程卻廢了一番周折,於是決定將網絡管理和 Iptables 的知識點做一個簡單的梳理。
1. OSI 七層模型與 TCP/IP 四層模型
(以下部分圖片來自互聯網,不知其最初作者,因此未標記來源。)
1.1 七層模型
1.2 四層模型
1.3 對應
這幾幅圖一目了然,不需要過多文字贅述了。舉個寫郵件的例子吧:
- 應用層:寫郵件。
- 表示層:加密和翻譯為二進制。
- 會話層:判斷存儲還是發送。
- 傳輸層:選擇 TCP 協議和發送端口。
- 網絡層:確定收發的 IP 地址和 MAC 地址。
- 數據鏈路層:物理尋址,即確定每一個網關。
- 物理層:各種硬件設備。
2. 地址與端口
2.1 IP 地址與子網掩碼
此二者必須結合使用,子網掩碼的作用就是將某個IP地址劃分成網絡地址和主機地址兩部分。
IP 地址分類:
網絡類別 | 最大網絡數 | IP 地址範圍 | 最大主機數 | 私有 IP 地址範圍 |
---|---|---|---|---|
A | 2^7 -2 | 1.0.0.0-126.255.255.255 | 2^24 -2 | 10.0.0.0-10.255.255.255 |
B | 2^14 | 128.0.0.0-191.255.255.255 | 2^16 -2 | 172.16.0.0-172.31.255.255 |
C | 2^21 | 192.0.0.0-223.255.255.255 | 2^8 -2 | 192.168.0.0-192.168.255.255 |
子網掩碼及子網規劃:
地址 | 網絡位 | 網絡位 | 子網位 | 主機位 |
---|---|---|---|---|
IP地址(172.16.2.121) | 10101100 | 00010000 | 00000010 | 01111001 |
子網掩碼(255.255.255.0) | 11111111 | 11111111 | 11111111 | 00000000 |
網絡地址 | 10101100 | 00010000 | 00000010 | 00000000 |
廣播地址 | 10101100 | 00010000 | 00000010 | 11111111 |
網絡地址 = IP 地址 & 子網掩碼。
廣播地址 = 網絡地址的主機位(子網掩碼為0的部分)全換成1。
(廣播地址只是一個標識,在數據包裏面,如果目的地址是廣播地址的話,就會向整個同一網段的主機發送廣播包。)
2.2 其他地址
- 網關地址:具有路由功能的設備的IP地址,如:路由器、啟用了路由協議的服務器(相當於路由器)、代理服務器(相當於路由器)。當網絡中的主機發現數據包的目標主機不在本地網絡中,就把數據包轉發給它自己的網關,再由網關轉發給目標網絡的網關。一般設置為一個網段的起始或終止值,例:172.16.2.1 或 172.16.2.254。
- MAC地址:Media Access Control,具有全球唯一性。
- DNS地址:Domain Name Server(域名服務器),百度:114.114.114.114,谷歌:8.8.8.8。
- DHCP:指的是由服務器控制一段IP地址範圍,客戶機登錄服務器時就可以自動獲得服務器分配的IP地址和子網掩碼。提升地址的使用率。
2.3 常用端口
- FTP:20,21。
- SSH:22。
- Telnet:23。
- DNS:53。
- HTTP(s):80(443)。
- SMTP:25。
- POP3:110。
- SOCKS:1080。
- Oracle:1521。
- SQL Server:1433。
- MySQL:3306。
- MongoDB:27017。
- Redis:6379。
- Memcached:11211。
3. Iptables
3.1 Iptables 摘要
簡單的說,Iptables 是一種能夠輕易插入、修改和除去數據包過濾表中規則的工具,是netfilter項目的一部分。以下為使用方法和案例詳解(只記錄我認為的常用規則):
示意圖:
命令結構:
iptables [-t 表名] [-AI 鏈名] [-I/o 網卡名] [-p 協議名] [-s 源IP/子網] [--sport 源端口] [-d 目標IP/子網] [--dport 目標端口] [-j 控制類型]
表:
- filter:默認表,配置規則允許或不允許,用於防火墻。
- nat:地址轉換,用於網關路由器。
規則鏈:
- PREROUTING 路由前(用於目標地址轉換 DNAT)。
- INPUT:數據包流入口。
- PORWARD:轉發管卡。
- OUTPUT:數據包出口。
- POSTOUTING:路由後(用於源地址轉換 SNAT)。
控制類型:
- ACCEPT/DROP/REJECT:接收/丟棄/重定向數據包。
- SNAT/DNAT:源地/目標址轉換。
- MASQUERADE:IP偽裝(NAT),用於ADSL。
- LOG:日誌記錄。
3.2 Iptables 實例
3.2.1 查看與清除規則
iptables [-t tables] [-nv] [-L]
# 參數說明:
-t table:默認為 filter, 可指定 nat。
-L :列出當前 table 的規則。
-n :不進行 IP 與 HOSTNAME 的反查(速度更快)。
-v :列出更多的信息,包括通過該規則的封包總位數、相關的網絡接口等。
iptables [-t tables] [-FXZ]
# 參數說明:
-F :清空規則鏈。
-X :刪除用戶自定義的空鏈。
-Z :將所有鏈的計數與流量統計歸零。
3.2.2 添加規則
參數說明:
-A/I 鏈名:添加規則,-A為在原規則後追擊;-I 則為插入,若未指定行,則插入到第一行,例:iptables -I 2 INPUT -j ACCEPT。
-i/o 網卡名:匹配網卡流入/出。
-p 協議名:主要有tcp、udp、icmp 和 all。
-s/d 源/目標 IP/子網:
-s 172.16.205.1
172.16.205.0/24
172.16.205.0/255.255.255.0
IP:172.16.205.1
-s ! 172.16.205.0/24
...
以上說明再結合 3.1 小節的命令結構足以滿足大部分的應用場景了。
3.2.3 配置私網 ECS 聯外網
前言中說了一些與之相關的梗概,本小結進行實際操作。首先,在 VPC 專有網絡中添加一條路由規則,如下:
下一跳實例為外網 ECS 實例。
其次,在外網 ECS(172.16.200.1)中開啟內核路由轉發功能:
# 臨時
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p
# 永久
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
再根據 VPC 網段添加一條轉發規則,例如我的是:
iptables -t nat -A POSTROUTING -s 172.16.205.0/24 -j SNAT --to-source 172.16.200.1
之後,只要是在 172.16.205.0/24
這個網段內的所有私網服務器都能聯外網了。
4. 其他網絡管理常用命令
由於服務器都在“雲上”,所以很多 Linux 最基本的網路配置命令幾乎都用不著了,常用的就是一些測試或者查看的命令,暫時收錄如下:
- ping: 發送ICMP報文,常用:
ping -ic
,參數說明:interval、count。 - telnet: 查看端口是否聯通,格式:
telnet ip port
。 - traceroute: 路由跟蹤,格式:
traceroute hostname
。 - ifconfig: 查看網卡信息,其他的參數都不常用了。
netstat: 監控 TCP/IP 網絡,常用參數:
-a # 顯示所有socket,包括正在監聽的。
-l # 顯示有在 Listen (監聽) 的服務狀態。
-n # 以網絡IP地址代替名稱,顯示網絡連接情形。
-t # 顯示TCP協議的連接情況。
-u # 顯示UDP協議的連接情況。
常與 grep 結合使用,如 netstat -atuln | grep ‘:80‘
:
route:
route -n # 查詢路由狀態。
route add/del default gw 172.16.200.1 #添加/刪除默認網關。
結語
以上主要簡述了 TCP/IP 模型和 Iptables 的使用,若汝以之為尚可,拜請贊之 ~:)
Linux 小記 — 網絡管理