vsftpd、iptables

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)
    
    [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


      表鏈關系

數據流向基本步驟如下:

  1. 數據包到達網絡接口,比如 eth0。
  2. 進入 raw 表的 PREROUTING 鏈,這個鏈的作用是趕在連接跟蹤之前處理數據包。
  3. 如果進行了連接跟蹤,在此處理。
  4. 進入 mangle 表的 PREROUTING 鏈,在此可以修改數據包,比如 TOS 等。
  5. 進入 nat 表的 PREROUTING 鏈,可以在此做DNAT,但不要做過濾。
  6. 決定路由,看是交給本地主機還是轉發給其它主機。

到了這里我們就得分兩種不同的情況進行討論了,一種情況就是數據包要轉發給其它主機,這時候它會依次經過:

  1. 進入 mangle 表的 FORWARD 鏈,這里也比較特殊,這是在第一次路由決定之后,在進行最后的路由決定之前,我們仍然可以對數據包進行某些修改。
  2. 進入 filter 表的 FORWARD 鏈,在這里我們可以對所有轉發的數據包進行過濾。需要注意的是:經過這里的數據包是轉發的,方向是雙向的。
  3. 進入 mangle 表的 POSTROUTING 鏈,到這里已經做完了所有的路由決定,但數據包仍然在本地主機,我們還可以進行某些修改。
  4. 進入 nat 表的 POSTROUTING 鏈,在這里一般都是用來做 SNAT ,不要在這里進行過濾。
  5. 進入出去的網絡接口。完畢。

另一種情況是,數據包就是發給本地主機的,那么它會依次穿過:

  1. 進入 mangle 表的 INPUT 鏈,這里是在路由之后,交由本地主機之前,我們也可以進行一些相應的修改。
  2. 進入 filter 表的 INPUT 鏈,在這里我們可以對流入的所有數據包進行過濾,無論它來自哪個網絡接口。
  3. 交給本地主機的應用程序進行處理。
  4. 處理完畢后進行路由決定,看該往那里發出。
  5. 進入 raw 表的 OUTPUT 鏈,這里是在連接跟蹤處理本地的數據包之前。
  6. 連接跟蹤對本地的數據包進行處理。
  7. 進入 mangle 表的 OUTPUT 鏈,在這里我們可以修改數據包,但不要做過濾。
  8. 進入 nat 表的 OUTPUT 鏈,可以對防火墻自己發出的數據做 NAT 。
  9. 再次進行路由決定。
  10. 進入 filter 表的 OUTPUT 鏈,可以對本地出去的數據包進行過濾。
  11. 進入 mangle 表的 POSTROUTING 鏈,同上一種情況的第9步。注意,這里不光對經過防火墻的數據包進行處理,還對防火墻自己產生的數據包進行處理。
  12. 進入 nat 表的 POSTROUTING 鏈,同上一種情況的第10步。
  13. 進入出去的網絡接口。完畢。
  • 查看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
    
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容