目前市面上比較常見的有3、4層的防火墻,叫網絡層的防火墻,還有7層的防火墻,其實是代理層的網關。
三層的防火墻會在這層對源地址和目標地址進行檢測.
對于七層的防火墻,不管你源端口或者目標端口,源地址或者目標地址是什么,都將對你所有的東西進行檢查。
對于設計原理來講,七層防火墻更加安全,但是這卻帶來了效率更低。
iptables 是與最新的 3.5 版本 Linux 內核集成的 IP 信息包過濾系統。
如果 Linux 系統連接到因特網或 LAN、服務器或連接 LAN 和因特網的代理服務器, 則該系統有利于在 Linux 系統上更好地控制 IP 信息包過濾和防火墻配置。
防火墻在做信息包過濾決定時,有一套遵循和組成的規則,這些規則存儲在專用的信 息包過濾表中,而這些表集成在 Linux 內核中。
在信息包過濾表中,規則被分組放在我們所謂的鏈(chain)中。而netfilter/iptables IP 信息包過濾系統是一款功能強大的工具,可用于添加、編輯和移除規則。
雖然 netfilter/iptables IP 信息包過濾系統被稱為單個實體,但它實際上由兩個組件netfilter 和 iptables 組成。
netfilter(網絡過濾器) 組件也稱為內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。
iptables 組件是一種工具,也稱為用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。
在內核空間中選擇了5個位置,
1.內核空間中:從一個網絡接口進來,到另一個網絡接口去的
2.數據包從內核流入用戶空間的
3.數據包從用戶空間流出的
4.進入/離開本機的外網接口
5.進入/離開本機的內網接口
內核,是一個操作系統的核心。
提供操作系統的最基本的功能,是操作系統工作的基礎
負責管理系統的進程、內存、設備驅動程序、文件和網絡系統,決定著系統的性能和穩定性。
這五個位置也被稱為五個鉤子函數(hook functions),也叫五個規則鏈。
1.PREROUTING (路由前)
2.INPUT (數據包流入口)
3.FORWARD (轉發管卡)
4.OUTPUT(數據包出口)
5.POSTROUTING(路由后)
這是NetFilter規定的五個規則鏈,任何一個數據包,只要經過本機,必將經過這五個鏈中的其中一個鏈。
防火墻策略一般分為兩種,一種叫“通”策略,一種叫“堵”策略。
現在用的比較多個功能有3個:
1.filter 定義允許或者不允許的
2.nat 定義地址轉換的
3.mangle功能:修改報文原數據
iptables傳輸數據包的過程
當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。
如果數據包就是進入本機的,它就會沿著圖向下移動,到達INPUT鏈。數據包到了INPUT鏈后,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包會經過OUTPUT鏈,然后到達POSTROUTING鏈輸出。
如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過FORWARD鏈,然后到達POSTROUTING鏈輸出。
iptables的規則表和鏈:
表(tables)提供特定的功能,iptables內置了4個表,即filter表、nat表、mangle表和raw表,分別用于實現包過濾,網絡地址轉換、包重構(修改)和數據跟蹤處理。
鏈(chains)是數據包傳播的路徑,每一條鏈其實就是眾多規則中的一個檢查清單,每一條鏈中可以有一 條或數條規則。
當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。
如果滿足,系統就會根據 該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定義的默認策略來處理數據包。
Iptables采用“表”和“鏈”的分層結構。現在REHL5是四張表五個鏈。
規則表:
1.filter表——三個鏈:INPUT、FORWARD、OUTPUT
作用:過濾數據包? 內核模塊:iptables_filter.
2.Nat表——三個鏈:PREROUTING、POSTROUTING、OUTPUT
作用:用于網絡地址轉換(IP、端口) 內核模塊:iptable_nat
3.Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改數據包的服務類型、TTL、并且可以配置路由實現QOS 內核模塊:iptable_mangle(別看這個表這么麻煩,咱們設置策略時幾乎都不會用到它)
沒用4.Raw表——兩個鏈:OUTPUT、PREROUTING? (這個是REHL4沒有的,不過用的不多)
作用:決定數據包是否被狀態跟蹤機制處理? 內核模塊:iptable_raw
規則鏈:
1.INPUT——進來的數據包應用此規則鏈中的策略
2.OUTPUT——外出的數據包應用此規則鏈中的策略
3.FORWARD——轉發數據包時應用此規則鏈中的策略
4.PREROUTING——對數據包作路由選擇前應用此鏈中的規則(所有的數據包進來的時侯都先由這個鏈處理)
5.POSTROUTING——對數據包作路由選擇后應用此鏈中的規則(所有的數據包出來的時侯都先由這個鏈處理)
其實iptables只是Linux防火墻的管理工具而已,位于/sbin/iptables。真正實現防火墻功能的是 netfilter,它是Linux內核中實現包過濾的內部結構。
iptables的基本語法格式
iptables [-t 表名] 命令選項 [鏈名] [條件匹配] [-j 目標動作或跳轉]
表名、鏈名用于指定 iptables命令所操作的表和鏈
命令選項用于指定管理iptables規則的方式(比如:插入、增加、刪除、查看等);
條件匹配用于指定對符合什么樣 條件的數據包進行處理;
目標動作或跳轉用于指定數據包的處理方式(比如允許通過、拒絕、丟棄、跳轉(Jump)給其它鏈處理)。
iptables命令的管理控制選項
-A 在指定鏈的末尾添加(append)一條新的規則
-D 刪除(delete)指定鏈中的某一條規則,可以按規則序號和內容刪除
-I 在指定鏈中插入(insert)一條新的規則,默認在第一行添加
-R 修改、替換(replace)指定鏈中的某一條規則,可以按規則序號和內容替換
-L 列出(list)指定鏈中所有的規則進行查看
-E 重命名用戶定義的鏈,不改變鏈本身
-F 清空(flush)
-N 新建(new-chain)一條用戶自己定義的規則鏈
-X 刪除指定表中用戶自定義的規則鏈(delete-chain)
-P 設置指定鏈的默認策略(policy)
-Z 將所有表的所有鏈的字節和數據包計數器清零
-n 使用數字形式(numeric)顯示輸出結果
-v 查看規則表詳細信息(verbose)的信息
-V 查看版本(version)
-h 獲取幫助(help)
防火墻處理數據包的四種方式
ACCEPT 允許數據包通過
DROP 直接丟棄數據包,不給任何回應信息
REJECT 拒絕數據包通過,必要時會給數據發送端一個響應的信息。
LOG在/var/log/messages文件中記錄日志信息,然后將數據包傳遞給下一條規則
State(狀態)? ? Explanation(注釋)
NEW? ? ? ? NEW說明這個包是我們看到的第一個包。
意思就是,這是conntrack模塊看到的某個連接第一個包,它即將被匹配了。
比如,我們看到一個SYN 包,是我們所留意的連接的第一個包,就要匹配它。
第一個包也可能不是SYN包,但它仍會被認為是NEW狀態。
這樣做有時會導致一些問題,但對某些情況是有非常大的幫助的。
例如,在 我們想恢復某條從其他的防火墻丟失的連接時,或者某個連接已經超時,但實際上并未關閉時。
ESTABLISHED ESTABLISHED已經注意到兩個方向上的數據傳輸,而且會繼續匹配這個連接的包。
處于ESTABLISHED狀態的連接是非常容 易理解的。只要發送并接到應答,連接就是ESTABLISHED的了。
一個連接要從NEW變 為ESTABLISHED,只需要接到應答包即可,不管這個包是發往防火墻的,還是要由防火墻轉發的。
ICMP的錯誤和重定向等信息包也被看作是ESTABLISHED,只要它們是我 們所發出的信息的應答。
RELATED? ? RELATED是個比較麻煩的狀態。
當一 個連接和某個已處于ESTABLISHED狀態的連接有關系時,就被認為是RELATED的了。
換句話說,一個連接要想 是RELATED的,首先要有一個ESTABLISHED的連接。
這個ESTABLISHED連接再產生一個主連接之外的連接,這 個新的連接就是RELATED的了,當然前提是conntrack模塊要能理解RELATED。
ftp是個很好的例子,FTP-data 連接就是和FTP-control有RELATED的。
還有其他的例子,比如,通過IRC的DCC連接。
有了這個狀態,ICMP應 答、FTP傳輸、DCC等才能穿過防火墻正常工作。
注意,大部分還有一些UDP協議都依賴這個機制。這些協議 是很復雜的,它們把連接信息放在數據包里,并且要求這些信息能被正確理解。
INVALID? ? INVALID說明數據包不能被識別屬于哪個連接或沒有任何狀態。
有幾個原因可以產生這種情況,比如,內存溢出,收到不知屬于哪個連接的ICMP錯誤信息。
一般地,我們DROP這個狀態的任何東西。
禁ping和允許ping
[root@zeyu ~]# iptables -I INPUT -p icmp -j REJECT
[root@zeyu ~]# iptables -I INPUT -p icmp -j ACCEPT
使用“!”可以將條件取反
允許防火墻轉發除ICMP協議以外的所有數據包
iptables -A FORWARD -p ! icmp -j ACCEPT
使用iptables -L查看防火墻設置
centos7 關閉firewall安裝iptables
關閉firewall:
[root@zeyu ~]# systemctl stop firewalld.service #停止firewall
[root@zeyu ~]# systemctl disable firewalld.service #禁止firewall開機啟動
安裝iptables防火墻
[root@zeyu ~]# yum install -y iptables-services #安裝
加入防火墻規則
[root@zeyu ~]# iptables -A INPUT -i lo -j ACCEPT? ? #第一條規則是要把 lo 回環網卡打開
[root@zeyu ~]# iptables -P INPUT DROP
[root@zeyu ~]# iptables -P FORWARD DROP
[root@zeyu ~]# iptables -P OUTPUT DROP
打開22端口允許ssh
[root@zeyu ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@zeyu ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
[root@zeyu ~]# service iptables save #進行保存
iptables: Saving firewall rules to /etc/sysconfig/iptables:[? OK? ]
禁止來自于192.168.81.58的訪問(但是不會拒絕22端口的訪問)
[root@zeyu ~]# iptables -A INPUT -p tcp -s 192.168.81.58 -j DROP
通過 iptables -L -n --line-number 可以顯示規則和相對應的編號
[root@zeyu ~]# iptables -I INPUT 2 -p tcp -s 192.168.81.58 -j REJECT
將規則插入到INPUT鏈第二條
[root@zeyu ~]# iptables -D INPUT 3
刪除INPUT鏈的第3條規則
[root@zeyu ~]# iptables -I INPUT -p icmp -j ACCEPT
[root@zeyu ~]# iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
[root@zeyu ~]# iptables -A INPUT -p udp --sport 53 -j ACCEPT
[root@zeyu ~]# iptables -A INPUT -p udp --dport 53 -j ACCEPT
[root@zeyu ~]# iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
開放DNS(53)端口
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
過濾無效的數據包
端口轉發
首先修改/etc/sysctl.conf
net.ipv4.ip_forward = 1#允許iptalbes FORWARD。
將本地接口IP 61.144.14.72 的3389端口 轉發到116.6.73.229的3389
iptables -t nat -A PREROUTING --dst 61.144.14.72 -p tcp--dport?3389 -j DNAT --to-destination 116.6.73.229:3389
iptables -t nat -A POSTROUTING --dst 116.6.73.229 -p tcp--dport?3389 -j SNAT --to-source 61.144.14.72
清空nat表:
iptables -F -t nat d
fail2ban+iptables 保護服務器的安全
[root@localhost ~]# yum install ed gamin-python ipset
python-inotify-0.9.1-1.el6.noarch.rpm
fail2ban-server-0.9.6-3.el7.noarch.rpm
fail2ban-sendmail-0.9.6-3.el7.noarch.rpm
fail2ban-0.9.6-3.el7.noarch.rpm
fail2ban-firewalld-0.9.6-3.el7.noarch.rpm
[root@localhost ~]#? service fail2ban start
查看fail2ban運行狀態(centOS7下的iptables依賴于firewalld,因此fail2ban也需要firewalld保持運行)
[root@localhost ~]# fail2ban-client status
Status
|- Number of jail: 0
`- Jail list:
[root@localhost ~]# vim /etc/fail2ban/jail.local
[sshd]? ? ? ? ? ? ? #設置jail名稱
enabled = true? ? ? ? #開啟jail
port? ? = ssh? ? ? ? ? ? ? #設置ssh端口
logpath = %(sshd_log)s? #指定sshd的log文件路徑,
bantime = 300? ? ? ? ? ? ? ? ? ? #禁用時長(秒)
maxretry = 5? ? ? ? ? ? ? ? ? ? ? #登陸失敗次數
[http]
enabled = true
port = http,https
filter = apache-banddos
logpath = /var/log/httpd/access_log
bantime = 60
maxretry = 50
findtime = 30
[root@localhost ~]# service fail2ban reload
Redirecting to /bin/systemctl reload? fail2ban.service
[root@localhost ~]# fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd
[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
firewall的使用
查看版本:$ firewall-cmd --version
查看幫助:$ firewall-cmd --help
查看設置:
顯示狀態:$ firewall-cmd --state
查看區域信息: $ firewall-cmd --get-active-zones
查看指定接口所屬區域:$ firewall-cmd --get-zone-of-interface=eth0
拒絕所有包:# firewall-cmd --panic-on
取消拒絕狀態:# firewall-cmd --panic-off
查看是否拒絕:$ firewall-cmd --query-panic
更新防火墻規則:# firewall-cmd --reload
# firewall-cmd --complete-reload
兩者的區別就是第一個無需斷開連接,就是firewalld特性之一動態添加規則,第二個需要斷開連接,類似重啟服務
將接口添加到區域,默認接口都在public
# firewall-cmd --zone=public --add-interface=eth0
永久生效再加上 --permanent 然后reload防火墻
設置默認接口區域
# firewall-cmd --set-default-zone=public
立即生效無需重啟
打開端口(貌似這個才最常用)
查看所有打開的端口:
# firewall-cmd --zone=dmz --list-ports
加入一個端口到區域:
# firewall-cmd --zone=dmz --add-port=8080/tcp
若要永久生效方法同上
打開一個服務,類似于將端口可視化,服務需要在配置文件中添加,/etc/firewalld 目錄下有services文件夾,這個不詳細說了,詳情參考文檔
# firewall-cmd --zone=work --add-service=smtp
移除服務
# firewall-cmd --zone=work --remove-service=smtp