一、Linux的防火牆
防火牆是日常應用中一個重要的維護內容,從防火牆開始我們才真正接觸生產環境,網絡安全越來越受重視,學好這部分內容是學好運維的重要一步。
一般情況下,桌面級環境中很少有人關注過防火牆,甚至殺毒軟件都不裝,對防火牆的操作當然不熟悉。真實生產環境中不可能不開防火牆。
linux的防火牆技術的核心是netfilter,firewalld和iptables都是用來操作netfilter的工具,他們的區別參加這篇文章。
簡單來說他們都只是操作netfilter的工具,CentOS6之前用iptables、CentOS7改爲firewalld,同時firewalld可以識別部分iptables的配置,並將他作用到default zone上。
二、iptables工具學習環境搭建
因爲centos7默認的防火牆是firewalld,所以我們先要把firewalld停用,然後在換成centos6的iptables,前期準備工作:關閉selinux、關閉centos7帶的firewalld然後啓動iptables-service。
(一)關閉selinux功能
1、臨時關閉
setenforce 0 關閉命令
getenforce 查看selinux狀態命令
只要確認getenforce狀態是Permissive就可以了。只是暫時關閉,系統重啓後仍會開啓,需要通過修改配置文件方式永久關閉。
2、永久關閉
永久關閉該功能需要修改selinux的配置文件
vi /etc/selinux/config
將SELINUX=enforcing改爲disabled
注意不能改成下面那個SELINUXTYPE=disabled,否則系統會啓動不了。
(二)關閉centos7的firewalld
systemctl stop firewalld #關閉firewalld功能
systemctl disable firewalld #停止firewalld開機啓動
操作截圖
這一步不像上面那步有操作過程提示,只要沒報錯就ok了。
(三)啓動centos6或者5支持的netfilter防火牆
yum install iptables-services #安裝netfilter功能,也就是常說的iptables,注意包名末尾是iptables和services複數形式,敲成iptables-service就沒這個包
systemctl enable iptables #設置開機啓動iptables服務
systemctl start iptables #開啓iptables程序
iptables -nvL #查看iptables的默認規則
操作截圖
1是設置開機啓動,2是在當前bash下啓動iptables,3是查看iptables的默認規則。
三、netfilter的表(table)與鏈條(chain)
netfilter使用5個表與5個鏈條控制網口傳輸過來的包的,哪些需要丟棄,哪些允許進來等等。
5個表分別是:
filter:主要用於過濾數據包,是系統預設的表。內含3個鏈:INPUT、OUTPUT、FOWARD,就是說數據包只要在這三個鏈中,你就可以用filter表中的規則來處理他。
nat:主要用於網絡地址轉換,內含3個鏈:PREROUTING、OUTPUT、POSTROUNTING。
mangle:主要用於給包做標記,然後根據標記處理包。內含全部五個鏈
raw:可以用來設定不被系統跟蹤的數據包,這個表可以指定某些端口進來的數據不被跟蹤。內含2個鏈:PREROUNTING和OUTPUT
security:在Centos6中沒有,用於強制訪問控制的網絡規劃,暫時先不研究。
5個鏈分別是:
PREROUTING:數據包進入路由表之前
INPUT:通過路由表後目的地爲本機
FORWARDING:通過路由表後,目的地不爲本機。
OUTPUT:由本機產生,向外轉發。
POSTROUTING:發送到網卡接口前
netfilter啓動後,網絡數據包在系統中的流向圖:(轉載至wiki)
四、iptables程序
iptables用於操控netfilter防火牆,他能直接添加、修改或者刪除PREROUTING、INPUT、FORWARDING、OUTPUT、POSTROUTING5個鏈中的規則,達到過濾數據包的目的
iptables命令寫法
iptables -t 表名 <-A/I/D/R> 鏈名 [規則號] <-i/o 網卡名> -p 協議名 <-s 源IP/源子網> --sport 源端口 <-d 目標IP/目標子網> --dport 目標端口 -j 動作
選項含義
-t<表>:指定要操縱的表;
-A:向鏈規則中添加條目;
-D:從鏈規則中刪除條目;
-I:向鏈規則中插入條目;
-R:替換鏈規則中的條目;
-L:顯示鏈規則中已有的條目;
-F:清空防火牆規則;
-Z:清空鏈規則中包計數器與連接計數器;
-N:創建新的用戶自定義規則鏈;
-P:定義鏈規則中的默認處置方式,如;
-h:顯示幫助信息;
-p:指定要匹配的數據包協議類型,;
-s:指定要匹配的數據包源ip地址;
-j+動作:如何處理過濾出來的包,常見的有ACCEPT,;
-i<網絡接口>:指定數據包進入本機的網絡接口;
-o<網絡接口>:指定數據包要離開本機所使用的網絡接口。
--dport
--sport
表名包括:
raw:高級功能,如:網址過濾。
mangle:數據包修改(QOS),用於實現服務質量。
nat:地址轉換,用於網關路由器。
filter:包過濾,用於防火牆規則。
鏈名包括:
INPUT鏈:處理輸入數據包。
OUTPUT鏈:處理輸出數據包。
PORWARD鏈:處理轉發數據包。
PREROUTING鏈:用於目標地址轉換(DNAT)。
POSTOUTING鏈:用於源地址轉換(SNAT)。
動作包括:
ACCEPT:接收數據包。
DROP:丟棄數據包。
REDIRECT:重定向、映射、透明代理。
SNAT:源地址轉換。
DNAT:目標地址轉換。
MASQUERADE:IP僞裝(NAT)
LOG:日誌記錄
五、iptables操作示例
1、顯示、清空與保存操作現有的netfilter規則
iptables -nvL #顯示現有規則,分表顯示的
iptables -F #清空所有規則
iptables -Z #置零計數器,用於網絡***分析
service iptables save #將規則保存到/etc/sysconfig/iptables文件中
systemctl restart iptables.service #重啓iptables服務使指定的規則生效
iptables的默認規則保存在/etc/sysconfig/iptables文件下
2、鏈處理規則的增加、刪除與修改
防火牆規則添加到鏈規則尾部
iptables -t nat -A POSTROUTING -s 192.168.81.0/24 -o ens33 -j MASQUERADE
防火牆規則添加到鏈規則頭部
iptables -t nat -I POSTROUTING -s 192.168.81.0/24 -o ens33 -j MASQUERADE #與上條區別就是選項變成-I
刪除防火牆某一條規則
iptables -t nat -D POSTROUTING -s 192.168.81.0/24 -o ens33 -j MASQUERADE #如果你記住原添加命令就這麼寫
iptables --
修改防火牆默認鏈處理規則
iptables -P DROP
3、通過配置NAT表實現路由功能
這是有一定難度的兩個實驗,我在兩臺電腦上搗鼓了兩天才終於在一臺電腦上搗鼓成功了示例中的功能,在沒有系統學習網絡排障經驗前如果要順利完整下列實驗,建議重新新建兩臺虛擬機,不能克隆,必須新建兩臺虛擬機並各自安裝一次操作系統。
場景一:
一號機具有兩塊網卡分別是ens33和ens37,ens33連接外網;ens37連接內網,IP爲192.168.100.1/24。
二號機只有一塊網卡ens37,IP爲192.168.100.100/24,現用交換機將一號機與二號機相連,通過配置一號機nat表實現二號機能夠正常訪問外網。
配置步驟
1、準備測試機(待修改)
重新準備二臺虛擬機,一號機新建兩塊網卡,ens33爲外網,NAT模式與宿主機共享上網,ip設置爲自動獲取即可,(此實驗中基本不需要xhell遠程登錄一號機,直接在vmware界面中操作就行),ens37爲局域網網卡,設置ip爲192.168.100.1/24。
二號機新建1塊網卡,ip爲192.168.100.100/24 網關設置爲192.168.100.1。
配置好後兩臺機器的ifconfig界面分別是
一號機:
二號機:
確認一下配置效果
其中一號機能夠訪問外網,能夠ping通二號機的ip 192.168.100.100
二號機不能上外網,但能ping通一號機局域網ip 192.168.100.1
注意二號機在現在的情況下是不能ping通一號機的外網網卡ip(192.168.88.128)的,而且顯示的要是圖中所列的“netwaork unreachable”,其他顯示都不對,如果是其他顯示,等下你配置nat表二號機就不能訪問外網。
然後按照程序關閉selinux》》關閉firewalld》》下載並開啓iptables。
2、配置NAT
首先打開一號機的路由轉發功能,不然無論怎麼設置iptables都沒用。
echo "1" > /proc/sys/net/ipv4/ip_forward
圖是另外計算機上的圖
然後配置一號機的nat表,圖中的配置是我配置另外實驗電腦的圖,按下面的命令寫。
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE #設置192.168.100.0網段轉發到外網網卡上
iptables -t nat -nvL #查看規則加上去沒有
檢查效果
二號機能ping到外網了
小結:這個試驗我做了兩天,終於達到了想要的效果,之前無論怎樣設置都解決不了二號機ping不到外網問題,多次嘗試後最終用兩臺全新安裝的單獨的新虛擬電腦才達到目的。回想起來在一號機上看到了firewalld的規則,zone什麼的,應該是firewalld的沒關掉或者有什麼規則reject掉了一些包。如果重複上述實驗出現問題時建議先用iptables -nvL命令看看是不是有firewalld的規則在。
場景二
一號機具有兩塊網卡分別是ens33和ens37,ens33連接外網;ens37連接內網,IP爲192.168.100.1/24。
二號機只有一塊網卡ens37,IP爲192.168.100.100/24,現用交換機將一號機與二號機相連,通過配置一號機nat表二號機能夠正常訪問外網。
三號機爲一外網主機,能夠訪問一號機外網網卡ip192.168.208.128,現需要在一號機上配置端口轉發,使三號機能夠訪問到局域網內的二號機。
首先我們把虛擬機所在的電腦當成三號機
繼續操作一號機的nat表
iptables -t nat -A PREROUTING -d 192.168.208.128/32 -p tcp -m tcp --dport 1122 -j DNAT --to-destination 192.168.100.100:22
iptables -t nat -A POSTROUTING -s 192.168.100.100/32 -j SNAT --to-source 192.168.208.128
測試效果
注意主機ip仍是一號機外網IP,但端口號要填1122,就是你映射端口號
連上了,注意看標紅處的ip,你連的是局域網中的100.100,不是一號機。
五、iptables規則的備份與恢復
就兩個基本操作。
1、保存設置好的規則表使其在機器重啓後也生效。
service iptables save
他會把防火牆規則保存到/etc/sysconfig/iptables文件內,這個文件就是iptables的配置文件。
2、把規則表保存再特定位置,導入自定義的規則表
iptables-save > /tmp/ipt.txt #另存規則表命令,路徑可自定義
iptables-restroe < /tmp/ip.txt #導入自定義的規則表,路徑自定義