1、搭建vsftpd,并實現虛擬用戶
VSFTP介紹
VSFTP(Very Secure FTP)是一種在Unix/Linux中非常安全且快速穩定的FTP服務器,目前已經被許多大型站點所采用,如ftp.redhat.com,ftp.gnome.org等。
在vsftpd服務器中支持3類用戶,分別是匿名用戶,本地用戶,和虛擬賬戶。用途及區別如下。
1)、匿名用戶:名為anonymous 或ftp 的FTP 用戶,匿名FTP 用戶登錄后將FTP 服務器中的/var/ftp 作為FTP 根目錄。匿名用戶通常用于提供公共文件的下載,如架設公共軟件下載的FTP 服務器,所有人都可以使用匿名用戶進行軟件下載。
2)、本地用戶:賬號是系統用戶賬號(/etc/passwd),使用FTP 本地用戶賬號登錄FTP 服務器后,登錄目錄為本地用戶的宿主目錄。本地FTP用戶賬號通常和Web 服務器一起提供虛擬主機服務,作為網頁虛擬主機更新網頁的途徑。
3)、虛擬用戶:賬號是為了保證FTP 服務器的安全性,由vsftpd 服務器提供的非系統用戶賬號,相對于FTP的本地用戶來說,虛擬用戶只是FTP服務器的專有用戶,虛擬用戶只能訪問FTP服務器所提供的資源。虛擬用戶FTP 登錄后將把指定的目錄作為FTP 根目錄。虛擬用戶與本地用戶具有類似的功能,由于虛擬用戶賬號具有較高的安全性,可以替代本地用戶賬號使用。
下面介紹在vsftpd虛擬用戶應用的配置過程
- vsftpd程序安裝
[root@node01 ~]# yum -y install vsftpd [root@node01 ~]# systemctl start vsftpd
- 設置匿名用戶可訪問ftp
[root@node01 vsftpd]# vim /etc/vsftpd/vsftpd.conf anonymous_enable=YES
- 設置本地用戶登錄并禁錮只能在其家目錄訪問
這里以xp賬號為例 [root@node01 vsftpd]# getent passwd xp xp:x:4011:4011::/home/xp:/bin/bash 1、/home/xp 取消家目錄寫權限 [root@node01 home]# chmod a-w xp 2、編輯配置文件僅允許xp用戶訪問 [root@node01 vsftpd]# vim vsftpd.conf chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list [root@node01 vsftpd]# echo xp > /etc/vsftpd/chroot_list
- 設置虛擬用戶訪問ftp并實現權限劃分
- 用戶賬號存儲方式
文件、數據庫(Mariadb、Redis、...) - vsftpd認證方式
托管給pam - 這里采用Mariadb存儲的方式進行認證
由于要連接數據庫所以需要安裝mariadb-devel工具,同理也需要安裝pam-devel工具 [root@node01 ~]# yum install mariadb-devel pam-devel
- 安裝配置Mariadb
在node2(10.192.2.221)上安裝 [root@node02 ~]# yum -y install mariadb-server [root@node02 ~]# vim /etc/my.cnf.d/server.cnf [mysqld] skip_name_resolve=ON innodb_file_per_table=ON log_bin=mysql-bin [root@node02 ~]# systemctl restart mariadb [root@node02 ~]# mysql MariaDB [(none)]> CREATE DATABASES vsftp_users; MariaDB [(none)]> use vsftp_users MariaDB [vsftp_users]> GRANT SELECT ON vsftp_users.* TO vsftpd@'10.192.2.222' IDENTIFIED BY 'vsftpd'; MariaDB [vsftp_users]> FLUSH PRIVILEGES; MariaDB [vsftp_users]> CREATE TABLE users(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,password CHAR(48) NOT NULL,UNIQUE KEY(name)); MariaDB [vsftp_users]> INSERT INTO users(name,password) VALUES ('zhangsan',PASSWORD('zhangsan')),('lisi',PASSWORD('lisi')); 以上創建了2個用戶,并授權vsftpd數據庫能夠被10.192.2.222服務器訪問查詢權限 以下是在node1(10.192.2.222)上登錄node2數據庫服務器測試 [root@node01 ~]# mysql -uvsftpd -h10.192.2.221 -pvsftpd Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 7 Server version: 5.5.60-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SELECT * FROM vsftp_users.users; +----+----------+-------------------------------------------+ | id | name | password | +----+----------+-------------------------------------------+ | 1 | zhangsan | *D550CDE8CF0F249C0520BF8CFC424D082D87FEF9 | | 2 | lisi | *E070B7FA2C5695131724E1F395E227147223EF12 | +----+----------+-------------------------------------------+ 2 rows in set (0.00 sec)
- 下載安裝pam-mysql
下載地址:https://sourceforge.net/projects/pam-mysql/
[root@node01 ~]# tar -xzvf pam_mysql-0.7RC1.tar.gz [root@node01 ~]# cd pam_mysql-0.7RC1 [root@node01 pam_mysql-0.7RC1]# ./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/usr/lib64/security/ [root@node01 pam_mysql-0.7RC1]# make && make install
- 創建虛擬用戶,并配置pam認證連接數據庫
創建虛擬用戶 [root@node01 ~]# mkdir -p /ftproot [root@node01 ~]# useradd -d /ftproot/vuser/ -s /sbin/nologin vuser [root@node01 ~]# cd /ftproot/ [root@node01 ftproot]# chmod -w vuser 配置vsftpd配置文件 [root@node01 ftproot]# vim /etc/vsftpd/vsftpd.conf pam_service_name=vsftpd.vuser ##pam認證文件 guest_enable=YES guest_username=vuser user_config_dir=/etc/vsftpd/vuser_config/ 配置vsftpd使用pam認證文件 [root@node01 ftproot]# vim /etc/pam.d/vsftpd.vuser auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=10.192.2.221 db=vsftp_users table=users usercolumn=name passwdcolumn=password crypt=2 account required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=10.192.2.221 db=vsftp_users table=users usercolumn=name passwdcolumn=password crypt=2 配置用戶權限文件 [root@node01 ~]# mkdir -p /etc/vsftpd/vuser_config/ [root@node01 ~]# cd /etc/vsftpd/vuser_config/ [root@node01 vuser_config]# vim zhangsan anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES #張三有創建、刪除、上傳文件權限 [root@node01 vuser_config]# vim lisi anon_upload_enable=YES #李四只有上傳文件權限
- 用戶賬號存儲方式
2、簡述iptales四表五鏈及詳細介紹iptables命令使用方法
- iptables理論基礎
iptables其實不是真正的防火墻,我們可以把它理解成一個客戶端代理,用戶通過iptables這個代理,將用戶的安全設定執行到對應的"安全框架"中,這個"安全框架"才是真正的防火墻,這個框架的名字叫netfilter
netfilter才是防火墻真正的安全框架(framework),netfilter位于內核空間。iptables其實是一個命令行工具,位于用戶空間,我們用這個工具操作真正的框架。
netfilter/iptables(下文中簡稱為iptables)組成Linux平臺下的包過濾防火墻,與大多數的Linux軟件一樣,這個包過濾防火墻是免費的,它可以代替昂貴的商業防火墻解決方案,完成封包過濾、封包重定向和網絡地址轉換(NAT)等功能。Netfilter是Linux操作系統核心層內部的一個數據包處理模塊,它具有如下功能:
1、網絡地址轉換(Network Address Translate)
2、數據包內容修改
3、以及數據包過濾的防火墻功能
所以說,雖然我們使用service iptables start啟動iptables"服務",但是其實準確的來說,iptables并沒有一個守護進程,所以并不能算是真正意義上的服務,而應該算是內核提供的功能。
我們知道iptables是按照規則來辦事的,我們就來說說規則(rules),規則其實就是網絡管理員預定義的條件,規則一般的定義為"如果數據包頭符合這樣的條件,就這樣處理這個數據包"。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火墻的主要工作就是添加、修改和刪除這些規則。
這樣說可能并不容易理解,我們來換個容易理解的角度,當客戶端訪問服務器的web服務時,客戶端發送報文到網卡,而tcp/ip協議棧是屬于內核的一部分,所以,客戶端的信息會通過內核的TCP協議傳輸到用戶空間中的web服務中,而此時,客戶端報文的目標終點為web服務所監聽的套接字(IP:Port)上,當web服務需要響應客戶端請求時,web服務發出的響應報文的目標終點則為客戶端,這個時候,web服務所監聽的IP與端口反而變成了原點,我們說過,netfilter才是真正的防火墻,它是內核的一部分,所以,如果我們想要防火墻能夠達到"防火"的目的,則需要在內核中設置關卡,所有進出的報文都要通過這些關卡,經過檢查后,符合放行條件的才能放行,符合阻攔條件的則需要被阻止,于是,就出現了input關卡和output關卡,而這些關卡在iptables中不被稱為"關卡",而被稱為"鏈"。
其實我們上面描述的場景并不完善,因為客戶端發來的報文訪問的目標地址可能并不是本機,而是其他服務器,當本機的內核支持IP_FORWARD時,我們可以將報文轉發給其他服務器,所以,這個時候,我們就會提到iptables中的其他"關卡",也就是其他"鏈",他們就是 "路由前"、"轉發"、"路由后",他們的英文名是
PREROUTING、FORWARD、POSTROUTING也就是說,當我們啟用了防火墻功能時,報文需要經過如下關卡,也就是說,根據實際情況的不同,報文經過"鏈"可能不同。如果報文需要轉發,那么報文則不會經過input鏈發往用戶空間,而是直接在內核空間中經過forward鏈和postrouting鏈轉發出去的,整個過程我們可以按照下圖理解:
所以,根據上圖,我們能夠想象出某些常用場景中,報文的流向:
到本機某進程的報文:PREROUTING --> INPUT
由本機轉發的報文:PREROUTING --> FORWARD --> POSTROUTING
由本機的某進程發出報文(通常為響應報文):OUTPUT --> POSTROUTING
- 鏈的概念
現在,我們想象一下,這些"關卡"在iptables中為什么被稱作"鏈"呢?我們知道,防火墻的作用就在于對經過的報文匹配"規則",然后執行對應的"動作",所以,當報文經過這些關卡的時候,則必須匹配這個關卡上的規則,但是,這個關卡上可能不止有一條規則,而是有很多條規則,當我們把這些規則串到一個鏈條上的時候,就形成了"鏈",所以,我們把每一個"關卡"想象成如下圖中的模樣 ,這樣來說,把他們稱為"鏈"更為合適,每個經過這個"關卡"的報文,都要將這條"鏈"上的所有規則匹配一遍,如果有符合條件的規則,則執行規則對應的動作。
5個鏈:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。- PREROUTING:數據包進入路由表之前
- INPUT:通過路由表后目的地為本機
- FORWARD:通過路由表后,目的地不為本機
- OUTPUT:由本機產生,向外轉發
- POSTROUTIONG:發送到網卡接口之前。
-
表的概念
我們再想想另外一個問題,我們對每個"鏈"上都放置了一串規則,但是這些規則有些很相似,比如,A類規則都是對IP或者端口的過濾,B類規則是修改報文,那么這個時候,我們是不是能把實現相同功能的規則放在一起呢,必須能的。我們把具有相同功能的規則的集合叫做"表",所以說,不同功能的規則,我們可以放置在不同的表中進行管理,而iptables已經為我們定義了4種表,每種表對應了不同的功能,而我們定義的規則也都逃脫不了這4種功能的范圍,所以,學習iptables之前,我們必須先搞明白每種表的作用。
iptables為我們提供了如下規則的分類,或者說,iptables為我們提供了如下"四張表"- filter表:負責過濾功能,防火墻;內核模塊:iptables_filter
- nat表:network address translation,網絡地址轉換功能;內核模塊:iptable_nat
- mangle表:拆解報文,做出修改,并重新封裝 的功能;iptable_mangle
- raw表:關閉nat表上啟用的連接追蹤機制;iptable_raw
也就是說,我們自定義的所有規則,都是這四種分類中的規則,或者說,所有規則都存在于這4張"表"中。
-
表鏈關系
但是我們需要注意的是,某些"鏈"中注定不會包含"某類規則",就像某些"關卡"天生就不具備某些功能一樣,比如,A"關卡"只負責打擊陸地敵人,沒有防空能力,B"關卡"只負責打擊空中敵人,沒有防御步兵的能力,C"關卡"可能比較NB,既能防空,也能防御陸地敵人,D"關卡"最屌,海陸空都能防。那讓我們來看看,每個"關卡"都有哪些能力,或者說,讓我們看看每個"鏈"上的規則都存在于哪些"表"中。
表(功能)<--> 鏈(鉤子):raw 表中的規則可以被哪些鏈使用:PREROUTING,OUTPUT
mangle 表中的規則可以被哪些鏈使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat 表中的規則可以被哪些鏈使用:PREROUTING,OUTPUT,POSTROUTING(centos7中還有INPUT,centos6中沒有)
-
filter 表中的規則可以被哪些鏈使用:INPUT,FORWARD,OUTPUT
表鏈關系
數據流向基本步驟如下:
- 數據包到達網絡接口,比如 eth0。
- 進入 raw 表的 PREROUTING 鏈,這個鏈的作用是趕在連接跟蹤之前處理數據包。
- 如果進行了連接跟蹤,在此處理。
- 進入 mangle 表的 PREROUTING 鏈,在此可以修改數據包,比如 TOS 等。
- 進入 nat 表的 PREROUTING 鏈,可以在此做DNAT,但不要做過濾。
- 決定路由,看是交給本地主機還是轉發給其它主機。
到了這里我們就得分兩種不同的情況進行討論了,一種情況就是數據包要轉發給其它主機,這時候它會依次經過:
- 進入 mangle 表的 FORWARD 鏈,這里也比較特殊,這是在第一次路由決定之后,在進行最后的路由決定之前,我們仍然可以對數據包進行某些修改。
- 進入 filter 表的 FORWARD 鏈,在這里我們可以對所有轉發的數據包進行過濾。需要注意的是:經過這里的數據包是轉發的,方向是雙向的。
- 進入 mangle 表的 POSTROUTING 鏈,到這里已經做完了所有的路由決定,但數據包仍然在本地主機,我們還可以進行某些修改。
- 進入 nat 表的 POSTROUTING 鏈,在這里一般都是用來做 SNAT ,不要在這里進行過濾。
- 進入出去的網絡接口。完畢。
另一種情況是,數據包就是發給本地主機的,那么它會依次穿過:
- 進入 mangle 表的 INPUT 鏈,這里是在路由之后,交由本地主機之前,我們也可以進行一些相應的修改。
- 進入 filter 表的 INPUT 鏈,在這里我們可以對流入的所有數據包進行過濾,無論它來自哪個網絡接口。
- 交給本地主機的應用程序進行處理。
- 處理完畢后進行路由決定,看該往那里發出。
- 進入 raw 表的 OUTPUT 鏈,這里是在連接跟蹤處理本地的數據包之前。
- 連接跟蹤對本地的數據包進行處理。
- 進入 mangle 表的 OUTPUT 鏈,在這里我們可以修改數據包,但不要做過濾。
- 進入 nat 表的 OUTPUT 鏈,可以對防火墻自己發出的數據做 NAT 。
- 再次進行路由決定。
- 進入 filter 表的 OUTPUT 鏈,可以對本地出去的數據包進行過濾。
- 進入 mangle 表的 POSTROUTING 鏈,同上一種情況的第9步。注意,這里不光對經過防火墻的數據包進行處理,還對防火墻自己產生的數據包進行處理。
- 進入 nat 表的 POSTROUTING 鏈,同上一種情況的第10步。
- 進入出去的網絡接口。完畢。
-
查看iptables表的規則
-
iptables -t 表名 -L
查看對應表的所有規則,-t選項指定要操作的表,省略"-t 表名"時,默認表示操作filter表,-L表示列出規則,即查看規則 -
iptables -t 表名 -L 鏈名
查看指定表的指定鏈中的規則 -
iptables -t 表名 -v -L
查看指定表的所有規則,并且顯示更詳細的信息(更多字段),-v表示verbose,表示詳細的,冗長的,當使用-v選項時,會顯示出"計數器"的信息,由于上例中使用的選項都是短選項,所以一般簡寫為iptables -t 表名 -vL -
iptables -t 表名 -n -L
表示查看表的所有規則,并且在顯示規則時,不對規則中的IP或者端口進行名稱反解,-n選項表示不解析IP地址 -
iptables --line-numbers -t 表名 -L
表示查看表的所有規則,并且顯示規則的序號,--line-numbers選項表示顯示規則的序號,注意,此選項為長選項,不能與其他短選項合并,不過此選項可以簡寫為--line,注意,簡寫后仍然是兩條橫杠,仍然是長選項 -
iptables -t 表名 -v -x -L
表示查看表中的所有規則,并且顯示更詳細的信息(-v選項),不過,計數器中的信息顯示為精確的計數值,而不是顯示為經過可讀優化的計數值,-x選項表示顯示計數器的精確值 -
iptables --line -t filter -nvxL
實際使用中,為了方便,往往會將短選項進行合并,所以,如果將上述選項都糅合在一起,可以寫成如下命令,此處以filter表為例。 iptables --line -t filter -nvxL INPUT
-
-
管理iptables表的規則
-
添加規則:添加規則時,規則的順序非常重要
-
命令語法:iptables -t 表名 -A 鏈名 匹配條件 -j 動作 -示例:# iptables -t filter -A INPUT -s 10.192.2.222 -j DROP
在指定表的指定鏈的尾部添加一條規則,-A選項表示在對應鏈的末尾添加規則,省略-t選項時,表示默認操作filter表中的規則 -
命令語法:iptables -t 表名 -I 鏈名 匹配條件 -j 動作 -示例:# iptables -t filter -I INPUT -s 10.192.2.222 -j ACCEPT
在指定表的指定鏈的首部添加一條規則,-I選型表示在對應鏈的開頭添加規則 -
命令語法:iptables -t 表名 -I 鏈名 規則序號 匹配條件 -j 動作 -示例:# iptables -t filter -I INPUT 5 -s 10.192.2.222 -j REJECT
在指定表的指定鏈的指定位置添加一條規則,這里在INPUT的第5條規則位置處添加規則
-
-
刪除規則:如果沒有保存規則,刪除規則時請慎重
-
命令語法:iptables -t 表名 -D 鏈名 規則序號 -示例:# iptables -t filter -D INPUT 3
按照規則序號刪除規則,刪除指定表的指定鏈的指定規則,-D選項表示刪除對應鏈中的規則 -
命令語法:iptables -t 表名 -D 鏈名 匹配條件 -j 動作示例:iptables -t filter -D INPUT -s 10.192.2.222 -j DROP
按照具體的匹配條件與動作刪除規則,刪除指定表的指定鏈的指定規則,上述示例表示刪除filter表中INPUT鏈中源地址為10.192.2.222并且動作為DROP的規則。 -
命令語法:iptables -t 表名 -F 鏈名 -示例:# iptables -t filter -F INPUT
刪除指定表的指定鏈中的所有規則,-F選項表示清空對應鏈中的規則,執行時需三思。 -
命令語法:iptables -t 表名 -F -示例:# iptables -t filter -F
刪除指定表中的所有規則,執行時需三思
-
-
修改規則:如果使用-R選項修改規則中的動作,那么必須指明原規則中的原匹配條件,例如源IP,目標IP等。
-
命令語法:iptables -t 表名 -R 鏈名 規則序號 規則原本的匹配條件 -j 動作 -示例:# iptables -t filter -R INPUT 3 -s 10.192.2.222 -j ACCEPT
上述示例表示修改filter表中INPUT鏈的第3條規則,將這條規則的動作修改為ACCEPT, -s 10.192.2.222為這條規則中原本的匹配條件,如果省略此匹配條件,修改后的規則中的源地址可能會變為0.0.0.0/0 -
命令語法:iptables -t 表名 -P 鏈名 動作 -示例:# iptables -t filter -P FORWARD ACCEPT
設置指定表的指定鏈的默認策略(默認動作)
-
-
保存規則
-
service iptables save
表示將iptables規則保存至/etc/sysconfig/iptables文件中,如果為保存重啟服務規則將丟失 -
iptables-save > /etc/sysconfig/iptables
centos7中使用默認使用firewalld,如果想要使用上述命令保存規則,需要安裝iptables-services,表示將規則保存到指定文件 -
iptables-restore < /etc/sysconfig/iptables
可以使用如下命令從指定的文件載入規則,注意:重載規則時,文件中的規則將會覆蓋現有規則
-
-
-
匹配條件
-
基本匹配條件
示例如下 -s用于匹配報文的源地址,可以同時指定多個源地址,每個IP之間用逗號隔開,也可以指定為一個網段。 iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP iptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPT iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT -d用于匹配報文的目標地址,可以同時指定多個目標地址,每個IP之間用逗號隔開,也可以指定為一個網段 iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT -p用于匹配報文的協議類型,可以匹配的協議類型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中還支持icmpv6、mh) iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT -i用于匹配報文是從哪個網卡接口流入本機的,由于匹配條件只是用于匹配報文流入的網卡,所以在OUTPUT鏈與POSTROUTING鏈中不能使用此選項 iptables -t filter -I INPUT -p icmp -i eth0 -j DROP iptables -t filter -I INPUT -p icmp ! -i eth0 -j DROP -o用于匹配報文將要從哪個網卡接口流出本機,于匹配條件只是用于匹配報文流出的網卡,所以在INPUT鏈與PREROUTING鏈中不能使用此選項 iptables -t filter -I OUTPUT -p icmp -o eth0 -j DROP iptables -t filter -I OUTPUT -p icmp ! -o eth0 -j DROP
-
擴展匹配條件
tcp擴展模塊 常用的擴展匹配條件如下: -p tcp -m tcp --sport 用于匹配tcp協議報文的源端口,可以使用冒號指定一個連續的端口范圍 -p udp -m udp --dport 用于匹配tcp協議報文的目標端口,可以使用冒號指定一個連續的端口范圍 示例如下 iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT multiport擴展模塊 常用的擴展匹配條件如下: -p tcp -m multiport --sports 用于匹配報文的源端口,可以指定離散的多個端口號,端口之間用"逗號"隔開 -p udp -m multiport --dports 用于匹配報文的目標端口,可以指定離散的多個端口號,端口之間用"逗號"隔開 iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT iprange模塊 包含的擴展匹配條件如下 --src-range:指定連續的源地址范圍 --dst-range:指定連續的目標地址范圍 iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROP iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DROP string模塊 常用擴展匹配條件如下 --algo:指定對應的匹配算法,可用算法為bm、kmp,此選項為必需選項。 --string:指定需要匹配的字符串 iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT time模塊 常用擴展匹配條件如下 --timestart:用于指定時間范圍的開始時間,不可取反 --timestop:用于指定時間范圍的結束時間,不可取反 --weekdays:用于指定"星期幾",可取反 --monthdays:用于指定"幾號",可取反 --datestart:用于指定日期范圍的開始日期,不可取反 --datestop:用于指定日期范圍的結束時間,不可取反 iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time ! --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT connlimit 模塊 常用的擴展匹配條件如下 --connlimit-above:單獨使用此選項時,表示限制每個IP的鏈接數量。 --connlimit-mask:此選項不能單獨使用,在使用--connlimit-above選項時,配合此選項,則可以針對"某類IP段內的一定數量的IP"進行連接數量的限制,如果不明白可以參考上文的詳細解釋。 iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT limit模塊 常用的擴展匹配條件如下 --limit-burst:類比"令牌桶"算法,此選項用于指定令牌桶中令牌的最大數量 --limit:類比"令牌桶"算法,此選項用于指定令牌桶中生成新令牌的頻率,可用時間單位有second、minute 、hour、day。 iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT iptables -t filter -A INPUT -p icmp -j REJECT --tcp-flags模塊 iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT、 --syn模塊 iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT icmp擴展 常用的擴展匹配條件 --icmp-type: 匹配icmp報文的具體類型 iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT iptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECT iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT
-
-
state擴展:即為解決安全,又為解決高效
對于state模塊的連接而言,"連接"其中的報文可以分為5種狀態,報文狀態可以為NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED- NEW:連接中的第一個包,狀態就是NEW,我們可以理解為新連接的第一個包的狀態為NEW。
- ESTABLISHED:我們可以把NEW狀態包后面的包的狀態理解為ESTABLISHED,表示連接已建立。
- RELATED:相關聯報文連接,如FTP"數據連接"中的報文與"命令連接"是有"關系"的。
- INVALID:如果一個包沒有辦法被識別,或者這個包沒有任何狀態,那么這個包的狀態就是INVALID,我們可以主動屏蔽狀態為INVALID的報文
- UNTRACKED:報文的狀態為untracked時,表示報文未被追蹤,當報文的狀態為Untracked時通常表示無法找到相關的連接。
- 示例允許NEW,ESTABLISHED
[root@node01 ~]# iptables -I INPUT -m state --state NEW,ESTABLISHED -j ACCEPT [root@node01 ~]# iptables -A INPUT -j REJECT
-
iptables的黑白名單機制
前文中一直在強調一個概念:報文在經過iptables的鏈時,會匹配鏈中的規則,遇到匹配的規則時,就執行對應的動作,如果鏈中的規則都無法匹配到當前報文,則使用鏈的默認策略(默認動作),鏈的默認策略通常設置為ACCEPT或者DROP。
那么,當鏈的默認策略設置為ACCEPT時,如果對應的鏈中沒有配置任何規則,就表示接受所有的報文,如果對應的鏈中存在規則,但是這些規則沒有匹配到報文,報文還是會被接受。
同理,當鏈的默認策略設置為DROP時,如果對應的鏈中沒有配置任何規則,就表示拒絕所有報文,如果對應的鏈中存在規則,但是這些規則沒有匹配到報文,報文還是會被拒絕。
所以,當鏈的默認策略設置為ACCEPT時,按照道理來說,我們在鏈中配置規則時,對應的動作應該設置為DROP或者REJECT,為什么呢?
因為默認策略已經為ACCEPT了,如果我們在設置規則時,對應動作仍然為ACCEPT,那么所有報文都會被放行了,因為不管報文是否被規則匹配到都會被ACCEPT,所以就失去了訪問控制的意義。
所以,當鏈的默認策略為ACCEPT時,鏈中的規則對應的動作應該為DROP或者REJECT,表示只有匹配到規則的報文才會被拒絕,沒有被規則匹配到的報文都會被默認接受,這就是"黑名單"機制。
同理,當鏈的默認策略為DROP時,鏈中的規則對應的動作應該為ACCEPT,表示只有匹配到規則的報文才會被放行,沒有被規則匹配到的報文都會被默認拒絕,這就是"白名單"機制。
如果使用白名單機制,我們就要把所有人都當做壞人,只放行好人。
如果使用黑名單機制,我們就要把所有人都當成好人,只拒絕壞人。
白名單機制似乎更加安全一些,黑名單機制似乎更加靈活一些。- 建立一個INPUT白名單
先清空防火墻規則 [root@node01 ~]# iptables -F 查看防火墻規則 [root@node01 ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 放通22號端口供ssh訪問 [root@node01 ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT 在添加拒絕規則 [root@node01 ~]# iptables -A INPUT -j REJECT 查看INPUT規則 [root@node01 ~]# iptables -L INPUT Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-port-unreachable