iptables總結,自用

iptables 語法以及個參數詳解

iptables [-t TABLE] COMMAND CHAIN [num] 匹配條件 -j 處理動作

通用匹配 -s 原地址 -d 目的地址 -p 協議 -i input 網卡名 -o output 網卡名 (數據包流入和流出的網卡)

擴展匹配 ----sport PORT[-PORT]: 源端口 --dport PORT[-PORT]: 目標端口

--tcp-flags mask comp:只檢查mask指定的標誌位,是逗號分隔的標誌位列表;comp:此列表中出現的標記位必須爲1,comp中沒出現,而mask中出現的,必須爲0;

--tcp-flags SYN,FIN,ACK,RST SYN = --syn #這句就是匹配三次握手的第一次的數據包

-p icmp --icmp-type 0: echo-reply icmp 應答
8: echo-request icmp請求
state: 狀態擴展,結合ip_conntrack追蹤會話的狀態
NEW: 新連接請求
ESTABLISHED:已建立的連接
INVALID:非法連接
RELATED:相關聯的

-m state --state NEW,ESTABLISHED -j ACCEPT

-m 裝載模塊 這裏是裝載state模塊 然後在使用--state參數

multiport: 多端口匹配擴展
-source-ports
--destination-ports
--ports

如:iptables -I INPUT -p tcp -m multiport -destination-ports 21,22,80 -m state --state NEW -j ACCEPT # 多端口直接用逗號分隔

-m iprange: 連續的多地址匹配
--src-range #原地址
--dst-range #目的地址

iptables -A INPUT -p tcp -m iprange --src-range 192.168.0.1-192.168.0.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

-m connlimit 模塊功能:#限制每個客戶端IP的併發連接數,每個IP同時連接到一個服務器個數
–connlimit-above N    #限制N個
–connlimit-mask n     #主機的掩碼,默認是connlimit-mask 32 ,即每個IP.

如:iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit ! --connlimit-above 3 -j ACCEPT

連接數在不超過3個允許通過,超過3個後續的請求被拒絕。這個可以控制多線程下載工具對網絡帶寬的佔用,

-m limit --limit 限制特定包傳入速度
如: iptables -A INPUT -m limit --limit 3/hour
--limit 參數 /second、 /minute、/day。 除了進行封
--limit-burst 參數 限制特定包瞬間傳入的峯值

iptables -A INPUT -d 192.168.1.1 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 6 -j ACCEPT

可以一次接收6個ping請求,之後按照速率5個/minute 響應

-m string 實現字符串匹配,URL過濾,安全策略
--algo bm|kmp 設置字符匹配的查詢算法,默認使用bm算法,kmp算法,是一種更復雜的算法
iptables -A OUTPUT -p tcp -m string --string "qq.com" --algo bm -j DROP
iptables -A OUTPUT -p udp -m string --string "qq.com" --algo kmp -j DROP

一些防止***的規則
iptables -I INPUT 1 -p tcp --dport 80 -m string --string "cmd.exe" --algo bm -j DROP

iptables -I INPUT 1 -p tcp --dport 80 -m string --string "domain.com" --algo kmp -j DROP

recent 模塊,防止×××暴力破解

-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP

每個IP每小時只限連接5次。

這裏說一下 -rcheck和update的區別

rcheck從第1個包開始計算時間,update是在rcheck的基礎上增加了從最近的DROP包開始計算阻斷時間,具有準許時間和阻斷時間,update會更新last-seen時間戳。

iptables 設置端口轉發/映射
默認內核禁止ip轉發
開啓方式

2.1.臨時開啓,(寫入內存,在內存中開啓)
echo "1" > /proc/sys/net/ipv4/ip_forward

3.2.永久開啓,(寫入內核)
vim /sysctl.conf 下
加入此行 net.ipv4.ip_forward = 1
sysctl -p ---加載
sysctl -a |grep "ip_forward" ----查看

轉發
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.3 --dport 8080 -j DNAT --to 192.168.1.1:8001

將目的地址192.168.1.3 目的端口號 8080 的請求轉發到 局域網內地址爲192.168.1.1端口爲8001

本地端口轉發
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

管理規則
-A:在鏈的尾部添加一條規則
-I CHAIN [num]: 插入一條規則,不指定num默認插入到頂部,指定num在對應的CHAIN中num指出的位置插入
-D CHAIN [num]: 刪除指定鏈中的第num條規則;
-R CHAIN [num]: 替換指定的規則;
管理鏈:
-F [CHAIN]:清空指定規則鏈,如果不指定,默認清除所有鏈規則
-P CHAIN: 設定指定鏈的默認策略;
-N:自定義一個新的空鏈
-X: 刪除一個自定義的空鏈
-Z:置零指定鏈中所有規則的計數器
-E: 重命名自定義的鏈
查看:
-L: 顯示指定表中的規則;
-n: 以數字格式顯示主機地址和端口號;
-v: 顯示鏈及規則的詳細信息
-vv:
-x: 顯示計數器的精確值
--line-numbers: 顯示規則號碼

動作(target):
ACCEPT:放行
DROP:丟棄
REJECT:拒絕
DNAT:目標地址轉換
SNAT:源地址轉換
REDIRECT:端口重定向
MASQUERADE:地址僞裝
LOG:日誌
MARK:打標記

------------------------------------------------示例-------------------------------------------
iptables 將filter表的INPUT和OUTPUT默認策略設置爲DROP,

#iptables -P INPUT DROP

#iptables -P OUTPUT DROP

允許yum安裝軟件數據包通過,需要如下規則

在filter表的INPUT鏈中放行

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT

iptables -A INPUT -i lo -j ACCEPT

在filter表的OUTPUT鏈中放行

iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -p tcp -m tcp -m state --state NEW --dport 80 -j ACCEPT

iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

iptables -A OUTPUT -p tcp --sport 10000:65535 -j ACCEPT

service iptables save 保存 不保存重啓後規則失效

放行 SSH流量 由於出入口的策略是DROP,所以放行也是雙向的

iptables -A INPUT -s 172.17.0.0/16 -d 172.17.100.1 -p tcp --dport 22 -j ACCEPT

iptables -t filter -A OUTPUT -s 172.17.100.1 -d 172.17.0.0/16 -p tcp --sport 22 -j ACCEPT

放行 httpd服務80端口 流量

iptables -A INPUT -s 172.17.0.0/16 -d 172.17.100.1 -p tcp --dport 80 -j ACCEPT

iptables -t filter -A OUTPUT -s 172.17.100.1 -d 172.17.0.0/16 -p tcp --sport 80 -j ACCEPT

允許ping自己 放行本地環路接口數據包

iptables -t filter -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEP

iptables -t filter -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT

做ping屏蔽 你可以ping別人,別人不能ping你

iptables -A INPUT -d 172.168.100.1 -p icmp --icmp-type 0 -j ACCEPT

iptables -t filter -A OUTPUT -s 172.168.100.1 -p icmp --icmp-type 8 -j ACCEPT

放行FTP服務流量通行

簡單說一下FTP協議,FTP協議是一個簡單的tcp協議,數據的連接分爲主動模式和被動模式

主動方式的連接過程:客戶端向服務器的FTP端口(默認是21)發
送連接請求建立連接(命令鏈路),當需要傳送數據時,客戶端在命令鏈路上用PORT命令告訴服務器所開放傳輸數據的端口,然後服務器從20端口向客戶端開放的數據端口發送連接請求,建立數據鏈路傳輸數據

被動方式的連接過程:客戶端向服務器的FTP端口(默認是21)發送連接請求建立連接(命令鏈路)。當需要傳送數據時,服務器在命令鏈路上用PASV命令告訴客戶端所開放傳輸數據的端口,客戶端向服務器開放的傳輸數據端口發送連接請求,建立數據鏈路傳輸數據

ftp默認是被動模式,主動和被動之間使用"pass"命令切換,主動模式通過20端口與客戶端相連,而被動模式卻使用1024以後的端口與客戶端相連,由於1024以後的端口是隨機分配的,所以在被動模式下我們是不知道服務端是使用什麼端口與客戶端連接的

放行FTP 21端口,允許連接
vim /etc/sysconfig/iptables-config //先修改配置文件將模塊加載進去,必須修改,否則ftp服務數據包沒辦法通過

IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

添加如下規則:

iptables -t filter -A INPUT -d 172.168.100.7 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -t filter -A OUTPUT -s 172.168.100.7 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -t filter -A INPUT -d 172.168.100.7 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

service iptables save
service iptables restart

狀態追蹤規則
防止反彈式病毒

redhat系統上在 /proc/net/ip_contrack文件中記錄
/proc/sys/net/ipv4/ip_conntrack_max 設置可以記錄的鏈接總條數

對sshd服務進行狀態追蹤
允許新建的和已連接的數據包進入
iptables -A INPUT -d 192.168.1.100 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

允許已連接的數據出去
iptables -A OUTPUT -s 192.168.1.100 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

對httpd,ping命令等做狀態追蹤都是和實列一樣,舉一反三

日誌記錄功能,在系統日誌/var/log/messages裏

iptables -I INPUT -d 192.168.1.100 -p icmp --icmp-type 8 -j LOG --log-prefix "---firewall log for icmp---"

將目的ip是192.168.1.100 並且協議是icmp的 是別人ping我的數據包。我要把它的信息記錄到我的日誌裏邊

--log-prefix 參數你要標識的字符串,在系統日誌中可以方便的找到你要查詢的記錄

防止××××××我們的22號端口服務,這些規則前面最好沒有drop和reject的規則,否則可能失效

1、iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
//--set記錄IP --name 記錄到哪,記錄到名字爲SSH的內存緩衝文件中
2、iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --seconds 300 --hitcount 4 -j LOG --log-prefix "-----SSH NOLOGAIN-----------"
//將300秒內 連續登陸4次的記錄的 系統日誌文件中
3、iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 4 --name SSH -j DROP
//如果300秒內連續嘗試登陸4次失敗,放入小黑屋5分鐘

自定義鏈

iptables -N new ##創建一條自定義連
iptables -A new -s 192.168.1.100 -j ACCEPT #添加一條規則
iptables -A new -d 192.168.1.100 -j RETURN #沒有匹配到就返回主鏈
iptables -I INPUT -j new #放入主鏈
自定義鏈用好了,可以提升很高的數據包處理速度

刪除自定義規則鏈:iptables -X new

注意刪除自定義規則鏈之前請先刪除鏈上的所有規則,之後還要清除調用這個自定義鏈的規則,清理完畢後就可以清除自定義鏈了

iptables-save > /etc/sysconfig/iptables.bak ##這個命令也可以存儲規則,是重定向到別的文件

iptables-restore < /etc/sysconfig/iptables.bak ##加載規則文件,因爲默認iptables是從/etc/sysconfig/iptables文件加載的。

lsmod | grep ip 查看這些功能模塊是否存在。從而確定iptables是否開啓

iptables功能強大而靈活,已經能夠滿足我們的大部分需求。但是它本身不能對應用層協議的數據包進行處理。(比如qq、×××、msn)

需要修改重新編譯內核,後續看完部分內核源碼在補充

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