網絡安全之iptables防火墻
1》各種傳輸方式到最後都會轉化為能夠通過網絡發送的數據格式:
1>文本格式;
2>二進制格式;
2》TCP三次握手連接,四次斷開,連接時客戶端是主動打開,服務器是被動 打開,處於監聽狀態;
TCP有限狀態機:
3》防火墻:可能是硬件,也可能是軟件;
規則:匹配標準和處理方法(除了制定的規則,還應有一種默認規則,默認規則一般處於關閉狀態);
匹配標準: IP:SIP,DIP
UDP:SPORT,DPORT
ICMP:icmp-type =SYN=1,ACK=0,FIN=0,RST=0 第一次連接
TCP:SPROT,DPORT====== =SYN=1,ACK=1,FIN=0,RST=0 第二次連接
= SYN=0,ACK=1,RST=0,FIN=0 第三次連接
防火墻用於數據報文過濾,Linux中的防火墻處於內核之中的TCP/IP模塊中;
4》文件/proc/sys/net/ipv4/ip_forward 中可以開啟本機轉發功能;
鉤子函數(hook function):TCP/IP協議棧上的一個補充;
1>prerouting 路由決策之前====》用於目標IP地址轉換
2>input 進入本機
3>output 從本機出來
4>forward 轉發
5>postrouting 路由決策之後====》用於源IP地址轉換
四表五鏈:
filter表(過濾):
input
output
forward
nat表(地址轉換):
prerouting
postrouting
output
mangle表(拆開,修改,封裝):
prerouting
input
forward
output
postrouting
raw表(不作修改,原始格式):
prerouting
output
************1>可以使用自定義鏈,但只有在被調用的時候才能發揮作用,而且如果沒有自定義鏈中的任何規則匹配,還應該有返回機制,用戶可以刪除自定義的空鏈, 默認鏈無法刪除;
2>每個規則都有兩個內置的計數器,一個用來記錄被匹配的報文的個數,一個記錄被匹配的報文的大小之和;
5》規則:匹配標準和處理方法;===========》用rpm ql iptables 命令可以查看是否按照了iptables模塊
語法:
iptables [-t table] command chain [num] 匹配標準 -j 處理方法
通用匹配:
-s; --src 指定原地址
-d; --dst 指定目標地址
-p {tcp,udp,icmp} 指定協議
-i , interface 指定數據報文流入的網卡
-o , interface 指定數據報文流出的網卡
****-i一般用於PREROUTING,INPUT,RORWARD這三條鏈;
-o一般用於POSTROUTING,OUTPUT,FORWARD這三條鏈;
-j: TARGET(動作)
ACCEPT 接受通過
DROP 丟棄
REJECT 拒絕
eg: iptables -t filter -A INPUT -s 172.16.0.0/16 -j DROP
i ptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -j DROP
匹配標準:
通用匹配:自身能夠完成的檢查;
擴展匹配:依賴於擴展模塊才能完成的檢查;
擴展匹配:
隱含擴展:不用特別指明由哪個模塊來進行的擴展,因為此時使用了-p {tcp,udp,icmp};
顯示擴展:必須指明由哪個模塊進行的擴展,在iptables中使用-m選項來完成此項功能;
******/lib/iptables文件下有許多擴展匹配所依賴的擴展模塊;
5》相關命令:
1>管理規則的命令:
-A:附加一條規則,添加在鏈的尾部;
-I CHAIN [num] :插入一條規則,插入為對應鏈上的第num條,不加num則默認為第一條;
-D CHAIN [num] : 刪除指定鏈中的第num條規則;
-R CHAIN [num] : 替換指定鏈上的規則
2>管理鏈的命令:
-F [CHAIN]: 清空指定規則鏈,如果省略CHAIN,則可以實現刪除對應表中的所有鏈;
-P CHAIN : 設定 指定鏈的默認策略;
-N :自定義一個新的空鏈;
-X:刪除一個自定義的空鏈;
-Z:置零指定鏈中所有規則的計數器;
-E:重命名自定義的鏈;
3>查看類的命令:
-L : 顯示指定表中的規則;
-n : 以數字格式顯示主機地址和端口號;
-x: 顯示精確值,不進行估算;
-v:顯示詳細信息;
--line-numbers: 顯示規則號碼;
4>動作(target)參數:
ACCPT: 接受通過
DROP: 丟棄
REJECT: 拒絕
DNAT: 目標地址轉換
SNAT: 源地址轉換
REDIRECT: 重定向/端口重定向
MASQUERADE: 地址偽裝(源地址轉換)
LOG: 日誌
MARK: 打上標誌
5>擴展匹配:
隱含擴展:
-p tcp
--sport port /port-port 源端口,也可以使用連續的端口號
--dport 目的端口
--tcp-flags 標誌位
--tcp-flags mak comp
--tcp-flags SYN,FIN,ACK,RST SYN TCP的第一次連接握手
****mask:只檢查此列表中指定的標誌位,是逗號分隔的標誌位列表;
comp:此列表中出現的標誌位必須為1,此列表中沒出現,mask中出現的必須為0;
-p icmp
--icmp-type
0 回送應答
8 回送請求
-p udp
--sport
--dsport
eg: 自己可以ping 別人規則:
iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 0 -j ACCEPT
eg: 本機IP為172.16.100.7,開放本機的sshd服務; 22/tcp
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT
iptables -t fileter -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
6》iptables不是服務,但有服務腳本,服務腳本的主要作用在於管理保存的規則;
lsmod |grep iptables 命令可以查看相關的iptables的模塊
iptables的相關模塊可以裝載及移除:
iptables_nat,iptables_filter,iptables_mangle,iptables_raw,ip_conntrack
指定默認規則,除了上述的sshd服務外其他的都不允許訪問:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
將WEB服務可以訪問的規則放在第一條示例:
iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -j ACCEPT
iptables -I OUTPUT -s 172.16.100.7 -p tcp --sport 80 -j ACCEPT
允許自己能夠ping通自己的規則定義示例:
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
7》ip_conntrack: 連接追蹤模塊:
/proc/net/ip_conntrack 這個內核文件保存著當前系統上其他主機與當前主機建立的連接關系,也可以用iptstate命令來查看這些連接關系;
iptstate -t 可以顯示當前連接的每種連接的個數;
service iptables stop可以移除iptables加載的所有相關內核模塊,移除之後,/proc/net/ip_conntrack文件就不存在了;
modprobe ip_conntrack 可以手動裝載ip_conntrack模塊,裝載之後那個文件就有了;
cat /proc/sys/net/ipv4/ip_conntrack_max 文件來定義/proc/net/ip_conntrack 文件最大可以保存多少個連接記錄;
modprobe -r nfnetlink 移除模塊nfnetlink;
8》顯式擴展:
-m EXTESTINN --spe-opt
state:狀態擴展,結合ip_conntrack追蹤會話的狀態;
NEW: 新連接的請求
ESTABLISHED: 已建立的連接
INVALID: 非法連接
RELATED: 相關聯的
-m state --state NEW,EXTABLISHED, - j ACCEPT
****定義好規則之後可以用命令service iptables save 來保存在/etc/sysconfig/iptables 中,這樣重啟後規則也不會失效;iptables
- save >/etc/sysconfig/iptables.2017.2 可以將文件保存在特定的文件中;iptables -restore </etc/sysconfig/iptables.2017.2可以使這些規則生效;
示例:
server: 172.16.100.7 開放sshd,httpd服務,設置好追蹤連接;
iptables -A INPUT -d 192.168.1.106 -p tcp --dport 22 -m state --state NEW,ESTABLISHED, -j ACCETP
iptables -A OUTPUT -s 192.168.1.106 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
WEB服務也一樣,只需改端口就好;
iptstate 命令可以查看連接狀態;
sysctl -w net.ipv4.ip_conntrack_max=65536 命令修改保存連接記錄的最大值,但只能臨時有效;
cat /proc/sys/net/ipv4/ip_conntrack_max 命令來查看連接記錄的最大值;
在文件/etc/sysctl.conf 文件中修改相關值可以永久有效;
在目錄/proc/sys/net/ipv4/netfilter 下有很多關於各種連接的超時設置的文件;
示例:放行別人ping自己
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -jACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
iptables -L -n --line-numbers 可以顯示規則的行號
*********高效規則制定:可以將相關規則合為一條,任意協議任意IP保持連接的都可以出去;
iptables -I OUTPUT -s 172.16.100.6 -m state --state ESTABLISHED -j ACCEPT
FTP服務:基於本機的MYSQL認證登錄;
iptables -A INPUT -d 172.16.100.6 -p tcp --dport 21 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INTPUT -d 172.16.100.7 -p tcp -m state --state RELATED -j ACCEPT
修改OUTPUT鏈的第一條規則:
iptables -R OUTPUT 1 -s 172.16.100.7 -m state --state ESTABLISHED,RELATED -j ACCEPT
*****在制定關於ftp規則之前首先要裝載ip_conntrack_ftp 和ip_nat_ftp模塊;
在文件/etc/sysconfig/iptables-config 中編輯IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
===================最終高效規則:
9》multiport :離散的多端口匹配擴展
--source-ports
--destination-ports
--ports
-m multiport --destination-port 21,22,80 -j ACCEPT
iptables -I INPUT 2 -d 172.16.100.7 -p tcp -m multination --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
在所有的規則中可以使用英文字符!來表示條件取反:
-s ! 172.16.100.7
-m iprange : 指定範圍內的IP地址;
--src-range
--dst-range
iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
*****也可以加!取反,取這個範圍之外的IP地址;
-m connlimit:連接數限制
! --connlimit-above n 連接數上限 n (允許<n人訪問)
每個用戶允許連接數為兩個以內:
iptables -A INPUT -d 172.16.100.7 -p tcp --dprot 80 -m connlimit ! --connlimit-above 2 -j ACCEPT
-m limit : 流量控制
--limit RATE (速率) 每個時間段允許連接多少個
--limit-burst number 允許一下子湧來多少個
eg: 對ping進行設置:
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 6 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-m string 對一些特定的字符串進行限制(網頁中的內容)
--algo {bm|kmp}
--string “STRING”
iptables -I OUTPUT -s 172.16.100.7 -m string --alge kmp --string “h7ng” -j REJECT
10》-j LOG 記錄日誌,如果鏈中有ACCEPT,DROP,REJECT等動作,要將LOG放在第一條;
--log-prefix 存放日誌前綴
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -j LOG --log-prefix “firewall log foricmp--”
用命令tail /var/log/messages 來查看相關日誌
11》自定義規則鏈:
iptables -N 鏈名
iptables -N clean_in
在自定義規則鏈下添加規則:
iptables -I INPUT -j clean_in 剛進來就調用自定義的鏈
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
iptables -A clean_in -d 172.16.100.7 -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-lags ALL NONE -j DROP
iptables -A clean_in -d 172.16.100.7 -j RETURN 返回主鏈
12》利用iptables的recent模塊來抵禦DOS攻擊:
SSH:遠程連接
iptables -I INPUT 2 -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -I INPUT 3 -d 172.16.100.7 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT 4 -d 172.16.100.7 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 ---name SSH -j DROP
1>利用connlimit模塊將單IP的並發設置為3;(會誤殺使用NAT上網的用戶,可以根據實際情況增大該值)
2>利用recent和state模塊限制單IP在300s內只能與本機建立2個新連接,被限制五分鐘後即可恢復訪問;
第二句是記錄訪問tcp 22號端口的新連接,記錄名稱為SSH,--set 記錄數據包的來源IP,如果IP 已經存 在將更新已經存在的條目;
第三句是指SSH記錄中的IP,300s內發起超過3次連接則拒絕此IP的連接;
--updat 是指每次建立連接都更新列表
--seconds 必須與--rcheck 或者--update 同時使用
--hitcount 必須與--rcheck 或者 --upddate 同時使用
3>iptables的記錄:/proc/net/ipt_recent/SSH,也可以使用下面的命令來記錄日誌;
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --seconds 300 --hitcount 3 -j LOG --log-prefix “SSH Attack”
13》NAT: 網絡地址轉換
DNAT: 目標地址轉換
SNAT: 源地址轉換 (POSTROUTING,OUTPUT)
****在文件/proc/sys/net/ipv4/ip_forward:1中開啟路由轉發功能,這種方式暫時有效;
在文件/etc/sysctl.conf中修改net.ipv4.ip_forward=1永久有效;
-j SNAT
--to-source IP
--to-source IP-IP 可以指向多個IP,動態IP地址池
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.7
=====ADSL:123.2.3.2
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 123.2.3.2
=====禁止本機與外網進行ping但不禁止其他通信:
iptables -A FORWARD -s 192.168.10.0/24 -p icmp -j REJECT
=====只允許內網主機訪問外網,ping 外網,不允許外網的訪問內網,ping 內網
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p icmp --icmp-typpe 8 -m state --state NEW -j ACCEPT
======放行外網的FTP服務需要使用RELATED狀態:
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
要記得開啟:ip_nat_ftp 和ip_conntrack_ftp兩個模塊;在文件/etc/sysconfig/iptables-config中添加;
DNAT:外網訪問內網;
iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.22
PNAT: 端口轉換
iptables -t nat -R PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.22:8080
拒絕對內網中的網站包含特定字符的訪問:
iptables -A FORWARD -m string --algo kmp --string “h7ng” -j DROP
====丟棄發送至192.168.1.1的所有數據以及分片數據:
iptables -A OUTPUT -f -d 192.168.1.1 -j DROP
====記錄192.168.0.1至192.168.0.22地址段內所有的主機發送給路由要求轉發的數據包,並允許轉發這些數據包
iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.22 -p tcp --dport 80 -j LOG
iptables -A FORWAR -m iprange --src-range 192.168.0.1-192.168.0.22 -p tcp --dport 80 -j ACCEPT
14》防火墻備份與還原
相關命令:
iptables-save >/etc/sysconfig/iptables
iptables-save >firewall.bak
iptables-restore <firewall.bak
15》iptables之layer7(針對服務進行的七層過濾)
1> 內核編譯:
2.6----------》3.0
單內核:模塊化(文件系統;驅動;安全相關功能)
配置:.config(/proc/cpuinfo,lspci,lsusb,hal-device)
make menuconfig
make gconfig
make kconfig
make config
編譯:make
只編譯部分源碼:
make SUBDIR-arch
make drivers/net/pcnet32.ko
make dir
可以將編譯結果轉存到其他地方:
make O=/path/to/somewhere
安裝內核模塊:
make modules_install
安裝內核:
make install
2>layer7
netfilter:rules
iptables: 語法正確
網絡安全之iptables防火墻