Linux:網絡防火牆
netfilter:Frame
iptables:數據報文過濾,NAT,mangle等生成工具;
網絡:IP報文首部,TCP報文首部
防火牆:硬件,軟件:規則(匹配標準,處理辦法)
Framework:
默認規則:
開放:堵
關閉:通
規則:匹配標準
IP:SIP,DIP
TCP:SPORT,DPORT, SYN=1, FIN=0,RST=0,ACK=0; SYN=1,ACK=1,FIN=0,RST=0; ACK=1,SYN=0RST=0,FIN=0(ESTABLISHED)
UDP:SPORT,DPORT
ICMP:icmp-type
數據報文過濾:
Linux2.0
ipfw/firewall
Linux2.2
ipchain/firewall
Linux2.4
iptables/netfilter
hook function:鉤子函數
prerouting
input
output
forward
postrouting
規則鏈:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
filter(過濾) 表
INPUT
OUTPUT
FORWARD
nat(地址轉換) 表
PREROUTING
OUTPUT
POSTROUTING
mangle(拆開、修改、封裝):表
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
raw():
PREROUTING
OUTPUT
iptables:
500條規則
能否使用自定義鏈?
可以使用自定鏈,但只在被調用時才能發揮作用,而且如果沒有自定義鏈中的任何規則匹配,還應該有返回機制;
用可以刪除自定義的空鏈
默認鏈無法刪除
每個規則都有兩個內置的計數器:
被匹配的報文個數
被匹配的報文大小之和
規則:匹配標準,處理動作
iptables [-t TABLE] COMMAND CHAIN [num] 匹配標準 -j 處理辦法
匹配標準:
通用匹配
-s,--src:指定源地址
-d,--dst:指定目標地址
-p,{tcp|udp|icmp}:指定協議
-i,INITERFACE:指定數據報文流入的接口
可用於標準定義的鏈:OUTPUT,POSTROUTING,FORWARD
-o,INTERFACE:指定數據報文流出的接口
可用於標準定義的鏈:OUTPUT,POSTROUTING,FORWARD
擴展匹配
隱含擴展:不用特別指明有那個模塊進行的擴展,因爲此時使用-p {tcp|udp|icmp}
-p tcp
--dport目標端口,支持連續
--sport源端口,支持連續
--tcp-flags mask comp:只檢查mask指定的標誌位,是逗號分隔的標誌位列表;
comp:此列表中出現的標記位必須爲1,comp中沒出現,而mask中出現的,必須爲0;
--tcp-falgs SYN,FIN,ACK,RST SYN=--syn
--syn專門用來匹配tcp三次握手中的第一
-p icmp
--icmp-type
0:echo-reply
8:echo-request
-p udp
--sport
--dport
顯示擴展:必須指明有哪個模塊進行的擴展,在iptables中使用-m 選項可完成此功能
-m EXTESTION --spe-opt
state:狀態擴展
結合ip_conntrack追蹤會話的狀態
NEW:新連接請求
ESTABLISHED:已建立的連接
INVALID:非法連接
RELATED:相關聯的
- m state --state NEW,ESTABLISHED -j ACCEPT
首先要裝載ip_conntrack_ftp和ip_nat_ftp模塊,編輯/etc/sysconfig/iptables-config
例:iptables -A INPUT -d 192.168.100.100 -p tcp -m state --state ESTABLISHED.RELATED -j ACCEPT
multiport:離散的多端口匹配擴展
--source-ports
--destination-ports
--ports
例:-m multiport --destion-ports 21,22,80 -j ACCEPT
-m iprange
--src-range
--dst-range
-s,-d
-s IP,NET
192.168.0.0/16,192.168.100.3-192.168.100.100
例:iptables -A INPUT -p tcp -m iprange --src-range 192.168.100.3-192.168.100.100 --dport 22 -m state --state NEW ,ESTABLISHED -j ACCEPT
-m connlimit:連接數限制
! --connlimit-above 數字
例:iptables -A INPUT -d 192.168.100.7 -p tcp --dport 80 -m connlimit --connlimit-above 2 -j ACCEPT
-m limit
--limit [RATE]數字/時間
--limit-burst 一批放行多少
例:iptables -A INPUT -d 192.168.100.150 -p icmp --icmp-type 8 -m limit --limit 5/minute -j ACCEPT
iptables -A INPUT -d 192.168.100.150 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 6 -j ACCEPT
對FORWARD鏈的每個IP進行限速
PS: 所有命令都要區分大小寫。 限速的實現:在linux中有專門限速的軟件--tc,但TC的語法新手難以掌握,我們可以在防火牆上通過限定某個IP或某段IP在一秒內通過的數據
包的 數量來限速。 下面以限制192.168.0.2這個IP的網速爲例說說。 在桌面環境下打開/etc/syscofngi/iptables 有沒有發現,剛纔的設定全記錄在這個文件裏,現在做的就
在這個文件裏添加規則就得了。
1、先要找到filter
2、在filter下面一行增加以下兩行
iptables -A FORWARD -m limit -d 192.168.0.2 --limit 30/sec -j ACCEPT # 這句意思是限定每秒只轉發30個到達192.168.0.2的數據包(約每秒45KB 一個數據包是1.5KB)
iptables -A FORWARD -d 192.168.0.2 -j DROP #這句作用是超過限制的到達192.168.0.2的數據包不通過)
(3)、重啓系統,限速就實現了。
(4)、限制上傳速度也一樣,把上面兩條中的d 改爲s就得了。 限制每ip連接數 ,內核 2.3以上,否則要打conlimit補丁,重編譯內核。
iptables -I FORWARD -p tcp -s 192.168.0.0/24 -m connlimit --connlimit-above 20 -j REJECT
iptables -I INPUT -p tcp -s 192.168.0.0/24 -m connlimit --connlimit-above 20 -j REJECT
-m string 字符串
--algo {bm|kmp}這是兩種算法指定哪一種都行
--string "STRING"
例:iptables -I INPUT -d 192.168.100.150 -m string --algo kmp --string "法輪功" -j REJECT
iptables -I OUTPUT -s 192.168.100.150 -m string --algo kmp --string "法輪功" -j REJECT
-j TARGET
LOG
--log-prefix "STRING"
例:iptables -A INPUT -d 192.168.100.150 -p icmp --icmp-type 8 -j LOG --log-prefix "STRING"
保存規則:
# service iptables save
/etc/sysconfig/iptables
# iptables-save > /etc/sysconfig/iptables.2018052901
# iptables-restore < /etc/sysconfig/iptables.2018052901
命令:
管理規則:
-A:附加一條規則,添加在鏈的尾部
-I:CHAIN [num]:插入一條規則,插入爲對應的CHAIN上的第num條;
-D:CHAIN [num]:刪除指定鏈中的第num條規則;
-R:CHAIN [num]:替換指定規則;
管理鏈:
-F [CHAIN]:flush,清空指定規則鏈,如果省略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不是服務,但有服務腳本;服務腳本的主要作用在於管理保存的規則
裝載及移除iptables/netfilter相關的內核模塊;
iptables_nat,iptables_filter,iptables_mangle,iptables_raw,ip_nat,ip_conntrack
練習:規則的意義
#iptables -N clean_in #引用自定義鏈:#iptables -A INPUT -j calean_in
創建條新的鏈(名字)
#iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
#iptables -A clean_in -d 192.168.255.255 -p icmp -j DROP
#iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
#iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
#iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
#iptables -A clean_in -d 192.168.100.7 -j RETURN
#iptables -A INPUT -d 192.168.100.7 -j clean_in
#iptables -A INPUT -i lo -j ACCEPT
#iptables -A OUTPUT -o lo -j ACCEPT
#iptables -A INPUT -i eth0 -m multiport -p tcp --dport 53,113,135,137,139,445 -j DROP
#iptables -A INPUT -i eth0 -m multiport -p udp --dport 53,113,135,137,139,445 -j DROP
#iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP
#iptables -A INPUT -i eth0 -m multiport -p tcp --dport 1433,4899 -j DROP
#iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
--comment #註釋作用
#iptables -I FORWARD -d 192.168.3.150 -j ACCEPT -m comment --comment "radius server"
--reject-with icmp-port-unreachable是針對-j REJECT 用的
#iptables -A FORWARD -d 192.168.0.0/255.255.0.0 -j REJECT --reject-with icmp-port-unreachable
#以下選項控制返回的錯誤包的性質:
--reject-with type
The type given can be
icmp-net-unreachable
icmp-host-unreachable
icmp-port-unreachable
icmp-proto-unreachable
icmp-net-prohibited
icmp-host-prohibited or
icmp-admin-prohibited (*)
ssh:遠程連接
iptables -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 3 -j DROP
利用connlimit模塊將單IP 的併發設置爲3 :會誤殺使用NAT上網的用戶,可以根據實際情況增大該值
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
記錄訪問tcp 22端口的新鏈接,記錄名爲SSH
利用iptables的recent模塊來抵禦DOS攻擊
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
利用recent和state模塊限制單IP在300s內只能與本機建立3個新連接。被限制5分鐘後即可恢復訪問。
--update 是指每次建立連接都更新列表
--seconds 必須與--rcheck或者--update同時使用
--hitcount必須與--rcheck或者--uodate同時使用
1.限制80端口60秒內每個IP只能發起10個新連接,超過記錄日記及丟失數據包,可防CC及非僞造IP的syn flood
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix 'DDOS:' --log-ip-options
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT
備忘:每個IP目標端口爲80的新連接會記錄在案,可在/proc/net/xt_recent/目錄內查看,rcheck檢查此IP是否在案及請求次數,如果超過規則就丟棄數據包,否則進入下條規則並更新列表信息。
2.發送特定指定執行相應操作,按上例如果自己IP被阻止了,可設置解鎖哦。
iptables -A INPUT -p tcp --dport 5000 --syn -j LOG --log-prefix "WEBOPEN: "
#記錄日誌,前綴WEBOPEN:
iptables -A INPUT -p tcp --dport 5000 --syn -m recent --remove --name webpool --rsource -j REJECT --reject-with tcp-reset
#符合規則即刪除webpool列表內的本IP記錄
3.芝麻開門,默認封閉SSH端口,爲您的SSH服務器設置開門暗語。
iptables -A INPUT -p tcp --dport 50001 --syn -j LOG --log-prefix "SSHOPEN: "
#記錄日誌,前綴SSHOPEN:
iptables -A INPUT -p tcp --dport 50001 --syn -m recent --set --name sshopen --rsource -j REJECT --reject-with tcp-reset
#目標端口tcp50001的新數據設定列表爲sshopen返回TCP重置,並記錄源地址。
iptables -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds 15 --name sshopen --rsource -j ACCEPT
#開啓SSH端口,15秒內允許記錄的源地址登錄SSH。
nc host 50001 #開門鑰匙
telnet host 50001
nmap -sS host 50001
指定端口容易被破解密鑰,可以使用ping指定數據包大小爲開門鑰匙。
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 78 -j LOG --log-prefix "SSHOPEN: "
#記錄日誌,前綴SSHOPEN:
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 78 -m recent --set --name sshopen --rsource -j ACCEPT
#指定數據包78字節,包含IP頭部20字節,ICMP頭部8字節。
iptables -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds 15 --name sshopen --rsource -j ACCEPT
ping -s 50 host #Linux下解鎖
ping -l 50 host #Windows下解鎖
可能會遇到
iptables unknown error 2147483648
之類的錯誤
問題在於ipt_recent模塊默認的hitcount是有大小限制的
-
#modinfo ipt_recent
-
parm: ip_list_tot:number of IPs to remember per list (uint)
-
parm: ip_pkt_list_tot:number of packets per IP to remember (max. 255) (uint)
-
parm: ip_list_hash_size:size of hash table used to look up IPs (uint)
-
parm: ip_list_perms:permissions on /proc/net/ipt_recent/* files (uint)
方法:
修改/etc/modprobe.conf,增加:
options ipt_recent ip_pkt_list_tot=100
-
#service iptables stop
-
#modprobe -r ipt_recent
-
#modprobe ipt_recent
-
#service iptables start
ps:
如在modprobe -r ipt_recent時提示
WARNING: /etc/modprobe.conf line x: ignoring bad line starting with ´option
多半是/etc/modprobe.conf中的內容增加有問題
man 5 modprobe.conf
可以看到
options modulename option...
iptables的記錄:/proc/net/ipt_recent/SSH
也可以使用下面這句話記錄日誌:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"
NAT:Network Address Translation
DNAT:目標地址轉換,(PREROUTING)
SNAT:源地址轉換(POSTROUTING,OUTPUT)
-j SNAT
--to-source
ADSL:123.2.3.2 公網地址
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j SNAT --to-source 123.2.3.2
-j DNAT 需要指定對什麼服務進行轉發
--to-destination IP[:port] 端口映射
例:iptables -t nat -A PREROUTING -d 192.168.100.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.150
監在8080端口的話改爲
iptables -t nat -A PREROUTING -d 192.168.100.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.150:8080
PNAT:port NAT 端口轉換