首頁 > 軟體

iptables 用法及常用模組總結

2020-06-16 17:05:26

iptables傳輸封包的過程:

  1. 當一個封包進入網絡卡時,它首先進入PREROUTING鏈,核心根據封包目的IP判斷是否需要轉送出去。

  2. 如果封包就是進入本機的,它就會沿著圖向下移動,到達INPUT鏈。封包到了INPUT鏈後,任何進程都會收到它。本機上執行的程式可以傳送封包,這些封包會經過OUTPUT鏈,然後到達POSTROUTING鏈輸出。

  3. 如果封包是要轉發出去的,且核心允許轉發,封包就會如圖所示向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出。

第一部分:常用顯示模組介紹

注意:本文所有範例都是在預設規則為DROP下。

# 開放ssh伺服器端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --sport 22 -j ACCEPT

# 修改預設規則為DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP

1. multiport: 多埠匹配

    可用於匹配非連續或連續埠;最多指定15個埠;
    範例

iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sport 22,80 -j ACCEPT

2. iprange: 匹配指定範圍內的地址

    匹配一段連續的地址而非整個網路時有用
    範例:

iptables -A INPUT -p tcp -m iprange --src-range 192.168.118.0-192.168.118.60 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -m iprange --dst-range 192.168.118.0-192.168.118.60 --sport 22 -j ACCEPT

3. string: 字串匹配,能夠檢測報文應用層中的字串

    字元匹配檢查高效演算法:kmp, bm 
    能夠遮蔽非法字元
    範例:

# 注意該條規則需要新增到OUTPUT鏈,當伺服器端返回資料包文檢查到有關鍵字"sex"時,則丟棄該報文,可用於web敏感詞過濾
iptables -A OUTPUT -p tcp --dport 80 -m string --algo kmp --string "sex" -j DROP

4. connlimit: 連線數限制,對每IP所能夠發起並行連線數做限制;

    範例:

# 預設INPUT 為 DROP. 每個ip對ssh服務的存取最大為3個並行連線,超過則丟棄
iptables -A INPUT -p tcp  --dport 22 -m connlimit ! --connlimit-above 3 -j ACCEPT

5. limit: 速率限制
    limit-burst: 設定預設閥值

# 預設放行10個,當到達limit-burst閥值後,平均6秒放行1個
iptables -A INPUT -p icmp -m limit --limit 10/minute --limit-burst 10 -j ACCEPT

6. state: 狀態檢查

    連線追蹤中的狀態:
        NEW: 新建立一個對談
        ESTABLISHED:已建立的連線
        RELATED: 有關聯關係的連線
        INVALID: 無法識別的連線

# 放行ssh的首次連線狀態
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT   

第二部分:編寫常用規則

編寫iptables注意:做預設規則drop的時候一定要先開放ssh埠,否則就杯具了。

# 清空自建規則
iptables -F
iptables -X

# 在INPUT鏈上,tcp為RELATED,ESTABLISHED的封包為放行
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

# 在INPUT鏈上,tcp為NEW而且埠為22,80的封包放行
iptables -A INPUT -p tcp -m state --state NEW -m multiport 22,80 -j ACCEPT

# 在OUTPUT鏈上,tcp為ESTABLISHED都放行
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT

# INPUT鏈和OUTPUT鏈預設規則都為DROP狀態
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 開啟本地回環地址
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 允許伺服器ping對端主機而不允許對端主機ping伺服器
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

# 開放主機對dns的存取
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

第三部分:針對特定的服務客製化相關規則

1. 對ssh進行管控,1小時內最多發起5個連線,防止駭客暴力破解ssh

# 清空預設規則
iptables -F
iptables -X

# 新增已建立的連線規則
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT

# 設定預設規則
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 設定iptables記錄匹配ssh規則
iptables -I INPUT  2 -p tcp --syn -m state --state NEW -j LOG --log-level 5 --log-prefix "[SSH Login]:"

# 使用recent顯示模組限定每小時最多匹配到5次,超過則丟棄。
iptables -A INPUT -p tcp --syn -m state --state NEW -m recent --name OPENSSH --update --seconds 3600 --hitcount 5 -j DROP
iptables -A INPUT -p tcp --syn -m state --state NEW -m recent --name OPENSSH --set -j ACCEPT

2. 對web服務進行並行管控,防止Ddos

# 清空預設規則
iptables -F
iptables -X

# 新增已建立的連線規則
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT

# 設定預設規則
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 每個ip的並行連線請求最大50,超過則丟棄,建議調大值,容易誤傷nat上網使用者
iptables -A INPUT -p tcp --syn --dport 80 -m state --state NEW -m connlimit ! --connlimit-above 50 -j DROP

3. 對icmp進行流控,防止icmp攻擊

# 清空預設規則
iptables -F
iptables -X

# 新增已建立的連線規則
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT

# 設定預設規則
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 利用limit模組限制icmp速率,閥值為10個,當到達10個後,限速每秒鐘1個
iptables -A INPUT -p icmp --icmp-type 0 -m limit --limit 1/s --limit-burst 10 -j ACCEPT

第四部分:NAT 常用規則

站在伺服器的角度:

  當內網伺服器要存取外網時,需要做源地址轉換;

# 開啟轉發功能
sysctl -w net.ipv4.ip_forward=1

# 把 192.168.1.0 網段流出的資料的 source ip address 修改成為 10.0.0.11:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 10.0.0.11

  當外網主機要存取內網伺服器服務時,需要做目標地址轉換;

# 開啟轉發功能
sysctl -w net.ipv4.ip_forward=1

# 把存取 10.0.0.11:2222 的存取轉發到 192.168.1.11:22 上::
iptables -t nat -A PREROUTING -d 10.0.0.11 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.11:22

  單純的將存取本機80埠的請求轉發到8080上

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

補充:

iptables 獨立紀錄檔設定:

  當在iptables中啟用紀錄檔記錄時,會被當做系統紀錄檔記錄到/var/log/message裡面,如果想要獨立紀錄檔設定如下:

grep -r 'iptables' /etc/rsyslog.conf
kern.*                            /var/log/iptables.log

systemctl restart rsyslog

在 /etc/rsyslog.conf 中新增一條規則,並重新啟動服務。

更多iptables相關教學見以下內容

CentOS 7.0關閉預設防火牆啟用iptables防火牆  http://www.linuxidc.com/Linux/2015-05/117473.htm

Iptables工作原理使用詳解 http://www.linuxidc.com/Linux/2016-09/134945.htm

Ubuntu 14.04 設定iptables防火牆 http://www.linuxidc.com/Linux/2017-02/140556.htm

Linux下編譯安裝iptables  http://www.linuxidc.com/Linux/2017-04/142615.htm

iptables的備份、恢復及防火牆指令碼的基本使用 http://www.linuxidc.com/Linux/2013-08/88535.htm

Iptables工作原理使用詳解  http://www.linuxidc.com/Linux/2016-09/134945.htm

CentOS7下iptables設定過程 http://www.linuxidc.com/Linux/2017-01/139622.htm

Linux下iptables防火牆設定 http://www.linuxidc.com/Linux/2015-10/123843.htm

Linux防火牆iptables詳解  http://www.linuxidc.com/Linux/2016-12/138474.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-10/147347.htm


IT145.com E-mail:sddin#qq.com