本文是自己工作上的筆記總結,適合的可以直接拿去用,不適合的,適當修改即可! iptbales預設ACCEPT策略,也稱通策略,這種情況下可以做攔截策略,還有種叫堵策略,然後開放通的規則。(我偏向堵策略,自己需要開放什麼在開,以下例子也是在此基礎上的) iptables 一些參數名稱: 四表五鏈:fi ...
--------------本文是自己工作上的筆記總結,適合的可以直接拿去用,不適合的,適當修改即可!---------------
iptbales預設ACCEPT策略,也稱通策略,這種情況下可以做攔截策略,還有種叫堵策略,然後開放通的規則。(我偏向堵策略,自己需要開放什麼在開,以下例子也是在此基礎上的)
iptables 一些參數名稱:
四表五鏈:fifter表、NAT表、Mangle表、Raw表 。 INPUT鏈、OUTPUT鏈、FORWARD鏈、PREROUTING鏈、POSTROUTING鏈
INPUT鏈 – 處理來自外部的數據。
OUTPUT鏈 – 處理向外發送的數據。
FORWARD鏈 – 將數據轉發到本機的其他網卡設備上。
PREROUTING鏈 – 處理剛到達本機併在路由轉發前的數據包。它會轉換數據包中的目標IP地址(destination ip address),通常用於DNAT(destination NAT)。(NAT表需要開啟linux路由 net.ipv4.ip_forward = 1)
POSTROUTING鏈 – 處理即將離開本機的數據包。它會轉換數據包中的源IP地址(source ip address),通常用於SNAT(source NAT)。
OUTPUT鏈 – 處理本機產生的數據包。
iptables 新建時情況所有記錄
iptables -F
iptables -X
iptables -F -t mangle
iptables -t mangle -X
iptables -F -t nat
iptables -t nat -X
開放22 SSH埠
iptables -A INPUT -p tcp -p tcp --dport 22 -j ACCEPT (允許外部訪問本機的22埠)
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT (有進就有出,IP包是來回的)
例如一條比較完整的SSH埠限制:(意思為:從eth0進來的SSH訪問,除了公司192.168.16.0/24不限制,其他的地址都限製為每個ip最多5個SSH連接,且只為NEW和ESTABLISHED的連接,其他的都拒接)
iptables -A INPUT -i eth0 ! -s 192.168.16.0/24 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -m connlimit --connlimit-above 5 -j REJECT
----
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT (允許本機去ssh其他的伺服器的22埠)
iptables -A INPUT -p tcp --sport 22 -j ACCEPT
設置預設規則為DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
此時占時不要service iptables save,先用客戶端ssh連接一下伺服器,看看可以連接嗎?如果不行最起碼還可以重啟,這樣規則沒保存重啟是不生效,如果保存了發現不通就麻煩一些了!
當發現可以SSH的時候,我們就可以繼續下麵的步驟了!
打開迴環地址,為了本地訪問,如本地訪問資料庫之類
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
打開伺服器的ping功能,我覺得有必要打開,可以檢測伺服器狀況
iptables -A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT (此2條規則是允許本機ping外網的ip,不包括功能變數名稱,其中8是icmp的請求,0是icmp的響應)
iptables -A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
----
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT (此2條規則是允許外部ping本機)
iptables -A OUTPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
允許內部ping外部的功能變數名稱
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
允許外部訪問本機的80服務,且只允許新連接的和已經連接的會話(狀態檢測)
iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
允許外部訪問我本地多個埠 如 8080,8081,8082,且只允許是新連接,已經連接的和已經連接的在延伸出新連接的會話
iptables -A INPUT -p tcp -m multiport --dport 8080,8081,8082 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sport 8080,8081,8082 -m state --state ESTABLISHED -j ACCEPT
允許外部訪問本機81埠,且本機初始只允許有200個連接,超過了此數量,然後每秒新增加2個連接,如果訪問超過此限制則拒接 (此方式可以限制一些攻擊)
iptables -A INPUT -p tcp --dport 81 -m limit --limit 2/s --limit-burst 200 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 81 -j ACCEPT
限制除用戶192.168.16.99以外的IP連接數為50 (相當於可以給自己開特權^_^)
iptables -A FORWARD -p tcp -s !192.168.16.99 -m connlimit --connlimit-above 50 -j REJECT
TCP匹配擴展協議--tcp-flags
iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK,RST SYN (表示 SYN,FIN,ACK,RST的標識都檢查,但只匹配SYN標識)
iptables -A INPUT -p tcp --syn (如果這是為了匹配SYN標識位也可以寫成這樣,選項—syn相當於”--tcp-flags SYN,RST,ACK SYN”的簡寫。)
實例:
//nmap-xmas
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP (檢查所以的標識位,匹配到FIN URG PSH的丟棄)
//nmap-push
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP (檢查所以的標識位,匹配到SYN RST ACK FIN URG的丟棄)
// Null
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP (檢查所以的標識位,沒標誌位的丟棄)
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP(檢查 SYN,RST標識位,匹配到 SYN,RST的丟棄,SYN是建立連接,RST是重置連接,所以這樣的包是有問題的)
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP (檢查 SYN,FIN標識位,匹配到 SYN,FIN的丟棄,SYN是建立連接,FIN是結束連接,所以這樣的包是有問題的)
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
SNAT 和 DNAT
SNAT:
假如我要讓公司192.168.10.0/24段的地址都通過linux伺服器的eth0 :123.123.123.123上網
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 123.123.123.123
DNAT
GATEWAY eth0:123.123.123.123 eth1:192.168.10.1 內網主機:192.168.10.10
要使訪問123.123.123.123的80 自動跳到192.168.10.10的80埠上
iptables -t nat -A PREROUTING -p tcp -d 123.123.123.123 --dport 80 -j DNAT --to-destination 192.168.10.10:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.10.10 --dport 80 -j SNAT --to-source 192.168.10.1 (內網之間進行nat才加上)
第一條:將外部數據包的目的地址改到內網主機的指定埠
第二條:轉發前,將外部源地址改為內網本地地址