防火牆
什么是防火牆?防火牆其實就是一個隔離的工具,工作於主機或者網絡的邊緣,對於進出本主機或者網絡的報文根據事先定義好的網絡規則做匹配監測。
防火牆可以簡單地划分為兩大類:主機防火牆 網絡防火牆
又可以分為:硬件防火牆、軟件防火牆。
對於軟件防火牆,如果設立匹配較多,速度會很慢。
硬件防火牆在硬件上處理遠超於軟件防火牆。
什么是防火牆?防火牆其實就是一個隔離的工具,工作於主機或者網絡的邊緣,對於進出本主機或者網絡的報文根據事先定義好的網絡規則做匹配監測。
防火牆可以簡單地划分為兩大類:主機防火牆 網絡防火牆
又可以分為:硬件防火牆、軟件防火牆。
對於軟件防火牆,如果設立匹配較多,速度會很慢。
硬件防火牆在硬件上處理遠超於軟件防火牆。
linux主要分為兩個部分:
內核空間——tcp/ip協議站共作在內核空間
用戶空間
防火牆firewalld——其中就有netfilter來過濾進出的報文。
四表五鏈:
表: filter nat mangle raw
應用優先級:raw>mangle>nat>filter
常用優先級:filter nat mangle raw
鏈:prerouting input forward output postrouting
各表中的鏈:
filter : INPUT FORWARD OUTPUT
nat:PREROUTING OUTPUT INPUT POSTROUTING
mangle:PREROUTING INPUT FORWARD OUTPUT POSTROUTING
raw:PREROUTING OUTPUT
firewalld是工作在liunx的內核空間之中的,那么我們用戶是無法直接對其進行操作的。所以liunx提供了一種工具來實現
用戶對於firewalld的網絡規則的操作,那就是iptables,iptables是用來調度內核中的表和鏈的。
filter : INPUT FORWARD OUTPUT
nat:PREROUTING OUTPUT INPUT POSTROUTING
mangle:PREROUTING INPUT FORWARD OUTPUT POSTROUTING
raw:PREROUTING OUTPUT
firewalld是工作在liunx的內核空間之中的,那么我們用戶是無法直接對其進行操作的。所以liunx提供了一種工具來實現
用戶對於firewalld的網絡規則的操作,那就是iptables,iptables是用來調度內核中的表和鏈的。
各表的功能:
filter:過濾,防火牆
nat:網絡地址轉換,network address translation
mangle:拆分報文,做出修改,封裝報文
raw:關閉nat表上啟用的連接追蹤機制
filter:過濾,防火牆
nat:網絡地址轉換,network address translation
mangle:拆分報文,做出修改,封裝報文
raw:關閉nat表上啟用的連接追蹤機制
添加規則的考量點:
1、要實現什么功能:判斷在哪張表上。
2、報文的流向的路徑:判斷在哪條鏈上。
[jerry@centos ~]$ sudo iptables -L -n
[sudo] jerry 的密碼:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
[sudo] jerry 的密碼:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
iptables工具:
-L:以列表的形式查看
-n:以數字形式顯示
-t:指定表
-P:指定鏈的默認規則
-F:清空所有的規則
-X:清除自定義鏈
-j:指定要執行的操作
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
DNAT:目標地址轉換
SNAT:源地址轉換
-A:append追加策略
-s:source源ip(可以是網段)
-d:destination源ip(可以是網段)
-I:insert插入策略
-p:protocol指定協議
--dport:指定目標端口
--sport:指定源端口
--line-num:顯示規則的行號
-D:按照行號刪除某鏈中的規則
-i:指定網卡interface
iptables -X #刪除自定義鏈
iptables -L -n
-L:以列表的形式查看
-n:以數字形式顯示
-t:指定表
-P:指定鏈的默認規則
-F:清空所有的規則
-X:清除自定義鏈
-j:指定要執行的操作
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
DNAT:目標地址轉換
SNAT:源地址轉換
-A:append追加策略
-s:source源ip(可以是網段)
-d:destination源ip(可以是網段)
-I:insert插入策略
-p:protocol指定協議
--dport:指定目標端口
--sport:指定源端口
--line-num:顯示規則的行號
-D:按照行號刪除某鏈中的規則
-i:指定網卡interface
iptables -X #刪除自定義鏈
iptables -L -n
iptables -t nat -L -n --line-number
內核工作在內存當中。關機就丟失數據,就需要重設,但是可以事先將規則寫到文件里。
對於firewalld是沒有進程的,集成在內核當中,開機防火牆就存在,只是使用與不使用的區別。
iptables-save > rules.txt #存儲規則到文件
iptables-restore < rules.txt #加載規則到四表五鏈
iptables -X #清除自定義的鏈
iptables -L -n
對於firewalld是沒有進程的,集成在內核當中,開機防火牆就存在,只是使用與不使用的區別。
iptables-save > rules.txt #存儲規則到文件
iptables-restore < rules.txt #加載規則到四表五鏈
iptables -X #清除自定義的鏈
iptables -L -n
filter表:過濾
iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -p icmp -j DROP #ping提示連接超時
iptables -L -n
iptables -F #清所有的規則
iptables -t filter -A INPUT -s 192.168.27.0/24 -d 192.168.27.20 -p icmp -j REJECT #ping提示無法連接到端口
iptables -t filter -A INPUT -s 0.0.0.0 -d 192.168.27.20 -p icmp -j REJECT #決絕所有ip來ping本主機
iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -p icmp -j DROP #ping提示連接超時
iptables -L -n
iptables -F #清所有的規則
iptables -t filter -A INPUT -s 192.168.27.0/24 -d 192.168.27.20 -p icmp -j REJECT #ping提示無法連接到端口
iptables -t filter -A INPUT -s 0.0.0.0 -d 192.168.27.20 -p icmp -j REJECT #決絕所有ip來ping本主機
拒絕訪問本主機的web服務:
iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
iptables -t filter -A OUTPUT -p tcp --sport 80 -j DROP
iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
iptables -t filter -A OUTPUT -p tcp --sport 80 -j DROP
iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -p tcp --dport 80 -j REJECT
使用:telnet 192.168.27.20 80
iptables -t filter -P INPUT DROP
使用:telnet 192.168.27.20 80
iptables -t filter -P INPUT DROP
ssh遠程連接也是通過tcp協議:
iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -p tcp --dport 22 -j ACCEPT
iptables -L -n
iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -p tcp --dport 22 -j ACCEPT
iptables -L -n
-i——指定網卡:
iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -i ens33 -p icmp -j REJECT
iptables -t filter -A OUPUT -s 192.168.27.20 -d 192.168.27.1 -o ens33 -p icmp -j REJECT
iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -i ens33 -p icmp -j REJECT
iptables -t filter -A OUPUT -s 192.168.27.20 -d 192.168.27.1 -o ens33 -p icmp -j REJECT
iptables -t filter -A INPUT -i ens33 -p icmp -j DROP
iptables -t filter -A OUTPUT -o ens33 -p icmp -j REJECT
iptables -t filter -A OUTPUT -o ens33 -p icmp -j REJECT
iptables -L -n --line-num #顯示規則的行號,便於刪除
iptables -t filter -D INPUT 2 #刪除filter表上INPUT鏈上的2號規則
iptables -t filter -D INPUT 2 #刪除filter表上INPUT鏈上的2號規則
nat表:地址轉換
#開啟ipforward的核心轉發功能
臨時性:
echo 1 > /proc/sys/net/ipv4/ip_forward
永久性:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
使用Sysctl -p來生效
#源地址為192.168.20.2的主機地址經過防火牆都轉換成172.16.100.1這個地址(snat——源地址轉換)
iptables -t nat -A POSTROUTING -s 192.168.20.2 -d 172.16.100.2 -j SNAT --to-source 172.16.100.1
#訪問目標地址為172.16.100.1的這個機器並且是tcp協議80端口都轉發給192.168.20.2的80端口(dnat——目標地址轉化)
iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --deport 80 -j DNAT --to-destination 192.168.20.2:80
#訪問目標地址為172.16.100.1的這個機器並且是tcp協議80端口都轉發給192.168.20.2的8080端口(dnat——目標地址轉化)
iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --deport 80 -j DNAT --to-destination 192.168.20.2:8080
#開啟ipforward的核心轉發功能
臨時性:
echo 1 > /proc/sys/net/ipv4/ip_forward
永久性:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
使用Sysctl -p來生效
#源地址為192.168.20.2的主機地址經過防火牆都轉換成172.16.100.1這個地址(snat——源地址轉換)
iptables -t nat -A POSTROUTING -s 192.168.20.2 -d 172.16.100.2 -j SNAT --to-source 172.16.100.1
#訪問目標地址為172.16.100.1的這個機器並且是tcp協議80端口都轉發給192.168.20.2的80端口(dnat——目標地址轉化)
iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --deport 80 -j DNAT --to-destination 192.168.20.2:80
#訪問目標地址為172.16.100.1的這個機器並且是tcp協議80端口都轉發給192.168.20.2的8080端口(dnat——目標地址轉化)
iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --deport 80 -j DNAT --to-destination 192.168.20.2:8080
如果將IPFORWARD鏈上的轉發功能給關掉就無法實現了。
iptables -P IPFORWARD DROP
iptables -P IPFORWARD DROP
iptables -t nat -A POSTROUTING -s 192.168.20.2 -d 172.16.100.2 -p tcp --dport 80 -j SNAT --to-source 172.16.100.1
iptables -t nat -A PREROUTING -s 172.16.100.2 -d 172.16.100.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.20.2:9999
iptables -t nat -A PREROUTING -s 172.16.100.2 -d 172.16.100.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.20.2:9999
iptables -t nat -L -n #查看兩條鏈上的規則
系統的擴展方式:
scale up:向上擴展
scale out:向外擴展
也即是走質量或者走數量。
集群類型:LB HA
LB集群的實現:
硬件:FS Redware
軟件:lvs haproxy nginx
基於工作協議層划分:
傳輸層:
lvs:工作在內核空間之中,屬於四層LB。
haproxy:1、mode tcp,如果工作在應用層,只能調度http協議。如果基於tcp協議他能夠調度https,mysql等常用的tcp協議。
2、haproxy只是模擬tcp協議,因為tcp協議工作在內核之中,而haproxy屬於應用程序工作在第七層,是工作在某個套接字上的應用程序。
應用層:
haproxy lvs
LVS
linux virtual server
工作在input鏈上的,lvs接受報文轉發的流程:PREROUTING —— INPUT —— POSTROUTING
用戶空間使用ipvsadm定義轉發規則,通過系統調用將規則發送給內核中的ipvs
Lvs——處理並發上不封頂
Haproxy——最多處理並發3萬
Nginx——微線程,io處理切換,一遇見io就切換
lvs術語:
調度器——director server(DS)
后端真實處理服務器——Real server (RS)
client ip —— CIP
Director virtual ip —— VIP
director ip —— DIP
Real server ip —— RIP
ipvs工作原理:
報文從PREROUTING進入,按正常順序流入INPUT鏈,lvs工作在INPUT鏈上,根據所匹配的規則,符合規則的報文會被LVS強行拉到POSTROUTING鏈上
然后根據規則流通出去。
lvs的模式:
lvs-nat(其實就是一個DNAT)
lvs-dr(direct routing)
lvs-tun(ip tunneling)
lvs-nat:多目標的DNAT,通過修改請求報文的ip和端口至挑選出來的某個RS的RIP地址來實現轉發。
特點: 1、RIP應該和DIP使用私網地址,且RS的網關應該指向DIP。
2、請求和響應報文都要經過director server,因此在並發量較高的情況下,director server有可能成為瓶頸。
3、支持端口映射。
4、RS可以是任意的OS。
5、RS的RIP和director的DIP必須在同一個網段。
特點: 1、RIP應該和DIP使用私網地址,且RS的網關應該指向DIP。
2、請求和響應報文都要經過director server,因此在並發量較高的情況下,director server有可能成為瓶頸。
3、支持端口映射。
4、RS可以是任意的OS。
5、RS的RIP和director的DIP必須在同一個網段。
lvs-dr:路由模式
交換機通過mac地址尋址的方式來找主機。
通過修改請求報文的目標mac地址進行轉發。
特點:1、保證前端路由器將目標ip為vip的請求發送給director server
解決方案:靜態綁定 arptables 修改RS的內核參數
2、RS和DS必須在同一個物理網絡之中。
3、請求報文經過director調度,但是響應報文一定不能經過director
4、不支持端口映射
5、RS可以是大多數的OS
6、RS的網關不能指向DIP
lvs支持的算法:
靜態方法:依據算法本身進行調度
RR:round robin輪調
WRR:weighted RR
SH:source hash,實現session保持的機制
DH:destination hash ,將同一個目標的請求始終發往同一個RS
動態方法:gun算法以及各RS的當前負載情況進行調度
LC:least connection
overhead=active*256+inactive
WLC:weighted LC
overhead=(active*256+inactive)/weighted
overhead較小的即為被挑選的主機
SED LBLC LBLCR
lvs—nat模式配置:
網絡環境說明:
DS:外網網卡和內網網卡
外網網卡:192.168.27.10
255.255.255.0
192.168.27.1
內網網卡:172.16.100.1
255.255.255.0
RS1:網關指向DS的內網網卡
172.16.100.10
255.255.255.0
172.16.100.1
RS2:網關指向DS的內網網卡
172.16.100.20
255.255.255.0
172.16.100.1
安裝lvs:yum install ipvsadm -y
DS開啟路由轉發模式:
臨時性:
echo 1 > /proc/sys/net/ipv4/ip_forward
永久性:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
使用Sysctl -p來生效
ipvsadm配置:
ipvsadm -A -t 192.168.27.10:80 -s rr
ipvasdm -a -t 192.168.27.10:80 -r 172.16.100.10 -m
ipvsadm -a -t 192.168.27.10:80 -r 172.16.100.20 -m
-A : 添加virtual server
-D : 刪除virtual server
-s :調度算法
-r :真實的real server
-m : nat模式
-t :tcp協議
ipvsadm也是工作在內核空間的,所以規則需要寫入文件:ipvsadm-save > a.txt 和iptables是類似的。
lvs—dr模式配置:
direct-server:192.168.27.20
real-server:192.168.27.30
real-server:192.168.27.40
#vip為虛擬服務ip
vip:192.168.27.250
direct-server:
yum install ipvsadm -y
direct-server:
ipvsadm -C #清除配置信息
ipvsadm -A -t 192.168.27.250:80 -s rr #-A為ADD -t為tcp -s rr 為輪調算法
#添加兩台real-server
ipvsadm -a -t 192.168.27.250:80 -r 192.168.27.30:80 -g
#-a為add -t:tcp -r:realserver -g為DR路由模式。
ipvsadm -a -t 192.168.27.250:80 -r 192.168.27.40:80 -g
#配置網卡的子網口為vip,ip地址為192.168.27.250
ifconfig ens33:0 192.168.27.250 broadcast 192.168.27.250 netmask 255.255.255.255 up
#添加路由(訪問192.168.27.250都走ens33:0這個網卡)
route add -host 192.168.27.250 dev ens33:0
real-server:
#在回環地址上配置服務ip(vip)
ifconfig lo:0 192.168.27.250 broadcast 192.168.27.250 netmask 255.255.255.255 up
#添加路由
route add -host 192.168.27.250 dev lo:0
arp_ignore:定義接受到ARP請求時的響應級別
0——默認,只要本地配置的有響應地址都給予回應
1——僅僅在目標IP是本地地址,並且是配置在請求進來的接口上的時候才給予響應
(僅在請求的目標地址配置請求到達的接口上的時候,才給予響應)
arp_announce:定義將自己的地址向外通告時的級別
0——默認,表示使用配置在任何接口的任何地址向外通告
1——盡量僅向目標網絡通告與其網絡匹配的地址
2——僅向與本地接口上地址匹配的網絡進行通告
#為了實現在訪問vip的時候direct-server響應,然后轉發給real-server,再由real-server回應並返回vip地址,需要執行以下配置:
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
#如果需要關閉這些功能
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
#備注
如果沒有ifconfig這個命令:yum install net-tools -y
配置多個虛擬ip——ens33:1 or ens33:2