正如第一部分(「設置靜態網絡路由」)提到的,在這篇文章(RHCE 系列第二部分),咱們首先介紹紅帽企業版 Linux 7(RHEL)中包過濾和網絡地址轉換(NAT)的原理,而後再介紹在某些條件發生變化或者須要變更時設置運行時內核參數以改變運行時內核行爲。node
RHEL 7 中的網絡包過濾linux
當咱們討論數據包過濾的時候,咱們指防火牆讀取每一個試圖經過它的數據包的包頭所進行的處理。而後,根據系統管理員以前定義的規則,經過採起所要求的動做過濾數據包。web
正如你可能知道的,從 RHEL 7 開始,管理防火牆的默認服務是 firewalld。相似 iptables,它和 Linux 內核的 netfilter 模塊交互以便檢查和操做網絡數據包。但不像 iptables,Firewalld 的更新能夠當即生效,而不用中斷活躍的鏈接 - 你甚至不須要重啓服務。shell
Firewalld 的另外一個優點是它容許咱們定義基於預配置服務名稱的規則(以後會詳細介紹)。服務器
然而,你應該記得,因爲尚未介紹包過濾,爲了簡化例子,咱們停用了2號路由器的防火牆。如今讓咱們來看看如何使接收的數據包發送到目的地的特定服務或端口。網絡
首先,讓咱們添加一條永久規則容許從 enp0s3 (192.168.0.19) 到 enp0s8 (10.0.0.18) 的入站流量:less
# firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i enp0s3 -o enp0s8 -j ACCEPT運維
上面的命令會把規則保存到 /etc/firewalld/direct.xml 中:tcp
# cat /etc/firewalld/direct.xmllinux運維
而後啓用規則使其當即生效:
# 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
總結
在這篇指南中咱們解釋了基本的包過濾、網絡地址變換和在運行的系統中設置內核運行時參數並使重啓後能持久化。我但願這些信息能對你有用.
免費領取兄弟連IT教育原創linux運維工程師視頻/細說linux教程,詳情諮詢官網客服:http://www.lampbrother.net/linux/
或者勾搭Q2430675018
歡迎加入linux交流羣 478068715