firewalld 網絡端口安全詳細介紹
目錄:
* 1.firewald ---firewalld 服務
* 2.configuring a firewall---配置防火墻
* 3,managing rich rules---管理富規則
* 4,masquerade and port forwarding---偽裝和端口轉發
* 5,forwarding a port --端口映射
* 6,adding custom firewalld zone and services--添加自定義zone和服務
* 7,managing SElinux port labeling---管理selinux 端口標簽
1.firewalld
firealld 和iptables 都是規則生成工具,真正的是生效的是基於內核上netfilter.
firewalld 的規則最終要轉化成iptables規則。至於iptables工作原理不做介紹。
firewalld 具有特點:動態防火墻守護進程,具有主流防火墻zone的定義,支持ipv4和ipv6防火墻設置。
解釋:動態防火墻:支持運行時配置,能立即生效。(iptables必須重啟服務),還支持狀態跟蹤。
雖然iptables也支持狀態跟蹤,iptables 是基於模板的定義的狀態跟蹤。
解釋:zone:規則的集合
firewalld 配置文件(自定義zone會詳講) firewalld配置文件以xml格式為主(除了fireealld.conf)文件目錄位置 1,/etc/firewalld/ 2,/usr/lib/firewalld/
重點:當我們定義了多個zone.如果流量進來,是如何處理的?處理流程
1,如果進來的流量的源地址,被一個zone定義的源地址規則匹配,
那麽這個流量被這個zone所處理。(源地址優先級最高)
2,如果進來的流量通過一個接口,那麽流量將會被接口所定義的zone處理。 (接口次之)
3,如果流量沒有被源地址和接口匹配,將會被默認zone處理(優先級最低,系統默認zone=public)
註解:首先查找數據流量的源地址,如果源地址被drop或者block這兩個zone的源地址規則匹配。則不會再去找數據流入接口。
如果數據的流量的源地址,沒有被定義被drop和block 兩個zone的源地址規則匹配,而是被其它zone的源地址匹配,
如果數據流量的接口,被drop或者block這兩個zone的接口匹配,
則不會交給默認zone處理
如果沒有找到對應的服務。數據流量會去找接口所在的zone中的服務,
如果找到相應的服務,即能完成訪問,如果接口沒有找到對應的服務,
那麽會交給默認zone來處理。及時有對應的服務也是拒絕訪問。
實驗環境:
物理主機,兩臺vm虛擬機,系統為redhat7.
物理主機的ip地址為192.168.0.111
(下面就稱:防火墻)一臺虛擬主機模擬防火墻設置兩塊網卡:一塊設置為橋接類型,
模擬外網地址:192.168.0.200/24 gw:192.168.0.1 dns 8.8.8.8
第二塊為hostonly,模擬內網地址:192.168.10.11/24 網關可以不用配置
第二臺虛擬主機模擬內網設置一塊網卡:網卡類型為hostonly:
地址為192.168.10.13/24 gw:192.168.10.11 必須和firewall內網在同一個vmnet中。
在防火墻配置一個ftp服務。
先打開防火墻的轉發功能。
echo 1 > /proc/sys/net/ipv4/ip_forward ---零時生效。
編輯:/usr/lib/sysctl.d/00-system.conf
添加 net.ipv4.ip_forward = 1
sysctl -p /usr/lib/sysctl.d/00-system.conf 重新加載配置文件,可以永久有效
firewalld默認有9個zone(zone是firewalld的單位)
默認zone為public
drop(丟棄):任何接受的網絡數據包都被丟棄,沒有任何回復,
僅能有發送出去的網絡連接(數據包不能進來,但是可以出去)
block(限制):任何接受的網絡連接都被IPv4的icmp-host-prohibited信息和IPv6的icmp6-adm-prohibited信息所拒絕。(和drop相比,比較寬松一些,主要是為了針對icmp)
piblic(公共):在公共區域內使用,不能相信網絡內其他計算機不會對你造成危害,只能接受經過選取的連接。
external(外部):特別是為路由器啟用了偽裝功能的外部網,你不能信任來自網絡的其他計算,不能相信他們不會對你造成傷害,只能接受經過選擇的連接。
dmz(非軍事區):用於你的非軍事區內的電腦,此區域可公開訪問,可以有限的進入你的內部網絡,僅僅接受經過選擇的連接。
work(工作):用於工作區,你可以基本信任網絡內的其他電腦不會對你造成危害,僅僅接收經過選擇的連接。
home(家庭):用於內部網絡,你可以基本上信任網絡內其他電腦不會對你造成危害,僅僅接收經過選擇的連接。
internal(內部):用於內部網絡,你可以基本上信任網絡內其他電腦不會對你造成危害,僅僅接收經過選擇的連接。
trusted(信任):可接受所有的網絡連接。
firewalld 和iptables,ip6tables,ebtables 不能同時使用,我們寫個腳本禁用它們
#!/bin/bash
for i in iptable ip6tables ebtables ;do
systemctl stop $i
systemctl disable $i
systemctl mask $i
done
2.configuring a firewall---配置防火墻
systemctl start firewalld 啟動防火墻
systemctl enable firewalld 開機自啟動
systemctl disable firewalld 關閉開機自啟動
systemctl status firewalld 查看狀態
systemctl stop firewalld 停止防火墻
systemctl mask firewalld 屏蔽防火墻
systemctl unmask firewalld 關閉屏蔽防火墻
firewall-cmd 命令的使用 (下面的xx表示上面九個zone中的一個)
firewall-cmd --version 查看版本號
firewall-cmd --help 查看幫助
firewall-cmd 查看狀態
firewall-cmd --get-active-zones 查看活動的zone
什麽是active-zone 即:有source(源地址)或interface(有接口)的zone
# firewall-cmd --get-active-zones
home
interfaces: eno33554992
work
sources: 192.168.0.0/24
public
interfaces: eno16777736
firewall-cmd --reload 不停止服務,重新加載配置文件。
firewall-cmd --get-default-zone 查看默認zone
firewall-cmd --set-default-zone= 修改默認zone
firewall-cmd --get-zone-of-interface=eno16777736 查看指定接口屬於哪個zone
firewall-cmd --list-all 查看默認zone信息
firewall-cmd --list-all --zone=xx 查看指定zone信息
firewall-cmd --list-all-zones 查看所有zone的信息
firewall-cmd --list-interfaces 查看默認zone的接口 可以指定--zone=xxx
firewall-cmd --list-ports 查看默認zone的端口 可以指定--zone=xx
firewall-cmd --list-services 查看默認zone的服務 可以指定--zone=xx
firewall-cmd --zone=xx --change-interface=eno16777736 將指定接口轉移到xxzone
------------------------------------------------------
firewall-cmd --add-source=xxx.xxx.xxx.xxx 在默認zone中添加源地址 如果換zone可以加--zone=xx
firewall-cmd --add-interface=eno16777736 在默認zone中添加一個接口,如果換zone可以加--zone=xx
firewall-cdm --add-port=portnumber/[tcp|udp]在默認zone中添加一個端口,如果換zone可以加--zone=xx
firewall-cdm --add-service=servername 在默認zone中添加一個服務。如果還zone可以加--zone
firewall-cmd --remove-source=xxx.xxx.xxxx.xxx 移除默認zone 中的源地址。可以指定--zone=xx
firewall-cmd --remove-interface=eno16777736 移除默認zone中的接口,可以指定--zone=xx
firewall-cmd --remove-port=portnumber/[tcp|udp] 移除默認zone中的端口 可以指定--zone=xx
firewall-cmd --remove-service=servername 移除默認zone 中的服務,可以指定--zone=xx
firewall-cmd --add-rich-rule ‘‘ 添加富規則 可以指定--zone=xx
firewall-cmd --remove-rich-rule ‘‘ 刪除富規則 可以指定--zone=xx
firewall-cmd --add-forward-port 添加端口映射 可以指定--zone=xx
以上的命令都可以接--permanent 表示永久生效。但必須要firewall-cmd --reload
3,managing rich rules---管理富規則
富規則;提供了log,地址偽裝,端口轉發,速率限制。是規則更加精細化
富規則的處理順序:
端口轉發和偽裝 優先
log 日誌 次之
允許 再次之
拒絕 最低
添加富規則的語法:firewall-cmd [--zone=xx] [--permanent] --add-rich-rule
‘rule [family="rule family"]
[ source [NOT] [address="address"] [mac="mac-address"] [ipset="ipset"] ]
[ destination [NOT] address="address" ]
[ element ]
[ log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"] ]
[ audit ]
[ action ]‘
解釋:‘‘規則是用單引號包裹的
rule 關鍵字
[family="ipv4"後者"ipv6"]
[source 關鍵字 address=xxx.xxx.xxx.xxx [mac="mac-address"]]
[ destination 關鍵字 address="address" ]
Elements:元素
The element can be only one of the following element types: service, port, protocol, masquerade, icmp-block, forward-port, and source-port.
元素類型只可能是這其中的一種:service, port, protocol, masquerade, icmp-block, forward-port, source-port.
service name=service_name
服務的表示法
port port=number_or_range protocol=protocol
端口的表示法,必須要跟協議
protocol value=protocol_name_or_ID
端口的值表示法
icmp-block name=icmptype_name
icmp 類型
forward-port port=number_or_range protocol=protocol /
to-port=number_or_range to-addr=address
本機端口轉發的表示法
source-port port=number_or_range protocol=protocol
源端口的表示法
log [prefix=prefix text] [level=log level] limit value=rate/duration
日誌記錄的表示發
ferfix=text 表示;標識符
level:日誌記錄的級別
limit:限制(關鍵字)
value=值(速率)
action:
accept | reject [type=reject type] | drop | mark set="mark[/mask]"
accept:通過
reject:拒絕
drop:丟棄
mask set= 打標記(集群服務會用到)
例子,以下的例子都是在默認zone為public。接口interface 也是在public zone中,其它zone沒有定義源地址。
1,添加一條富規則,禁止源地址為192.168.0.111的主機訪問
#firewall-cmd --add-rich-rule ‘rule family="ipv4" source address="192.168.0.111/32" drop‘
2,刪除已有的富規則,先用firewall-cmd --list-all 查看規則。在用firewall-cmd --remove-rich-rule‘規則‘
` # firewall-cmd --remove-rich-rule ‘rule family="ipv4" source address="192.168.0.111/32" drop‘``
3,添加一條富規則,禁止源地址為192.168.0.0/24網段的地址,訪問22端口
# firewall-cmd --add-rich-rule
‘rule family=ipv4 source address=192.168.0.0/24 port port=22 protocol=tcp reject‘
4,添加一條富規則。禁止所有的tcp連接
`firewall-cmd --add-rich-rule ‘rule family=ipv4 protocol value=tcp reject‘`
5,添加一條富規則,禁止源地址為192.168.0.0/24網段的地址,訪問ssh服務
`#firewall-cmd --add-rich-rule ‘rule family=ipv4 source address=192.168.0.0/24 service name=ssh reject‘`
6,添加一條富規則,顯示ftp每分鐘只接受兩個新連接。
`#firewall-cmd --add-rich-rule ‘rule family=ipv4 service name=ftp limit value=2/m accept‘ `
4,masquerade and port forwarding---偽裝和端口轉發
什麽時候要用masquerade:當我們只有一個公網地址,內網主機需要上網的時候。
1,添加端口偽裝,是後端(192.168.10.13)的主機能夠訪問互聯網。
firewall-cmd --add-masquerade --permanent -----必須先添加偽裝
firewall-cmd --add-rich-rule ‘rule family=ipv4 source address=192.168.10.13/32 masquerade‘ --permanent
firewall-cmd --reload
什麽時候,需要用用到端口轉發,比如說,httpd我們定義了一個非標準的端口(8009),可以把80端口訪問都轉發到那個非標準端口
2,本機的端口轉發。來至192.168.0.0/24的主機訪問端口443,都把流量轉發到端口22上去。
```firewall-cmd --zone=public --permanent --add-rich-rule
‘rule family="ipv4" source address="192.168.0.0/24" forward-port port="443" protocol="tcp" to-port="22"‘
firewall-cmd --reload
## 5,forwarding a port --端口映射
端口映射語法:
` firewall-cmd --add-forward-port=port=xx:proto=[tcp|dup]:toport=xx:toaddr`
什麽時候能用帶端口映射,外網用戶想訪問內網的主機。
1,把防火墻的80端口,映射到後端192.168.10.13的80端口上(註意,要關閉防火墻上的httpd服務,後端主機防火墻要開放http)
```#firewall-cmd --add-masquerade --permanent
##firewall-cmd --add-forward- port=port=80:proto=tcp:toport=80:toaddr=192.168.10.13 --permanent
#firewall-cmd --reload
6,adding custom firewalld zone and services--添加自定義zone和服務
firewalld配置文件以xml格式為主(除了fireealld.conf)文件目錄位置
1,/etc/firewalld/
2,/usr/lib/firewalld/
如果修改配置文件的話,/usr/lib/firewalld/下的文件不能修改,可以復制到/etc/firewalld/對應目錄下進行修改。
運行時用到的配置文件為/etc/firewalld/目錄下文件
6.1,自定義zone
我們來看一下/etc/firewalld/zone/public.xml的語法格式
-----------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?> ---定義xml使用的版本和字符集類型
<zone> ---用<zone>xxx</zone>封裝一個zone
<short>Public</short>---用<short></short>封裝zone的名字
<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> --用<description></description>封裝表述信息
<interface name="eno33554992"/>----用<interface></interface> 封裝接口的名字
<service name="dhcpv6-client"/>用一個<service name=""> 表示一個服務
<service name="ssh"/>
<rule family="ipv4"> ---用<rule></rule>封裝規則
<source address="192.168.10.13/32"/>---裏面規則語句
<masquerade/>
</rule>
</zone>
------------------------------------------------------------------------
添加自定義zone方法:
創建一個zone模板3種方法:
1,` firewall-cmd --permanent --new-zone=xx` 用命令創建模板
2 ,` cp /usr/lib/firewalld/zone/public.xml /etc/firewalld/zone/xx.xml `
復制創建模板,需要修改裏面的<short>xx</short>.
3,圖形界面添加一個zone
至於配置規則和系統自帶的9個zone沒有區別,可以用命令或者圖形界面配置規則
也可以手動修改xx.xml文件添加規則
6.2 自定義服務
復制`/usr/lib/firewalld/service/http.mxl /etc/firewalld/service/xxx.mxl `我們看一下語法格式
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>WWW (HTTP)</short>
<description>HTTP is the protocol used to serve Web pages.
If you plan to make your Web server publicly available,
enable this option. This option is not required for viewing
pages locally or developing Web pages.</description>
<port protocol="tcp" port="80"/> --用一個<port protocol=xx port=xxx/> 定義一 個協議和端口
</service>
創建-個service模板的3種方法
1,`firewall-cmd --permanent --new-service=xx`
2,` /usr/lib/firewalld/service/http.mxl /etc/firewalld/service/xxx.mxl`
需要修改<short></short>添加需要的名字,修改<port protocol=xx port=xxx/>修改為自己所需要的協議和端口
3,圖形界面添加一個service
7,managing SElinux port labeling---管理selinux 端口標簽
selinux定義了一些安全的端口。通過selinux的定義的端口通信,selinux是放行的。
查看所有selinux開放的安全端口。 # semanage port -l
如果你定義的端口沒有在selinux定義安全端口中,則服務無法啟動,需要加進安全端口裏#semanage port -t -a PORT-TYPE -p [tcp|dup] portnumber
例如:semanage port -a -t http_port_t -p tcp 81
詳細請man semanage-port查看
花了一天多的時間,終於敲完了,純手動敲打,如果有問題請見諒。這是我看文檔,查資料總結的,如果有不對的地方希望大佬指點。
firewalld 網絡端口安全詳細介紹