2021-05-12 14:32:11
RHCE 系列(二):如何進行包過濾、網路地址轉換和設定核心執行時引數
正如第一部分(“設定靜態網路路由”)提到的,在這篇文章(RHCE 系列第二部分),我們首先介紹紅帽企業版 Linux 7(RHEL)中包過濾和網路地址轉換(NAT)的原理,然後再介紹在某些條件發生變化或者需要變動時設定執行時核心引數以改變執行時核心行為。
RHCE 第二部分:網路包過濾
RHEL 7 中的網路包過濾
當我們討論封包過濾的時候,我們指防火牆讀取每個試圖通過它的封包的包頭所進行的處理。然後,根據系統管理員之前定義的規則,通過採取所要求的動作過濾封包。
正如你可能知道的,從 RHEL 7 開始,管理防火牆的預設服務是 firewalld。類似 iptables,它和 Linux 核心的 netfilter 模組互動以便檢查和操作網路封包。但不像 iptables,Firewalld 的更新可以立即生效,而不用中斷活躍的連線 - 你甚至不需要重新啟動服務。
Firewalld 的另一個優勢是它允許我們定義基於預設定服務名稱的規則(之後會詳細介紹)。
在第一部分,我們用了下面的場景:
靜態路由網路示意圖
然而,你應該記得,由於還沒有介紹包過濾,為了簡化例子,我們停用了2號路由器的防火牆。現在讓我們來看看如何使接收的封包傳送到目的地的特定服務或埠。
首先,讓我們新增一條永久規則允許從 enp0s3 (192.168.0.19) 到 enp0s8 (10.0.0.18) 的入站流量:
# firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0-i enp0s3 -o enp0s8 -j ACCEPT
上面的命令會把規則儲存到 /etc/firewalld/direct.xml
中:
#cat/etc/firewalld/direct.xml
檢查 Firewalld 儲存的規則
然後啟用規則使其立即生效:
# firewall-cmd --direct --add-rule ipv4 filter FORWARD 0-i enp0s3 -o enp0s8 -j ACCEPT
現在你可以從 RHEL 7 中通過 telnet 到 web 伺服器並再次執行 tcpdump 監視兩台機器之間的 TCP 流量,這次2號路由器已經啟用了防火牆。
# telnet 10.0.0.2080
#tcpdump-qnnvvv -i enp0s3 host 10.0.0.20
如果你想只允許從 192.168.0.18 到 web 伺服器(80 號埠)的連線而阻塞 192.168.0.0/24 網路中的其它來源呢?
在 web 伺服器的防火牆中新增以下規則:
# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.18/24" service name="http" accept'
# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.18/24" service name="http" accept'--permanent
# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" drop'
# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" drop'--permanent
現在你可以從 192.168.0.18 和 192.168.0.0/24 中的其它機器傳送到 web 伺服器的 HTTP 請求。第一種情況連線會成功完成,但第二種情況最終會超時。
任何下面的命令可以驗證這個結果:
# telnet 10.0.0.2080
#wget10.0.0.20
我強烈建議你看看 Fedora Project Wiki 中的 Firewalld Rich Language 文件更詳細地瞭解關於富規則的內容。
RHEL 7 中的網路地址轉換(NAT)
網路地址轉換(NAT)是為專用網路中的一組計算機(也可能是其中的一台)分配一個獨立的公共 IP 地址的過程。這樣,在內部網路中仍然可以用它們自己的私有 IP 地址來區別,但外部“看來”它們是一樣的。
另外,網路地址轉換使得內部網路中的計算機傳送請求到外部資源(例如因特網),然後只有源系統能接收到對應的響應成為可能。
現在讓我們考慮下面的場景:
網路地址轉換
在2號路由器中,我們會把 enp0s3 介面移動到外部區域(external),enp0s8 到內部區域(external),偽裝(masquerading)或者說 NAT 預設是啟用的:
# firewall-cmd --list-all --zone=external
# firewall-cmd --change-interface=enp0s3 --zone=external
# firewall-cmd --change-interface=enp0s3 --zone=external --permanent
# firewall-cmd --change-interface=enp0s8 --zone=internal
# firewall-cmd --change-interface=enp0s8 --zone=internal --permanent
對於我們當前的設定,內部區域(internal) - 以及和它一起啟用的任何東西都是預設區域:
# firewall-cmd --set-default-zone=internal
下一步,讓我們過載防火牆規則並保持狀態資訊:
# firewall-cmd --reload
最後,在 web 伺服器中新增2號路由器為預設閘道器:
#iproute add default via 10.0.0.18
現在你會發現在 web 伺服器中你可以 ping 1號路由器和外部網站(例如 tecmint.com):
#ping-c 2192.168.0.1
#ping-c 2 tecmint.com
驗證網路路由
在 RHEL 7 中設定核心執行時引數
在 Linux 中,允許你更改、啟用以及停用核心執行時引數,RHEL 也不例外。當操作條件發生變化時,/proc/sys
介面(sysctl)允許你實時設定執行時引數改變系統行為,而不需太多麻煩。
為了實現這個目的,會用 shell 內建的 echo 寫 /proc/sys/<category>
中的檔案,其中 <category>
一般是以下目錄中的一個:
- dev: 連線到機器中的特定裝置的引數。
- fs: 檔案系統設定(例如 quotas 和 inodes)。
- kernel: 核心設定。
- net: 網路設定。
- vm: 核心的虛擬記憶體的使用。
要顯示所有當前可用值的列表,執行
#sysctl-a |less
在第一部分中,我們通過以下命令改變了 net.ipv4.ip_forward
引數的值以允許 Linux 機器作為一個路由器。
#echo1>/proc/sys/net/ipv4/ip_forward
另一個你可能想要設定的執行時引數是 kernel.sysrq
,它會啟用你鍵盤上的 Sysrq
鍵,以使系統更好的執行一些底層功能,例如如果由於某些原因凍結了後重新啟動系統:
#echo1>/proc/sys/kernel/sysrq
要顯示特定引數的值,可以按照下面方式使用 sysctl
:
#sysctl<parameter.name>
例如,
#sysctl net.ipv4.ip_forward
#sysctl kernel.sysrq
有些引數,例如上面提到的某個,只需要一個值,而其它一些(例如 fs.inode-state
)要求多個值:
檢視核心引數
不管什麼情況下,做任何更改之前你都需要閱讀核心文件。
請注意系統重新啟動後這些設定會丟失。要使這些更改永久生效,我們需要新增內容到 /etc/sysctl.d
目錄的 .conf 檔案,像下面這樣:
#echo"net.ipv4.ip_forward = 1">/etc/sysctl.d/10-forward.conf
(其中數位 10 表示相對同一個目錄中其它檔案的處理順序)。
並用下面命令啟用更改:
#sysctl-p /etc/sysctl.d/10-forward.conf
總結
在這篇指南中我們解釋了基本的包過濾、網路地址變換和在執行的系統中設定核心執行時引數並使重新啟動後能持久化。我希望這些資訊能對你有用,如往常一樣,我們期望收到你的回復!
別猶豫,在下面的表單中和我們分享你的疑問、評論和建議吧。
作者:Gabriel Cánepa 譯者:ictlyh 校對:wxy
本文永久更新連結地址:http://www.linuxidc.com/Linux/2015-10/124436.htm
相關文章