linux防火牆(一)


安全技術

 入侵檢測與管理系統IDS(Intrusion Detection Systems):特點是不阻斷任何網絡訪問,量化、定位來自內外網絡的威脅情況,主要以提供報告和事后監督為主,提供有針對性的指導措施和安全決策依據。一般采用旁路部署方式。

入侵防御系統IPS(Intrusion Prevention System):以透明模式工作,分析數據包的內容如:溢出攻擊、拒絕服務攻擊、木馬、蠕蟲、系統漏洞等進行准確的分析判斷,在判定為攻擊行為后立即予以阻斷,主動而有效的保護網絡的安全,一般采用在線部署方式。

防火牆( FireWall ):隔離功能,工作在網絡或主機邊緣,對進出網絡或主機的數據包基於一定的規則檢查,並在匹配某規則時由規則定義的行為進行處理的一組功能的組件,基本上的實現都是默認情況下關閉所有的通過型訪問,只開放允許訪問的策略。

防火牆的分類

防火牆的分類

(1)主機防火牆:服務范圍為當前主機
    網絡防火牆:服務范圍為防火牆一側的局域網
(2)硬件防火牆:在專用硬件級別實現部分功能的防火牆;另一個部分功能基於軟件實現,如:Checkpoint,NetScreen
    軟件防火牆:運行於通用硬件平台之上的防火牆的應用軟件
(3)網絡層防火牆:OSI模型下四層
    應用層防火牆/代理服務器:代理網關,OSI模型七層

網絡層防火牆

包過濾防火牆
網絡層對數據包進行選擇,選擇的依據是系統內設置的過濾邏輯,被稱為訪問控制列表(ACL),通過檢查數據流中每個數據的源地址,目的地址,所用端口號和協議狀態等因素,或他們的組合來確定是否允許該數據包通過
優點:對用戶來說透明,處理速度快且易於維護
缺點:無法檢查應用層數據,如病毒等

 

應用層防火牆

應用層防火牆/代理服務型防火牆(Proxy Service)
將所有跨越防火牆的網絡通信鏈路分為兩段
內外網用戶的訪問都是通過代理服務器上的“鏈接”來實現
優點:在應用層對數據進行檢查,比較安全
缺點:增加防火牆的負載

 

現實生產環境中所使用的防火牆一般都是二者結合體

即先檢查網絡數據,通過之后再送到應用層去檢查

iptables的基本認識

Netfilter組件

內核空間,集成在linux內核中
官網文檔:https://netfilter.org/documentation/
擴展各種網絡服務的結構化底層框架
內核中選取五個位置放了五個hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而這五個hook function向用戶開放,用戶可以通過一個命令工具(iptables)向其寫入規則
由信息過濾表(table)組成,包含控制IP包處理的規則集(rules),規則被分組放在鏈(chain)上

三種報文流向:

流入本機:PREROUTING --> INPUT-->用戶空間進程
流出本機:用戶空間進程 -->OUTPUT--> POSTROUTING
轉發:PREROUTING --> FORWARD --> POSTROUTING

訪問HTTPD服務時,需要對HTTPD服務進行安全控制:要求只能讓1號機器進行訪問,而2機器不能訪問?

最合理的設置位置就是在INPUT位置設置1機器允許訪問,2機器進行拒絕,而如果設置在prerouting位置時,如果機器2需要穿過linux router去到達另一個主機就無法到達,此配置不合理,如果配置在OUTPUT位置時,就會使HTTPD服務無法訪問右側的主機。

防火牆工具

iptables

命令行工具,工作在用戶空間
用來編寫規則,寫好的規則被送往netfilter,告訴內核如何去處理信息包

firewalld

CentOS 7 引入了新的前端管理工具

管理工具:

firewall-cmd 命令行
firewall-config 圖形

iptables的組成

iptables由五個表和五個鏈以及一些規則組成

五個表table:filter、nat、mangle、raw、security

filter表:過濾規則表,根據預定義的規則過濾符合條件的數據包
nat表:network address translation 地址轉換規則表
mangle:修改數據標記位規則表
raw:關閉NAT表上啟用的連接跟蹤機制,加快封包穿越防火牆速度
security:用於強制訪問控制(MAC)網絡規則,由Linux安全模塊(如SELinux)實現
優先級由高到低的順序為:security -->raw-->mangle-->nat-->filter

五個內置鏈chain

INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING

 Netfilter表和鏈對應關系 

 

 在linux中查看表有幾種類型的鏈,可以使用tab鍵補全查看鏈信息。

 數據包過濾匹配流程

 IPTABLES和路由

路由功能發生的時間點

報文進入本機后

      •判斷目標主機是否為本機
            是:INPUT
            否:FORWARD

報文離開本機之前

•判斷由哪個接口送往下一跳

內核中數據包的傳輸過程

內核中數據包的傳輸過程

當一個數據包進入網卡時,數據包首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去
如果數據包就是進入本機的,數據包就會沿着圖向下移動,到達INPUT鏈。數據包到達INPUT鏈后,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包經過OUTPUT鏈,然后到達POSTROUTING鏈輸出
如果數據包是要轉發出去的,且內核允許轉發,數據包就會向右移動,經過FORWARD鏈,然后到達POSTROUTING鏈輸出

iptables規則 

規則rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動作作出處理

匹配條件:默認為與條件,同時滿足

基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
擴展匹配:通過復雜高級功能匹配

處理動作:稱為target,跳轉目標

內建處理動作:ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG...
自定義處理動作:自定義chain,利用分類管理復雜情形

規則要添加在鏈上,才生效;添加在自定義上不會自動生效

鏈chain:
    內置鏈:每個內置鏈對應於一個鈎子函數
    自定義鏈:用於對內置鏈進行擴展或補充,可實現更靈活的規則組織管理機制;只有Hook鈎子調用自定義鏈時,才生效

iptables添加要點

iptables規則添加時考量點

 要實現哪種功能:判斷添加在哪張表上
 報文流經的路徑:判斷添加在哪個鏈上
 報文的流向:判斷源和目的
 匹配規則:業務需要

實驗環境准備:

Centos7:

systemctl stop firewalld.service
systemctl disable firewalld. service

Centos6:

service iptables stop
chkconfig iptables off

查看防火牆規則是否清干凈?此時沒有清干凈,是因為有虛擬網卡存在導致(virbr0驅動存在,需要卸載)

[root@centos777~]#iptables -vnL   查看表所有鏈內容,還有其他部分信息
Chain INPUT (policy ACCEPT 1289 packets, 127K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
    0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
    0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
    0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
    0     0 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 1018 packets, 103K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     udp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:68
[root@centos777~]#ip a  可以看到有virbr0的虛擬網卡驅動
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:f4:9f:15 brd ff:ff:ff:ff:ff:ff
    inet 192.168.34.102/24 brd 192.168.34.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fef4:9f15/64 scope link 
       valid_lft forever preferred_lft forever
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:9d:62:0a brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:9d:62:0a brd ff:ff:ff:ff:ff:ff

卸載虛擬網卡驅動,卸載完之后LINUX系統重新啟動

[root@centos777~]#yum remove libvirt-daemon -y
[root@centos777~]#reboot

此時查看防火牆情況,已經全部清空。

iptables命令

man 8 iptables
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]

簡單示例  

Filter表中INPUT規則

規則格式:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]

-t table:

 raw, mangle, nat, [filter]默認

SUBCOMMAND:

  1、鏈管理:

-N:new, 自定義一條新的規則鏈
-X:delete,刪除自定義的空的規則鏈
-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:
ACCEPT:接受
DROP:丟棄
-E:重命名自定義鏈;引用計數不為0的自定義鏈不能夠被重命名,也不能被刪除

示例:

A主機:192.168.34.101

B主機:192.168.34.102

(1)在A主機設置防火牆功能,丟棄掉B主機的訪問信息

[root@centos7]#iptables -t filter -A INPUT -s 192.168.34.102 -j DROP

(2)在B主機pingA主機,此時無反應,可以懷疑是A主機配置規則問題

[root@centos777~]#ping 192.168.34.101
PING 192.168.34.101 (192.168.34.101) 56(84) bytes of data.

(3)在A主機開始進行抓包排錯,可以看到只有B主機pingA主機的信息,沒有A主機返回B主機的信息,說明是A主機的配置問題;如果B主機PING的時候A主機未收到,就是中間網絡問題,可以判斷問題出在哪里

[root@centos7network-scripts]#tcpdump -i ens33 -nn host 192.168.34.102    此時只可以看到只有B主機Ping到A主機的信息,沒有A主機到B主機的信息,就可以懷疑是B主機設置規則問題
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
14:45:54.717118 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 197, length 64
14:45:55.717241 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 198, length 64
14:45:56.717162 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 199, length 64
14:45:57.717258 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 200, length 64
14:45:58.717378 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 201, length 64

(4)已經排查出是A主機規則問題,沒有返回給B主機內容,清空A主機的防火牆規則

[root@centos7network-scripts]#iptables -F

(5)此時B主機就可以ping通

[root@centos777~]#ping 192.168.34.101
PING 192.168.34.101 (192.168.34.101) 56(84) bytes of data.
64 bytes from 192.168.34.101: icmp_seq=721 ttl=64 time=0.721 ms
64 bytes from 192.168.34.101: icmp_seq=722 ttl=64 time=0.429 ms
64 bytes from 192.168.34.101: icmp_seq=723 ttl=64 time=0.477 ms
64 bytes from 192.168.34.101: icmp_seq=724 ttl=64 time=0.630 ms
64 bytes from 192.168.34.101: icmp_seq=725 ttl=64 time=0.424 ms

2、查看:

-L:list, 列出指定鏈上的所有規則,本選項須置后
-n:numberic,以數字格式顯示地址和端口號
-v:verbose,詳細信息
-vv 更詳細
-x:exactly,顯示計數器結果的精確值,而非單位轉換后的易讀值
--line-numbers:顯示規則的序號

常用組合:

-vnL
-vvnxL --line-numbers
-S selected,以iptables-save 命令格式顯示鏈上規則

3、規則管理:

-A:append,追加
-I:insert, 插入,要指明插入至的規則編號,默認為第一條
-D:delete,刪除
(1) 指明規則序號
(2) 指明規則本身
-R:replace,替換指定鏈上的指定規則編號
-F:flush,清空指定的規則鏈
-Z:zero,置零

iptables的每條規則都有兩個計數器

     (1) 匹配到的報文的個數

     (2) 匹配到的所有報文的大小之和

chain:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

示例:

(1)定義三條防火牆規則

[root@centos7~]#iptables -A INPUT -s 192.168.34.102 -j REJECT
[root@centos7~]#iptables -A INPUT -s 192.168.34.100 -j REJECT
[root@centos7~]#iptables -A INPUT -s 192.168.34.103 -j REJECT

(2)刪除第一條規則

[root@centos7~]#iptables -vnL --line-numbers  查看防火牆規則全部信息
Chain INPUT (policy ACCEPT 76 packets, 5484 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     all  --  *      *       192.168.34.102       0.0.0.0/0            reject-with icmp-port-unreachable
2        0     0 REJECT     all  --  *      *       192.168.34.100       0.0.0.0/0            reject-with icmp-port-unreachable
3        0     0 REJECT     all  --  *      *       192.168.34.103       0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 49 packets, 5340 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
[root@centos7~]#iptables -D  INPUT  1   刪除第一條規則
[root@centos7~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 5 packets, 356 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     all  --  *      *       192.168.34.100       0.0.0.0/0            reject-with icmp-port-unreachable
2        0     0 REJECT     all  --  *      *       192.168.34.103       0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4 packets, 416 bytes)
num   pkts bytes target     prot opt in     out     source               destination   

 (3)插入一個防火牆規則,默認插入到第一條規則上

[root@centos7~]#iptables -I INPUT -s 192.168.34.105 -j REJECT
[root@centos7~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 50 packets, 3648 bytes)
num pkts bytes target prot opt in out source destination 
1 0 0 REJECT all -- * * 192.168.34.105 0.0.0.0/0 reject-with icmp-port-unreachable   192.168.34.105禁止的規則在第一條
2 0 0 REJECT all -- * * 192.168.34.100 0.0.0.0/0 reject-with icmp-port-unreachable
3 0 0 REJECT all -- * * 192.168.34.103 0.0.0.0/0 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 34 packets, 3040 bytes)
num pkts bytes target prot opt in out source destination 

(4)追加一條防火牆規則,默認加在最后一條

[root@centos7~]#iptables -A INPUT -s 192.168.34.8 -j REJECT
[root@centos7~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 53 packets, 4044 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     all  --  *      *       192.168.34.105       0.0.0.0/0            reject-with icmp-port-unreachable
2        0     0 REJECT     all  --  *      *       192.168.34.100       0.0.0.0/0            reject-with icmp-port-unreachable
3        0     0 REJECT     all  --  *      *       192.168.34.103       0.0.0.0/0            reject-with icmp-port-unreachable
4        0     0 REJECT     all  --  *      *       192.168.34.8         0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 38 packets, 3512 bytes)
num   pkts bytes target     prot opt in     out     source               destination  

  插入到指定的編號,默認的編號1會自動下調,將訪問頻次高的放前面,此項比較重要,如果192.168.34.0/24網段被拒絕,就無法遠程連接,加上此選項:windows遠程就能連接

[root@centos7~]#iptables -I INPUT 1 -s 192.168.34.1 -j ACCEPT

  替換之前寫錯指定編號的內容,可以重新寫

[root@centos7~]#iptables -R INPUT 2 -s 192.168.34.8 -j REJECT

 清空計數規則

[root@centos7~]#iptables -Z INPUT

匹配條件

基本:通用的,PARAMETERS
擴展:需加載模塊,MATCH EXTENTIONS

1、基本匹配條件:無需加載模塊,由iptables/netfilter自行提供

[!] -s, --source address[/mask][,...]:源IP地址或范圍
[!] -d, --destination address[/mask][,...]:目標IP地址或范圍
[!] -p, --protocol protocol:指定協議,可使用數字如0(all)
protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or“all“

參看:/etc/protocols

[!] -i, --in-interface name:報文流入的接口;只能應用於數據報文流入環節,只應用於INPUT、FORWARD、PREROUTING鏈
[!] -o, --out-interface name:報文流出的接口;只能應用於數據報文流出的環節,只應用於FORWARD、OUTPUT、POSTROUTING鏈

示例:

(1)一次可以插入兩條規則

[root@centos7~]#iptables -I INPUT 3 -s 192.168.34.8,192.168.34.45 -j REJECT  插入了一個編號的規則,實際顯示的是兩個規則
[root@centos7~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 59 packets, 4232 bytes)
num pkts bytes target prot opt in out source destination 
1 0 0 REJECT all -- * * 192.168.34.105 0.0.0.0/0 reject-with icmp-port-unreachable
2 0 0 REJECT all -- * * 192.168.34.100 0.0.0.0/0 reject-with icmp-port-unreachable
3 0 0 REJECT all -- * * 192.168.34.45 0.0.0.0/0 reject-with icmp-port-unreachable  顯示3和4規則
4 0 0 REJECT all -- * * 192.168.34.8 0.0.0.0/0 reject-with icmp-port-unreachable
5 0 0 REJECT all -- * * 192.168.34.103 0.0.0.0/0 reject-with icmp-port-unreachable
6 0 0 REJECT all -- * * 192.168.34.8 0.0.0.0/0 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 39 packets, 3748 bytes)
num pkts bytes target prot opt in out source destination

 (2)全部拒絕訪問規則,允許規則內的IP地址訪問,生產中可以將不是公司內部的IP地址全部進行拒絕訪問,只允許指定的IP地址和lo回環網卡的IP地址訪問即可。

[root@centos7~]#iptables -A INPUT -s 192.168.34.1 -j ACCEPT  加入本地windows系統的IP地址,否則無法遠程連接
[root@centos7~]#iptables -A INPUT -s 192.168.34.102 -j ACCEPT
[root@centos7~]#iptables -A INPUT -s 192.168.34.101 -j ACCEPT
[root@centos777~]#iptables -A INPUT -j REJECT           拒絕所有的IP地址訪問,只有在規則內的IP地址才能訪問
[root@centos777~]#iptables -I INPUT 5 -s 192.168.34.102,127.0.0.1 -j ACCEPT  可以允許192.168.34.102和回環網卡訪問
[root@centos777~]#iptables -A INPUT -i lo -j ACCEPT    加上回環網卡IP地址,需要自己連接上,避免自己無法連接

   查看規則信息

[root@centos7~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      277 20776 ACCEPT     all  --  *      *       192.168.34.1         0.0.0.0/0           
2        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
3        1    67 ACCEPT     all  --  *      *       192.168.34.102       0.0.0.0/0           
4        1    67 ACCEPT     all  --  *      *       192.168.34.101       0.0.0.0/0           
5        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

(3)清除OUTPUT規則

[root@centos777~]#iptables -F OUTPUT

  

  

  

  

  

  

 

 

  

 

  

  

 

  

  

  

  

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM