iptables基礎知識

1)Linux下的防火牆概念

a、一般談到Linux下的防火牆,我們都會首先想到iptables,其實更確切的叫法應該是Netfilter/iptables,iptables和Netfilter其實是存在差別的。

b、儘管它們經常被用來相互替換使用,Netfilter是用來實現Linux內核中防火牆的Linux內核空間程序代碼段,它要麼被直接編譯進內核,要麼被包含在模塊中。

c、而iptables是用來管理Netfilter防火牆的用戶程序,而我這裏提到的iptables是包含Netfiler和iptables。

d、Netfilter/iptables是基於包過濾的防火牆,主要是針對2-4層,另外,iptables也支持7層控制。


2)iptables的組成部分:

iptables有四個表和五個鏈以及一些規則組成:

四個表:filter、nat、mangle、raw

filter表(過濾規則表),nat表(地址轉換規則表),mangle(修改數據標記位規則表),raw(跟蹤數據表規則表)

其中最常用的是filter表以及nat表

五個鏈:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING

iptables的命令語法:

iptables [-t 表名]<-A|-I|-D|-R>鏈名[規則編號][-i|-o 網卡名稱][-p 協議類型][-s 源IP地址|源子網][–sport 源端口號][-d 目標IP地址|目標子網][–dport 目標端口號]<-j 動作>

3)參數及動作信息

-A 追加防火牆規則

-D 刪除防火牆規則

-I 插入防火牆規則

-F 清空防火牆規則

-L 列出防火牆規則

-R 替換防火牆規則

-Z 清空防火牆數據表統計信息

-P 設置鏈默認規則

匹配參數:

-p                  匹配協議

-s                 匹配源地址

-d                 匹配目標地址

-i                  匹配入站網卡接口

-o                 匹配出站網卡接口

–sport               匹配源端口

–dport               匹配目標端口

–src-range             匹配源地址範圍

–dst-range            匹配目標地址範圍

–limit              匹配數據錶速率

–mac-source            匹配源MAC地址

–state              匹配狀態(INVALID、ESTABLISHED、NEW、RELATED)

–string              匹配應用層字串

觸發動作:

ACCEPT 允許數據包通過

DROP 丟棄數據包

REJECT 拒絕數據包通過,併發回封包通知對方

LOG 將數據包信息記錄syslog日誌

DNAT 目標地址轉換

SNAT 源地址轉換(適用於靜態IP)

MASQUERADE 地址欺騙(只能用於ADSL撥號上網的IP僞裝,也就是主機的IP是由ISP分配動態的)

REDIRECT 重定向,將數據包重定向到本機或另外主機的某一個端口,通常能實現透明代理或者對外開放內網的某些服務

4)常用的命令

a、查看filter表的所有規則:

[root@localhost ~]# iptables -n -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

b、清空filter表的所有規則:

[root@localhost ~]# iptables -F

c、查看nat表的所有規則:

[root@localhost ~]# iptables -t nat -n -L

# 記錄10.10.10.1訪問主機80端口的日誌信息(/var/log/messages)

[root@localhost ~]# iptables -I INPUT -s 10.10.10.1 -p tcp --dport 80 -j LOG
[root@localhost ~]# tail -10 /var/log/messages
Jul 13 14:44:53 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10253 DF PROTO=TCP SPT=62700 DPT=80 WINDOW=253 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:55 localhost chronyd[829]: Selected source 202.118.1.130
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10256 DF PROTO=TCP SPT=62701 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10257 DF PROTO=TCP SPT=62702 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10258 DF PROTO=TCP SPT=62703 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10259 DF PROTO=TCP SPT=62704 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10260 DF PROTO=TCP SPT=62701 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10261 DF PROTO=TCP SPT=62702 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10262 DF PROTO=TCP SPT=62703 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10263 DF PROTO=TCP SPT=62704 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0

# 將來自10.10.10.0/24網段的主機並訪問80端口的請求給予拒絕

[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 80 -j DROP
[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
LOG        tcp  --  10.10.10.1           0.0.0.0/0            tcp dpt:80 LOG flags 0 level 4
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

# 禁止10.10.10.0/24網段內的主機ping。ICMP類型爲8

[root@localhost ~]# iptables -A INPUT -s 10.10.10.0/24 -p icmp --icmp-type 8 -j DROP
說明:禁止10.10.10.0/24網段內的主機ping

# 查看filter表中防火牆規則並顯示規則編號:

[root@localhost ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
2    LOG        tcp  --  10.10.10.1           0.0.0.0/0            tcp dpt:80 LOG flags 0 level 4
3    DROP       icmp --  10.10.10.0/24        0.0.0.0/0            icmptype 8
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

# -D參數,刪除INPUT鏈的第三條規則:  

[root@localhost ~]# iptables -D INPUT 3
[root@localhost ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
2    LOG        tcp  --  10.10.10.1           0.0.0.0/0            tcp dpt:80 LOG flags 0 level 4
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

# -R參數,替換第二條規則       

[root@localhost ~]# iptables -R INPUT 2 ! -s 10.10.10.1 -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
2    ACCEPT     tcp  -- !10.10.10.1           0.0.0.0/0            tcp dpt:80
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

# 查看iptables的版本號:

[root@localhost ~]# iptables -V
iptables v1.4.21
[root@localhost ~]# iptables -A INPUT -i lo -j ACCEPT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

# CentOS7下iptables的安裝:

CentOS 7 默認使用firewalld來管理iptables規則,由於防火牆規則變動的情況很少,動不動態變得無所謂了。但是總是感覺不太習慣。
使用下面的辦法來恢復原來的習慣,同時解決iptables開機啓動的問題。
# yum install iptables-services -y
# systemctl enable iptables
這樣的話,iptables服務會開機啓動,自動從/etc/sysconfig/iptables 文件導入規則。
爲了讓/etc/init.d/iptables save 這條命令生效,需要這麼做
# cp /usr/libexec/iptables/iptables.init /etc/init.d/iptables
# /etc/init.d/iptables save
而chkconfig iptables 命令會自動重定向到sytemctl enable iptables

# 定義iptables默認策略

默認策略的定義格式爲:

iptables [-t 表名] <-P> <鏈名> <動作>

查看iptables的狀態

[root@ip-172-31-22-8 ~]# /etc/init.d/iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

5)iptables的狀態state

下面解釋iptables的幾種狀態:

NEW:如果你的主機向遠程主機發出一個請求連接,這個數據包的狀態就是NEW

ESTABLISHED:已建立的連接(完成TCP的三次握手後),遠程主機和你的主機通信數據狀態爲ESTABLISHED

RELATED:正在啓動新連接,比如FTP服務傳輸,21端口負責傳送命令,20端口負責傳輸數據,在已有的21端口建立好連接後發生命令,這時候20端口或其他端口傳送FTP-DATA,狀態就是RELEATED

INVALID:非法或無法識別的數據包,不能被識別屬於哪個連接或者沒有任何狀態,通常這種狀態包會被丟棄

iptables腳本的基本模板:

#!/bin/bash
#created by molewan 2016/07/16
#email:[email protected]
iptables -F
iptables -F -t nat
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -A INPUT -m state --state NEW -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

6)生產環境中我們如何維護我們的iptables

系統運維人員在維護iptables的時候,經常會發現誤操作了iptables導致無法進入了系統,這個時候只有去機房重啓iptables,其實這個也是有辦法解決的,可以通過配置

計劃任務的方式來處理:

[root@ip-172-31-22-8 ~]# crontab -l
*/5 * * * * /etc/init.d/iptables stop

7)iptables防火牆應用案例:

案例1:允許任意客戶端訪問主機的日常服務(HTTP、HTTPS、DNS、NTP、SMTP、POPS3、SSH)

[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p udp --dport 25 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -P tcp --dport 53 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p udp --dport 53 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 143 -j ACCEPT
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -P OUTPUT ACCEPT
[root@localhost ~]# iptables -P FORWARD DROP
[root@localhost ~]# iptables -n -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:25
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:110
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:143
Chain FORWARD (policy DROP)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@localhost ~]# cat /etc/services #可以在此文件中查看服務的名稱

案例2:公司擁有一個公有IP,使用防火牆實現局域網中所有主機通過SNAT共享上網。

原理:使用CentOS7作爲公司軟路由,將內網192.168.0.0/24的數據包源地址修改爲路由器上的公有IP 124.126.199.84,使用SNAT規則,以及NAT表的POSTROUTING鏈

先開啓系統上的路由轉發:

# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
# iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.126.199.84

案例3:公司對外有一個公網IP,公司內部有HTTP、MAIL兩臺核心服務器,通過防火牆實現客戶可以從互聯網的任意位置訪問公司內部的兩臺服務器資源

拓撲;
Internet <--124.126.199.84(防火牆)-->192.168.0.0/24
http:192.168.0.100
postfix:192.168.0.101
處理過程:
開啓路由轉發:
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
針對80端口的
# iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100
針對25端口和110端口
# iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.101
# iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.101

案例4:目前網絡的***手法層出不窮,很多***會採用發生大量無效的數據包給服務器,造成服務器無法響應正常的請求包,iptables提供了一個limit擴展功能,可以限制單位時間內數據包的個數。下面的規則是當每秒鐘數據包個數爲500接受入站連接,負責拒絕連接。

[root@localhost ~]# iptables -I INPUT -m limit --limit 500/sec -j ACCEPT
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -n -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            limit: avg 500/sec burst 5
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:25
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:110
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:143
Chain FORWARD (policy DROP)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source

案例5:根據數據連接狀態設置防火牆規則,放行所有出站數據包,拒絕入站的新連接請求和無效連接,放行入站的迴應請求

[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -X
[root@localhost ~]# iptables -Z
[root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@localhost ~]# iptables -I INPUT -m state --state NEW -j DROP
[root@localhost ~]# iptables -P OUTPUT ACCEPT
[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            0.0.0.0/0            state NEW
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

案例6:公司採用基於Linux的軟路由設備,要求在路由設備上設置防火牆規格,記錄10.0.0.1至10.0.0.128地址段內所有的主機發送給路由要求轉發的數據包,並允許轉發這些數據包

[root@localhost ~]# iptables -A FORWARD -m iprange --src-range 10.0.0.1-10.10.0.11 -p tcp --dport 80 -j LOG
[root@localhost ~]# iptables -A FORWARD -m iprange --src-range 10.0.0.1-10.10.0.11 -p tcp --dport 80 -j ACCEPT[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            0.0.0.0/0            state NEW
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target     prot opt source               destination         
LOG        tcp  --  0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.1-10.10.0.11 tcp dpt:80 LOG flags 0 level 4
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.1-10.10.0.11 tcp dpt:80
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

一次性允許多端口通過:

[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp -m multiport --dport 21,22,23,80 -j ACCEPT
[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  10.10.10.0/24        0.0.0.0/0            multiport dports 21,22,23,80
DROP       all  --  0.0.0.0/0            0.0.0.0/0            state NEW
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target     prot opt source               destination         
LOG        tcp  --  0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.1-10.10.0.11 tcp dpt:80 LOG flags 0 level 4
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.1-10.10.0.11 tcp dpt:80
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章