iptables&&firewall防火牆

配置iptables防火牆增強服務器安全
Centos7.X 開始,系統自帶的防火牆是firewalld,但是也同樣支持iptables,本即可,我們仍然可以用iptables來作爲防火牆
1、 iptables概述:
1.1、 netfilter/iptables
netfilter/iptables : IP信息包過濾系統,它實際上由兩個組件netfilter 和 iptables 組成。
netfilter/iptables 關係:
netfilter 組件也稱爲內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。
iptables 組件是一種工具,也稱爲用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。
netfilter/iptables 後期簡稱爲:iptables。 iptables是基於內核的防火牆,功能非常強大,iptables內置了filter,nat和mangle、raw四張表。所有規則配置後,立即生效,不需要重啓服務
1.2、 四張表介紹:
filter負責過濾數據包,包括的規則鏈有,input,output和forward;
nat則涉及到網絡地址轉換,包括的規則鏈有,prerouting,postrouting和output;
mangle表則主要應用在修改數據包內容上,用來做流量整形的,給數據包打個標識,默認的規則鏈有:INPUT,OUTPUT、 forward,POSTROUTING,PREROUTING;
raw表主要用於異常處理,PREROUTING、OUTPUT
1.3、 五個鏈:
input匹配目標IP是本機的數據包,
output 出口數據包 , 一般不在此鏈上做配置
forward匹配流經本機的數據包,
prerouting用來修改目的地址,用來做DNAT 。如:把內網中的80端口映射到路由器外網端口上
postrouting用來修改源地址用來做SNAT。 如:內網通過路由器NAT轉換功能實現內網PC機通過一個公網IP地址上網。
1.4、 ptables三個表,5個鏈接,結構圖:
iptables&&firewall防火牆
1.4.1、 Raw [rɔ:]表:用於處理異常,包括的規則鏈有,prerouting,output; 一般使用不到。
例:查看raw表中的內容:
[root@firewall ~]# iptables -t raw -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

表->鏈->規則

1.4.2、 Iptables過濾封包流程
-->PREROUTING-->[ROUTE]-----FORWARD----->POSTROUTING-->
raw
mangle ^ mangle
mangle
filter nat
nat
v
                  INPUT                          OUTPUT
                    | mangle                         ^ mangle
                    | filter                            |  nat
                    v ---------------->local------------>| filter
簡化過濾流程:
-->PREROUTING-->[ROUTE]-----FORWARD----->POSTROUTING-->
^
filter nat
nat
v
                  INPUT                          OUTPUT
                    |                                ^ 
                    | filter                            |  
                    v ---------------->local------------> | filter

1.4.3、 總結:
整體數據包分三類: 1、發給防火牆本身的數據包 ;2、需要經過防火牆轉發的數據包;3、由運行在本機的程序封裝的並發出去的數據包;
① 當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。
② 如果數據包就是進入本機的,它就會沿着圖向下移動,到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。
本機上運行的程序可以發送數據包,這些數據包會經過OUTPUT鏈,然後到達POSTROUTING鏈輸出。
③ 如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出。
iptables&&firewall防火牆
注意:規則的次序非常關鍵,誰的規則越嚴格,應該放的越靠前,而檢查規則的時候,是按照從上往下的方式進行檢查的。
2、 安裝iptables
2.1、 關閉firewall:
[root@localhost ~]# systemctl stop firewalld.service #停止firewall
[root@localhost ~]# systemctl disable firewalld.service #禁止firewall開機啓動
2.2、 安裝安裝iptables防火牆
[root@localhost ~]# yum install iptables-services
2.3、 配置文件位置:
[root@firewall ~]# ls /etc/sysconfig/iptables
/etc/sysconfig/iptables
2.4、 啓動服務
[root@firewall ~]# systemctl start iptables.service
2.5、 配置開機啓動
[root@firewall ~]# systemctl enable iptables.service
3、 Iptables語法命令
3.1、 語法格式
iptables&&firewall防火牆
3.2、 iptables語法總結:
iptables&&firewall防火牆
3.3、 iptables命令使用方法
iptables [-t 要操作的表]
<操作命令>
[要操作的鏈]
[規則號碼]
[匹配條件]
[-j 匹配到以後的動作]

操作命令(-A、-I、-D、-P、-F)
查看命令(-[vnx]L)
3.3.1、 追加一條規則(放到最後)
-A <鏈名> APPEND,
iptables -t filter -A INPUT -j DROP #拒絕所有人訪問服務器
在 filter 表的 INPUT 鏈裏追加一條規則(作爲最後一條規則)
匹配所有訪問本機 IP 的數據包,匹配到的丟棄
3.3.2、 INSERT,插入一條規則
-I <鏈名> [規則號碼]
iptables -I INPUT -j DROP
在 filter 表的 INPUT 鏈裏插入一條規則(插入成第 1 條)
iptables -I INPUT 3 -j DROP
在 filter 表的 INPUT 鏈裏插入一條規則(插入成第 3 條)
注意: 1、-t filter 可不寫,不寫則自動默認是 filter 表
2、-I 鏈名 [規則號碼],如果不寫規則號碼,則默認是 1
3、確保規則號碼 ≤ (已有規則數 + 1),否則報錯
3.3.3、 DELETE,刪除一條規則
-D <鏈名> <規則號碼 | 具體規則內容>
[root@firewall ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere anywhere
iptables -D INPUT 1(按號碼匹配)
刪除 filter 表 INPUT 鏈中的第1條規則(不管它的內容是什麼)
[root@firewall ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
iptables -D INPUT -s 192.168.0.1 -j DROP(按內容匹配)
刪除 filter 表 INPUT 鏈中內容爲“-s 192.168.0.1 -j DROP”的規則
(不管其位置在哪裏)
注意:
1、若規則列表中有多條相同的規則時,按內容匹配只刪除序號最小的一條
2、按號碼匹配刪除時,確保規則號碼 ≤ 已有規則數,否則報錯
3、按內容匹配刪除時,確保規則存在,否則報錯
3.3.4、 POLICY,設置某個鏈的默認規則
-P <鏈名> <動作>
[root@firewall ~]# iptables -L #查看默認規則是ACCEPT [əkˈsept]
Chain INPUT (policy ACCEPT)
target prot opt source destination
iptables -P INPUT DROP

設置 filter 表 INPUT 鏈的默認規則是 DROP

[root@firewall ~]# iptables -L #查看已經變爲DROP
Chain INPUT (policy DROP)
target prot opt source destination
注意:
當數據包沒有被規則列表裏的任何規則匹配到時,按此默認規則處理。動作前面不能加 –j,這也是唯一一種匹配動作前面不加 –j 的情況。
3.3.5、 FLUSH,清空規則
3.3.5.1、 清空規則
-F [鏈名]
添加規則:
[root@firewall ~]# iptables -t filter -A INPUT -j DROP
[root@firewall ~]# iptables -F INPUT #清除INPUT鏈上的規則
[root@firewall ~]# iptables -F #清除filter表中所有鏈上的規則

[root@firewall ~]# iptables -t nat -F #清空NAT表中 所有鏈上的規則
[root@firewall ~]# iptables -t nat -F PREROUTING #清空NAT表中 PREROUTING鏈上的規則
3.3.5.2、 注意:
1、-F 僅僅是清空鏈中規則,並不影響 -P 設置的默認規則。 需要手動改:
[root@firewall ~]# iptables -P INPUT ACCEPT
2、-P 設置了 DROP 後,使用 -F 一定要小心!!!
##在生產環境中,使用-P DROP 這條規則,一定要小心,設置之前最好配置下面兩個任務計劃,否則容易把自己drop掉,鏈接不上遠程主機。
配置crontab :
/15 iptables -P INPUT ACCEPT
/15 iptables –F
3、如果不寫鏈名,默認清空某表裏所有鏈裏的所有規則
3.3.6、 將封包計數器歸零
-Z
iptables -Z INPUT
3.3.7、 LIST,列出規則
-L [鏈名]
v:顯示詳細信息,包括每條規則的匹配包數量和匹配字節數
x:在 v 的基礎上,禁止自動單位換算(K、M)
n:只顯示 IP 地址和端口號碼,不顯示域名和服務名稱
--line-number 可以查看到規則號
例如:
iptables -L
粗略列出 filter 表所有鏈及所有規則
iptables -t nat -vnL
用詳細方式列出 nat 表所有鏈的所有規則,只顯示 IP 地址和端口號
iptables -t nat -vxnL PREROUTING
用詳細方式列出 nat 表 PREROUTING 鏈的所有規則以及詳細數字,不反解
3.4、 匹配條件
流入、流出接口(-i、-o)
來源、目的地址(-s、-d)
協議類型 (-p)
來源、目的端口(--sport、--dport)
3.4.8、 按網絡接口匹配
-i <匹配數據進入的網絡接口> #此參數主要應用於nat表,例如目標地址轉換
例如:
-i eth0
匹配是否從網絡接口 eth0 進來
-i ppp0
匹配是否從網絡接口 ppp0 進來
-o 匹配數據流出的網絡接口
例如:
-o eth0
-o ppp0
3.4.9、 按來源目的地址匹配
-s <匹配來源地址>
可以是 IP、 網段、域名,也可空(任何地址)
例如:
-s 192.168.0.1 匹配來自 192.168.0.1 的數據包
-s 192.168.1.0/24 匹配來自 192.168.1.0/24 網絡的數據包
-s 192.168.0.0/16 匹配來自 192.168.0.0/16 網絡的數據包
-d <匹配目的地址>
可以是 IP、 網段、域名,也可以空
例如:
-d 202.106.0.20 匹配去往 202.106.0.20 的數據包
-d 202.106.0.0/16 匹配去往 202.106.0.0/16 網絡的數據包
-d www.abc.com 匹配去往域名 www.abc.com 的數據包
3.4.10、 按協議類型匹配
-p <匹配協議類型>
可以是 TCP、UDP、ICMP 等,也可爲空
例如:
-p tcp
-p udp
-p icmp --icmp-type 類型
ping: type 8 pong: type 0
3.4.11、 按來源目的端口匹配
--sport <匹配源端口>
可以是個別端口,可以是端口範圍
例如:
--sport 1000 匹配源端口是 1000 的數據包
--sport 1000:3000 匹配源端口是 1000-3000 的數據包(含1000、3000)
--sport :3000 匹配源端口是 3000 以下的數據包(含 3000)
--sport 1000: 匹配源端口是 1000 以上的數據包(含 1000)
--dport <匹配目的端口>
可以是個別端口,可以是端口範圍
例如:
--dport 80 匹配目的端口是 80 的數據包
--dport 6000:8000 匹配目的端口是 6000-8000 的數據包(含6000、8000)
--dport :3000 匹配目的端口是 3000 以下的數據包(含 3000)
--dport 1000: 匹配目的端口是 1000 以上的數據包(含 1000)
注意:--sport 和 --dport 必須配合 -p 參數使用
3.4.12、 匹配應用舉例
1、端口匹配
-p udp --dport 53
匹配網絡中目的端口是 53 的 UDP 協議數據包
2、地址匹配
-s 10.1.0.0/24 -d 172.17.0.0/16
匹配來自 10.1.0.0/24 去往 172.17.0.0/16 的所有數據包
3、端口和地址聯合匹配
-s 192.168.0.1 -d www.abc.com -p tcp --dport 80
匹配來自 192.168.0.1,去往 www.abc.com 的 80 端口的 TCP 協議數據包

注意:
1、--sport、--dport 必須聯合 -p 使用,必須指明協議類型是什麼
2、條件寫的越多,匹配越細緻,匹配範圍越小
3.5、 動作(處理方式)
ACCEPT
DROP
REJECT
SNAT
DNAT
MASQUERADE
3.5.13、 通過
-j ACCEPT
通過,允許數據包通過本鏈而不攔截它
例如:
iptables -A INPUT -j ACCEPT
允許所有訪問本機 IP 的數據包通過

3.5.14、 丟棄
-j DROP
丟棄,阻止數據包通過本鏈而丟棄它
例如:
iptables -A FORWARD -s 192.168.80.39 -j DROP
阻止來源地址爲 192.168.80.39 的數據包通過本機

3.5.15、 源地址轉換
-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING 鏈)
源地址轉換,SNAT 支持轉換爲單 IP,也支持轉換到 IP 地址池(一組連續的 IP 地址
例如:
[root@firewall ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
#將內網 192.168.0.0/24 的原地址修改爲 1.1.1.1,用於 NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
同上,只不過修改成一個地址池裏的 IP
3.5.16、 目的地址轉換
-j DNAT --to IP[-IP][:端口-端口](nat 表的 PREROUTING 鏈)
目的地址轉換,DNAT 支持轉換爲單 IP,也支持轉換到 IP 地址池
(一組連續的 IP 地址)
例如:

表達方式1:把從 eth0 進來的要訪問 TCP/80 的數據包目的地址改爲 192.168.0.1.
[root@firewall ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1
表達方式2:
[root@firewall ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 81 -j DNAT --to 192.168.0.1:81
表達方式3:把從 eth0 進來的要訪問 TCP/80 的數據包目的地址改爲 192.168.0.1-192.169.1.10
[root@firewall ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1-192.169.0.10
3.5.17、 僞裝
-j MASQUERADE 僞裝 [ˌmæskəˈreɪd]
動態源地址轉換(動態 IP 的情況下使用)
例如:
[root@firewall ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
將源地址是 192.168.0.0/24 的數據包進行地址僞裝,轉換成eth0上的IP地址。eth0爲路由器外網出口IP地址
3.6、 附加模塊
按包狀態匹配 (state)
按來源 MAC 匹配(mac)
按包速率匹配 (limit)
多端口匹配 (multiport)
3.6.18、 按包狀態匹配(state)
-m state --state 狀態
狀態:NEW、RELATED、ESTABLISHED、INVALID
NEW:如果我們發送一個連接的初始化包,狀態就會在OUTPUT鏈裏被設置爲NEW,當我們收到迴應的包時,狀態就會在PREROUTING鏈裏被設置爲ESTABLISHED。如果第一個包不是本地產生的,那就會在PREROUTING鏈裏被設置爲NEW狀態。
ESTABLISHED:連接態
RELATED:衍生態,(如FTP的數據連接是與控制連接相關的,所以數據連接在規則鏈被設置爲RELATED狀態)
INVALID:不能被識別屬於哪個連接或沒有任何狀態
例如:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
四個狀態:

iptables&&firewall防火牆

3.6.19、 按來源 MAC 匹配(mac)
-m mac --mac-source MAC
匹配某個 MAC 地址
例如:
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
阻斷來自某 MAC 地址的數據包,通過本機
注意:
報文經過路由後,數據包中原有的 mac 信息會被替換,所以在路由後的 iptables 中使用 mac 模塊是沒有意義的
3.6.20、 按包速率匹配 (limit)
-m limit --limit 匹配速率 [--burst 緩衝數量]
用一定速率去匹配數據包
例如:
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.0.1 -j DROP
注意:
limit 英語上看是限制的意思,但實際上只是按一定速率去匹配而已,50/s表示1秒中轉發50個數據包,要想限制的話後面要再跟一條 DROP
3.6.21、 多端口匹配 (multiport)
-m multiport <--sports|--dports|--ports> 端口1[,端口2,..,端口n]
一次性匹配多個端口,可以區分源端口,目的端口或不指定端口
例如:
iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT
注意:
必須與 -p 參數一起使用

保存:service iptables save

4、 實戰: 配置vsftp服務器主動模式iptables規則:
4.1、 iptables配置FTP的主動和被動模式
FTP協議有兩種工作方式:
PORT方式和PASV方式,中文意思爲主動式和被動式。
Port模式:ftp server:tcp 21 <------client:dynamic ;ftp server:tcp 20 ------>client:dynamic
Pasv模式:ftp server:tcp 21 <----client:dynamic; ftp server:tcp dynamic <----client:dynamic
PORT(主動)方式的連接過程是:客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。當需要傳送數據時,客戶端在命令鏈路上用PORT命令告訴服務器:“我打開了XXXX端口,你過來連接我”。於是服務器從20端口向客戶端的XXXX端口發送連接請求,建立一條數據鏈路來傳送數據。
PASV(被動)方式的連接過程是:客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。當需要傳送數據時,服務器在命令鏈路上用PASV命令告訴客戶端:“我打開了XXXX端口,你過來連接我”。於是客戶端向服務器的XXXX端口發送連接請求,建立一條數據鏈路來傳送數據。
注意:關閉selinux
4.2、 開放21端口:
ftp數據連接的主動模式規則如下

iptables -F

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -i lo -j ACCEPT #默認情況一般服務與本機通訊以127.0.0.1來通訊的。

iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -p icmp -j ACCEPT #允許其他機器 ping 本機

iptables –A INPUT -j DROP

4.3、 被動模式
首先修改vsftpd.conf文件,指定被動模式的端口範圍,在vsftpd.conf文件中添加如下兩行配置項:
pasv_min_port=26500
pasv_max_port=26600
然後在iptables防火牆的filter表的input鏈中創建如下規則:

iptables -I INPUT -p tcp --dport 26500:26600 -j ACCEPT

加載模塊

modprobe ip_conntrack //modprobe命令用於加載內核模塊

modprobe ip_conntrack_ftp

最後,將配置好的規則保存到/etc/sysconfig/iptables規則文件中

iptables-save > /etc/sysconfig/iptables

4.4、 Iptables 指南 1.1.19
https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#STATEMACHINEINTRODUCTION
4.5、 測試:

iptables&&firewall防火牆
4.6、 常用規則:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEP

5、 實戰:使用iptables防火牆保護公司web服務器
5.1、 分析:
這允許單服務器的防護。
弄清對外服務對象
書寫規則
網絡接口 lo 的處理
協議 + 端口的處理
狀態監測的處理
5.2、 具體配置如下:
web服務器端:firewall
客戶端: client01
5.3、 拓撲圖: 硬件防火牆
iptables&&firewall防火牆
5.4、 配置web服務器iptables防火牆:
配置之前,清空下已有的規則,防止規則衝突不生效
[root@firewall ~]#iptables -F
[root@firewall ~]# iptables -A INPUT -i lo -j ACCEPT #放行環回口所有數據
[root@firewall ~]# iptables -A INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT
[root@firewall ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#允許已經建立tcp連接的包以及該連接相關的包通過。狀態防火牆能識別TCP或者UDP會話。非狀態防火牆只能根據端口識別,不能識別會話
[root@firewall ~]# iptables -P INPUT DROP
注:一般iptables,OUTPUT出口一般都放行,不需要在出口上做限制。這樣允許服務器主動訪問外網
5.5、 啓動web服務器:
[root@firewall ~]# systemctl start httpd
5.6、 安裝ftp服務器並開起
[root@firewall ~]# yum install vsftpd -y #安裝ftp服務器並開起
[root@firewall ~]# systemctl start vsftpd
Starting vsftpd for vsftpd: [ OK ]
5.7、 測試
5.7.1、 安裝elinks測試
[root@client01 ~]# yum install elinks -y
測試web訪問
[root@client01 ~]# elinks 192.168.1.63
在windows 測試訪問http://192.168.1.63 可以訪問
5.7.2、 測試FTP無法訪問
5.7.3、 查看配置結果:
[root@firewall ~]# iptables -L -n
6、 實戰:使用iptables搭建路由器,
通過SNAT功能,使內網PC機,可以上網。
6.1、 網絡拓撲
iptables&&firewall防火牆

6.2、 需求:
使pc1可以通過firewall上網,即可以訪問pc3提供的web服務。
6.3、 配置:firewall
6.3.2、 添加兩個網卡,
兩塊網卡均橋接vmnet1
配置ens33(連接內網):ip地址192.168.12.21/24。
配置ens37(連接internet):ip地址192.168.23.23/24
6.3.3、 啓用內核路由轉發功能
6.3.3.2、 臨時生效
[root@firewall ~]#echo "1" > /proc/sys/net/ipv4/ip_forward
6.3.3.3、 永久生效:
[root@firewall ~]# vim /etc/sysctl.conf
添加下面的內容:
net.ipv4.ip_forward = 1
改完使配置生效:
[root@firewall ~]# sysctl -p
6.3.4、 配置之前,把前面的規則去除了,
iptables –F
6.3.5、 配置SNAT:
[root@firewall ~]#iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT --to 192.168.23.23
或:
[root@firewall ~]#iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -o ens37 -j MASQUERADE
#此條規則通常用於出口地址不是固定的情況下,比如ADSL撥號上網.
6.4、 配置客戶端pc1:
修改pc1 網卡模式爲vmnet1
配置IP地址,子網掩碼,網關地址
6.5、 測試:
ping 192.168.12.21 //ping網關
6.6、 配置pc3(模擬的internet的web服務)
修改pc3網卡模式爲vmnet1
配置ip地址,子網掩碼。
安裝httpd服務及啓動httpd服務
Web服務器的防火牆清除所有規則或者創建針對於web服務的訪問規則。
6.7驗證:
在Pc1上通過瀏覽器訪問http://192.168.23.32,正常的話是可以瀏覽網頁內容的
在web服務器上查看訪問日誌文件,在訪問日誌中看到的源ip均是網關服務器的外接口的ip地址。
7、 實戰:使用DNAT 功能,把內網web服務器端口映射到路由器外網
7.1、 拓撲:
rhel64(web服務器):IP:192.168.2.2/24,網關:192.168.2.1 網卡橋接:Vmnet1
RHEL63(網關): ens33 : IP:192.168.2.1/24;ens37:IP:192.168.1.63/24 兩塊網卡橋接:Vmnet1
用一臺windows主機模擬internet的客戶機,ip:192.168.1.1/24
iptables&&firewall防火牆
7.2、 需求:
把64的80端口映射到63的80端口,客戶端訪問192.168.1.63:80 即可訪問192.168.2.2的web內容
7.3、 配置64即內網web服務器:
7.3.1、 配置httpd
開啓動httpd服務,首頁內容爲: 192.168.2.2

yum install httpd -y

systemctl start httpd

7.3.2、 測試
在RHEL64 主機上通過elinks 訪問192.168.2.2正常
注意:elinks命令由elinks軟件包提供
7.4、 在63(網關)做DNAT端口映射:
7.4.3、 端口映射

iptables -F

#iptables -t nat -F

iptables -t nat -A PREROUTING -i ens37 -p tcp --dport 80 -j DNAT --to 192.168.2.2:80

或:

iptables -t nat -A PREROUTING -d 192.168.1.63 -p tcp --dport 80 -j DNAT --to 192.168.2.2:80

iptables-save > /etc/sysconfig/iptables

注意:開啓路由轉發功能
7.4.4、 測試:
在192.168.1.1上用瀏覽器訪問:192.168.1.63 即可訪問到64的內容
8、 iptables命令使用總則總結:
所有鏈名必須大寫
INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING
所有表名必須小寫
filter/nat/mangle
所有動作必須大寫
ACCEPT/DROP/SNAT/DNAT/MASQUERADE
所有匹配必須小寫
-s/-d/-m <module_name>/-p

centos7 之 firewalld 詳細介紹配置
1、 Firewalld概念
1.1、 FirewallD是什麼?
FirewallD 提供了支持網絡/防火牆區域(zone)定義網絡鏈接以及接口安全等級的動態防火牆管理工具。
1.2、 什麼是動態防火牆?
我們首先需要弄明白的第一個問題是到底什麼是動態防火牆。爲了解答這個問題,我們先來回憶一下 iptables service 管理防火牆規則的模式:用戶使用命令添加防火牆的規則,如果想讓規則永久保存,還需要再執行命令 iptables-save>/etc/sysconfig/iptables使變更的規則保存到配置文件裏。在這整個過程的背後,iptables service 會對防火牆的規則列表全部重讀一次,加載到內核.
如果我們把這種哪怕只修改一條規則也要進行所有規則的重新載入的模式稱爲靜態防火牆的話,那麼 firewalld 所提供的模式就可以叫做動態防火牆,它的出現就是爲了解決這一問題,任何規則的變更都不需要對整個防火牆規則列表進行重新加載,只需要將變更部分保存並更新到運行中的 iptables 即可。
1.3、 firewalld 和 iptables 之間有什麼關係?
firewalld 提供了一個 daemon 和 service,還有命令行和圖形界面配置工具,它僅僅是替代了 iptables service 部分,其底層還是使用 iptables 作爲防火牆規則管理入口。firewalld自身並不具備防火牆的功能,而是和iptables一樣需要通過內核的netfilter來實現,也就是說firewalld和iptables一樣,他們的作用都是用於維護規則,而真正使用規則幹活的是內核的netfilter,只不過firewalld和iptables的結構以及使用方法不一樣罷了。
1.4、 什麼是區域(zone)?
過濾規則集合:zone
一個zone就是一套過濾規則,數據包必須要經過某個zone才能入站或出站。不同zone中規則粒度粗細、安全強度都不盡相同。可以把zone看作是一個個出站或入站必須經過的安檢門,有的嚴格、有的寬鬆、有的檢查的細緻、有的檢查的粗略。
zone 默認共有9個,block ,dmz ,drop external, home, internal ,public , trusted , work.
不同的區域之間的差異是其對待數據包的默認行爲不同,根據區域名字我們可以很直觀的知道該區域的特徵,在CentOS7系統中,默認區域被設置爲public.
區域(zone)說明如下:
drop(丟棄)
如果使用丟棄區域,任何進入的數據包將被丟棄,沒有任何回覆。僅能有發送出去的網絡連接。
block(限制)
任何進入的網絡連接都被拒絕,並返回 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息。
public(公共)
只接受那些被選中的連接,默認只允許 ssh 和 dhcpv6-client。這個 zone 是缺省 zone
external(外部)
這個區域相當於路由器的啓用僞裝(masquerade)選項。只有指定的連接會被接受。
dmz(非軍事區)
用於您的非軍事區內的電腦,如果想要只允許給部分服務能被外部訪問,可以在DMZ區域中定義。僅僅接收經過選擇的連接。
work(工作)
用於工作區。您可以基本相信網絡內的其他電腦不會危害您的電腦。僅僅接收經過選擇的連接。
home(家庭)
用於家庭網絡。您可以基本信任網絡內的其他計算機不會危害您的計算機。僅僅接收經過選擇的連接。
internal(內部)
用於內部網絡。您可以基本上信任網絡內的其他計算機不會威脅您的計算機。僅僅接受經過選擇的連接。
trusted(信任)
可接受所有的網絡連接。
信任區域允許所有網絡通信通過。記住:因爲trusted是最被信任的,即使沒有設置任何的策略,那麼也是被允許的,因爲trusted是允許所有連接的
以上是系統定義的所有的 zone,但是這些 zone 並不是都在使用。只有活躍的 zone 纔有實際操作意義。
簡單來講就是爲用戶預先準備了幾套規則集合,我們可以根據場景的不同選擇合適的規矩集合,而默認區域是public。
iptables&&firewall防火牆
數據包要進入到內核必須要通過這些zone中的一個,而不同的zone裏定義的規則不一樣(即信任度不一樣,過濾的強度也不一樣)。可以根據網卡所連接的網絡的安全性來判斷,這張網卡的流量到底使用哪個zone,比如上圖來自ens33的流量全部使用zone1的過濾規則,ens37的流量使用zone2。一張網卡同時只能綁定到一個zone
Firewalld的原則:
如果一個客戶端訪問服務器,服務器根據以下原則決定使用哪個 zone 的策略去匹配
1.如果一個客戶端數據包的源 IP 地址匹配 zone 的 sources,那麼該 zone 的規則就適用這個客戶端;一個源只能屬於一個zone,不能同時屬於多個zone。
2.如果一個客戶端數據包進入服務器的某一個接口(如eth0)區配zone的interfaces,則麼該 zone 的規則就適用這個客戶端;一個接口只能屬於一個zone,不能同時屬於多個zone。
3.如果上述兩個原則都不滿足,那麼缺省的 zone 將被應用。
1.5、 什麼是服務?
服務是端口、協議的組合
在 /usr/lib/firewalld/services/ 目錄中,還保存了另外一類配置文件,每個文件對應一項具體的網絡服務,如 ssh 服務等.
與之對應的配置文件中記錄了各項服務所使用的 tcp/udp 端口,在最新版本的 firewalld 中默認已經定義了 70多 種服務供我們使用.
當默認提供的服務不夠用或者需要自定義某項服務的端口時,我們需要將 service 配置文件放置在 /etc/firewalld/services/ 目錄中.
/etc/firewalld/ 存放修改過的配置(優先查找,找不到再找默認的配置)
/usr/lib/firewalld/ 默認的配置
修改配置的話只需要將/usr/lib/firewalld中的配置文件複製到/etc/firewalld中修改。恢復配置的話直接刪除/etc/firewalld中的配置文件即可。
比如:ssh服務默認運行在22端口,如果你的ssh服務運行在220端口(不是默認),此時需要放行220端口,就需要把/usr/lib/firewalld/ssh.xml 文件拷貝到 /etc/firewalld/services/ 目錄下,修改文件端口爲220
重啓firewalld服務或者重新加載設置,以激活這些設置。

firewall-cmd –reload

service 配置的好處顯而易見:
第一,通過服務名字來管理規則更加人性化,
第二,通過服務來組織端口分組的模式更加高效,如果一個服務使用了若干個網絡端口,則服務的配置文件就相當於提供了到這些端口的規則管理的批量操作快捷方式。
每加載一項 service 配置就意味着開放了對應的端口訪問,使用下面的命令分別列出所有支持的 service 和查看當前 zone 種加載的 service:
[root@test ~]# firewall-cmd --get-services #列出所有支持的 service
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp open*** pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
[root@test ~]# firewall-cmd --list-services #查看當前 zone 種加載的 service
dhcpv6-client ssh
2、 firewalld命令
你可以使用任何一種 firewalld 配置工具來配置或者增加區域,以及修改配置。工具有例如firewall-config 這樣的圖形界面工具, firewall-cmd 這樣的命令行工具。
2.1.1、 firewalld常用命令
安裝# yum install firewalld
啓動:# systemctl start firewalld
查看狀態:# systemctl status firewalld 或者 firewall-cmd --state
停止:# systemctl stop firewalld
禁用:# systemctl disable firewalld
2.1.2、 配置firewalld命令
查看版本:# firewall-cmd --version
查看幫助:# firewall-cmd --help
獲取firewalld狀態:# firewall-cmd --state
查看區域信息: # firewall-cmd --get-active-zones
查看指定接口所屬區域:# firewall-cmd --get-zone-of-interface=ens33
獲取支持的區域列表:firewall-cmd –get-zones
獲取所有支持的服務:firewall-cmd –get-services
獲取所有支持的ICMP類型:firewall-cmd –get-icmptypes
…………
2.1.3、 更新防火牆規則:

firewall-cmd --reload //在不改變當前連接狀態的條件下重新加載防火牆

firewall-cmd --complete-reload //當前連接的狀態信息將會丟失

兩者的區別就是第一個無需斷開連接,就是firewalld特性之一動態添加規則,第二個需要斷開連接,類似重啓服務
2.1.4、 列出所有支持的 zone 和查看當前的默認 zone
[root@test ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@test ~]# firewall-cmd --get-default-zone
Public
2.1.5、 設置默認接口區域

firewall-cmd --set-default-zone=public

立即生效無需重啓
2.1.6、 將接口添加到區域,默認接口都在public

firewall-cmd --zone=public --add-interface=ens33

永久生效再加上 --permanent 然後reload防火牆
2.1.7、 打開端口
查看所有打開的端口:

firewall-cmd --zone=public --list-ports

加入一個端口到區域:

firewall-cmd --zone=public --add-port=8080/tcp

若要永久生效方法同上
2.1.8、 打開一個服務
服務需要在配置文件中添加,/etc/firewalld 目錄下有services文件夾

firewall-cmd --zone=work --add-service=smtp

2.1.9、 移除服務

firewall-cmd --zone=work --remove-service=smtp

2.1.10、 輸出區域

輸出區域 <zone> 全部啓用的特性。如果省略區域,將顯示默認區域的信息。

firewall-cmd [–zone=<zone>] –list-all
[root@test zones]# firewall-cmd --list-all
public (default, active)
interfaces: eno16777736
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
[root@test zones]# firewall-cmd --zone=work --list-all
work
interfaces:
sources:
services: dhcpv6-client ipp-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
2.1.11、 獲取活動的區域
[root@test zones]# firewall-cmd --get-active-zones
work
interfaces: eno16777736
2.1.12、 根據接口獲取區域
firewall-cmd –get-zone-of-interface=<interface>
[root@test zones]# firewall-cmd --get-zone-of-interface=eno16777736
public

以下關於區域和接口的操作,就不一一舉例了,可以根據實際情況修改.

2.1.13、 # 將接口增加到區域
firewall-cmd [--zone=<zone>] --add-interface=<interface>

如果接口不屬於區域,接口將被增加到區域。如果區域被省略了,將使用默認區域。接口在重新加載後將重新應用。

2.1.14、 # 修改接口所屬區域
firewall-cmd [--zone=<zone>] --change-interface=<interface>

這個選項與 –add-interface 選項相似,但是當接口已經存在於另一個區域的時候,該接口將被添加到新的區域。

2.1.15、 # 從區域中刪除一個接口
firewall-cmd [--zone=<zone>] --remove-interface=<interface>
2.1.16、 # 查詢區域中是否包含某接口
firewall-cmd [--zone=<zone>] --query-interface=<interface>

注意:返回接口是否存在於該區域。沒有輸出。

2.1.17、 # 列舉區域中啓用的服務
firewall-cmd [ --zone=<zone> ] --list-services
2.1.18、 # 啓用應急模式阻斷所有網絡連接,以防出現緊急狀況
firewall-cmd --panic-off
2.1.19、 # 查詢應急模式
firewall-cmd --query-panic
提示:firewall-cmd --panic-on //關閉應急模式
firewall-cmd --panic-off和firewall-cmd --panic-on實際就是斷網和連網
3、 通過配置文件來使用Firewalld的方法
系統本身已經內置了一些常用服務的防火牆規則,存放在/usr/lib/firewalld/services/
注意:
請勿編輯/usr/lib/firewalld/services/ ,只有 /etc/firewalld/services 的文件可以被編輯。
3.1、 查看配置文件
[root@test ~]# ls /usr/lib/firewalld/services/
amanda-client.xml dhcpv6.xml high-availability.xml ipp-client.xml kpasswd.xml libvirt.xml mysql.xml pmcd.xml pop3s.xml RH-Satellite-6.xml smtp.xml tftp.xml
bacula-client.xml dhcp.xml https.xml ipp.xml ldaps.xml mdns.xml nfs.xml pmproxy.xml postgresql.xml rpc-bind.xml ssh.xml transmission-client.xml
bacula.xml dns.xml http.xml ipsec.xml ldap.xml mountd.xml ntp.xml pmwebapis.xml proxy-dhcp.xml samba-client.xml telnet.xml vnc-server.xml
dhcpv6-client.xml ftp.xml imaps.xml kerberos.xml libvirt-tls.xml ms-wbt.xml open***.xml pmwebapi.xml radius.xml samba.xml tftp-client.xml wbem-https.xml
3.2、 動態添加一條防火牆規則如下:
以下例子均以系統自帶的public zone 爲例子.
假設自定義的 ssh 端口號爲 12222,使用下面的命令來添加新端口的防火牆規則:
如果需要使規則保存到 zone 配置文件,則需要加參數 –permanent
舉例如下:
[root@test zones]# firewall-cmd --add-port=12222/tcp
success
[root@test zones]# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
</zone>
發現沒有寫到配置文件裏

[root@test zones]# firewall-cmd --add-port=12222/tcp --permanent
success
[root@test zones]# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
<port protocol="tcp" port="12222"/>
</zone>
已經寫到配置文件裏

注意:防火牆配置文件也可以手動修改,修改後記得重載(firewall-cmd --reload)

3.3、 開放80端口供外網訪問http服務
3.3.2、 將 http.xml複製到/etc/firewalld/services/下面,以服務形式管理防火牆,

這個cp命令其實是可以省略的,系統會優先去讀取 /etc/firewalld 裏面的文件,找不到則會去/usr/lib/firewalld/services/讀取.爲了方便修改和管理,建議複製到/etc/firewalld

[root@test ~]# cp /usr/lib/firewalld/services/http.xml /etc/firewalld/services/
[root@test ~]# ls /etc/firewalld/services/
http.xml
[root@test ~]# ls /etc/firewalld/zones/
public.xml public.xml.old
3.3.3、 修改public.xml,加入http服務
cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
<service name="http"/> # 這行是後加的,要匹配 /etc/firewalld/services/文件夾下的文件名
</zone>
3.3.4、 重新載入 兩條命令都可以的
以 root 身份輸入以下命令,重新加載防火牆,並不中斷用戶連接,即不丟失狀態信息:
[root@test ~]# firewall-cmd --reload
Success
3.4、 修改防火牆ssh的端口方法
3.4.5、 複製ssh.xml文件到/etc/firewalld/services/
[root@test ~]# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
3.4.6、 修改ssh.xml文件 12222爲ssh端口
[root@test ~]# cat /etc/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="12222"/>
</service>
3.4.7、 重新載入 兩條命令都可以的
以 root 身份輸入以下命令,重新加載防火牆,並不中斷用戶連接,即不丟失狀態信息:
[root@test ~]# firewall-cmd --reload
Success
3.5、 指定ip訪問ssh端口
修改/etc/firewalld/zones/

rule字段內爲要限制的ip和使用的服務

[root@test ~]# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<rule family="ipv4">
<source address="192.168.23.1"/>
<service name="ssh"/>
<accept/>
</rule>
</zone>
[root@test ~]# firewall-cmd --reload
Success
3.6、 添加自定義服務
舉例,添加8080端口爲新的Service
3.6.8、 添加新文件 8080.xml
cat /etc/firewalld/services/8080.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>8080 Test</short>
<description>此處爲文字說明</description>
<port protocol="tcp" port="8080"/>
</service>
3.6.9、 編輯public.xml 文件,加入相應的Server
cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
<service name="8080"/> # 這行是後加的,要匹配 /etc/firewalld/services/8080.xml 文件名
</zone>
3.6.10、 重新載入
[root@test ~]# firewall-cmd --reload
Success
Direct Rules:
3.7、 SNAT
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 你的公網ip
3.7.11、 DNAT
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A PREROUTING -d 173.16.16.1 -p tcp--dport 2346 -j DNAT --to-destination 192.168.10.2:22

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章