2021-05-12 14:32:11
iptables 用法及常用模組總結
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
相關文章