RHCE 系列(二):如何進行包過濾、網路地址轉換和設置內核運行時參數
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.20 80
# 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.20 80
# wget 10.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號路由器為默認網關:
# ip route add default via 10.0.0.18
現在你會發現在 web 伺服器中你可以 ping 1號路由器和外部網站(例如 tecmint.com):
# ping -c 2 192.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 機器作為一個路由器。
# echo 1 > /proc/sys/net/ipv4/ip_forward
另一個你可能想要設置的運行時參數是 kernel.sysrq
,它會啟用你鍵盤上的 Sysrq
鍵,以使系統更好的運行一些底層功能,例如如果由於某些原因凍結了後重啟系統:
# echo 1 > /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
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive