IP報文html
TCP報文mysql
源端口和目標端口:各佔2個字節,16比特的端標語加上32比特的IP地址,共同構成至關於傳輸層辦事接見點的地址,即「插口」;web
這些端口可用來將若干高層和談向下複用;sql
序號字段和確認序號字段:編程
序號:佔4個字節,是本報文段所發送的數據項目組第一個字節的序號。在TCP傳送的數據流中,每個字節都有一個序號。例如,一報文段的序號爲300,而起數據供100字節,則下一個報文段的序號就是400;小程序
確認序號:佔4字節,是指望收到對方下次發送的數據的第一個字節的序號,也就是指望收到的下一個報文段的首部中的序號;vim
由於序號字段有32比特長,能夠對4GB的數據進行編號,如許就可包管當序號反覆應用時,舊序號的數據早已在收集中消散了;緩存
數據偏移字段服務器
數據偏移:佔4比特,默示數據開端的處所離TCP報文段的肇端處有多遠。這實際上就是TCP報文段首部的長度。由於首部長度不固定,是以數據偏移字段是需要的。網絡
保存字段: 6比特,供日後應用,今朝置爲0。
6個比特的把握字段
緊急比特URGent:當URG=1時,註解此報文應儘快傳送,而不要按原本的列隊次序來傳送。與「緊急指針」字段共同應用,緊急指針指出在本報文段中的緊急數據的最後一個字節的序號,使接管方能夠知道緊急數據共有多長;
確認比特ACK:只有當ACK=1時,確認序號字段纔有意義;
急迫比特PSH:當PSH=1時,註解懇求遠地TCP將本報文段當即傳送給其應用層,而不要比及所有緩存都填滿了以後再向上交付。
復位比特ReSeT:當RST=1時,註解呈現嚴重錯誤,必須開釋鏈接,而後再重建傳輸鏈接。復位比特還用來拒絕一個不法的報文段或拒絕打開一個鏈接;
同步比特SYN:在建樹鏈接時應用,當SYN=1而ACK=0時,註解這是一個鏈接懇求報文段。對方若同意建樹鏈接,在發還的報文段中使SYN=1和ACK=1。是以,SYN=1默示這是一個鏈接懇求或毗鄰接管報文,而ACK的值用來區分是哪種報文;
終止比特FINal:用來開釋一個鏈接,當FIN=1時,註解欲發送的字節串已經發完,並請求開釋傳輸鏈接;
窗口字段
窗口Window:佔2字節,默示報文段發送方的接管窗口,單位爲字節。此窗口告訴對方,「在未收到個人確認時,你能夠或許發送的數據的字節數至可能是此窗口的大小。」
通知窗口advertised window:接管端按照其接管才能承諾的窗口值,是來自接管端的流量把握。接管端將通知窗口的值放在TCP報文的首部中,傳送給對方。
擁塞窗口congestion window:是發送端按照收集擁塞景象得出的窗口值,是來自發送端的流量把握。
查驗和覆蓋了所有的TCP報文段:TCP首部和TCP數據。這是一個強迫性的字段,由發端策畫和存儲,由收端進行驗證。
選項字段允許每臺主機設定能夠或許接管的最大TCP載荷才能(缺省536字節) 。
TCP是主機對主機層的傳輸控制協議,提供可靠的鏈接服務,採用三次握手確認創建一個鏈接:
位碼即tcp標誌位,有6種標示:
SYN(synchronous創建聯機)
ACK(acknowledgement 確認)
PSH(push傳送)
FIN(finish結束)
RST(reset重置)
URG(urgent緊急)
Sequence number(順序號碼)
Acknowledge number(確認號碼)
LISTEN:偵聽來自遠方的TCP端口的鏈接請求
SYN-SENT:再發送鏈接請求後等待匹配的鏈接請求
SYN-RECEIVED:再收到和發送一個鏈接請求後等待對方對鏈接請求的確認
ESTABLISHED:表明一個打開的鏈接
FIN-WAIT-1:等待遠程TCP鏈接中斷請求,或先前的鏈接中斷請求的確認
FIN-WAIT-2:從遠程TCP等待鏈接中斷請求
CLOSE-WAIT:等待從本地用戶發來的鏈接中斷請求
CLOSING:等待遠程TCP對鏈接中斷的確認
LAST-ACK:等待原來的發向遠程TCP的鏈接中斷請求的確認
TIME-WAIT:等待足夠的時間以確保遠程TCP接收到鏈接中斷請求的確認
CLOSED:沒有任何鏈接狀態
原理TCP
3次握手,4次斷開
TCP/IP協議中,TCP協議提供可靠的鏈接服務,採用三次握手創建一個鏈接,如圖1所示。
(1)第一次握手:創建鏈接時,客戶端A發送SYN包服務器B,並進入SYN_SEND狀態,等待服務器B確認。
(2)第二次握手:服務器B收到SYN包,必須確認客戶A的SYN,同時本身也發送一個SYN包(SYN=k),即SYN+ACK包,此時服務器B進入SYN_RECV狀態。
(3)第三次握手:客戶端A收到服務器B的SYN+ACK包,向服務器B發送確認包ACK,此包發送完畢,客戶端A和服務器B進入ESTABLISHED狀態,完成三次握手。
完成三次握手,客戶端與服務器開始傳送數據。
確認號:其數值等於發送方的發送序號 +1(即接收方指望接收的下一個序列號)。
1.01 小時
關閉鏈接: 下面兩張圖一塊兒看
因爲TCP鏈接是全雙工的,所以每一個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的鏈接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP鏈接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另外一方執行被動關閉。
CP的鏈接的拆除須要發送四個包,所以稱爲四次揮手(four-way handshake)。客戶端或服務器都可主動發起揮手動做,在socket編程中,任何一方執行close()操做便可產生揮手操做。
四次斷開 流程
(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送。
(2)服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1。和SYN同樣,一個FIN將佔用一個序號。
(3)服務器B關閉與客戶端A的鏈接,發送一個FIN給客戶端A。
(4)客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1
描述過程:
Client調用close()函數,給Server發送FIN,請求關閉鏈接;Server收到FIN以後給Client返回確認ACK,同時關閉讀通道(不清楚就去看一下shutdown和close的差異),也就是說如今不能再從這個鏈接上讀取東西,如今read返回0。此時Server的TCP狀態轉化爲CLOSE_WAIT狀態。
Client收到對本身的FIN確認後,關閉 寫通道,再也不向鏈接中寫入任何數據。
接下來Server調用close()來關閉鏈接,給Client發送FIN,Client收到後給Server回覆ACK確認,同時Client關閉讀通道,進入TIME_WAIT狀態。
Server接收到Client對本身的FIN的確認ACK,關閉寫通道,TCP鏈接轉化爲CLOSED,也就是關閉鏈接。
Client在TIME_WAIT狀態下要等待最大數據段生存期的兩倍,而後才進入CLOSED狀態,TCP協議關閉鏈接過程完全結束。
Linux 網絡防火牆
Netfilter:frame
Iptables 數據報文過濾,NAT,mangle等規則生成的工具
網絡:IP報文首部,TCP報文首部
防火牆: 硬件,或者也是軟件
真正實現防火的是規則(匹配標準,處理辦法)
Framework
默認規則
開
關
規則:匹配標準
Ip SIP(源IP) DIP(目標IP)
TCP SPORT(源端口) DPORT(目標端口)
UDP SPORT(源端口) DPORT(目標端口)
ICMP icmp-type 報文類型 (icmp主要用於ping的)
Hock function 鉤子函數
5個鉤子函數:
Input 在選路肯定以後,且數據包的目的是本地主機
Output 來自本機進程的數據包在其離開本地主機的過程當中
Forward 目的地是其它主機地數據包
Prerouting 在完整性校驗以後,選路肯定以前
postrouting 在數據包離開本地主機「上線」以前
能Filter (過濾) 表
Input
Output
Forward
能Nat地址轉換 表
Prerouting
postrouting
能Mangle(拆開,修改,封裝) 表
Prerouting
postrouting
Input
Output
Forward
防火牆聯鏈
爲了減小「無效匹配」次數,除了能夠調整防火牆的規則順序外,還有一個法寶就是使用用戶自定義鏈。不過,在使用用戶自定義鏈以前,咱們必須先想好如何分類這些規則才能達到最精簡的效果。好比,能夠根據「上層協議」來區分,也能夠根據「應用層協議」區分,也能夠根據ip來劃分,總之沒有必定的標準,也沒有永遠正確的答案,只要可以讓整個防火牆的無效匹配次數降到最低,那就是咱們所須要的。
每一個規則都有兩個內置的計數器
被匹配的報文個數
被匹配的報文大小之和
匹配標準:
通用匹配
-s 或者 --src 指定地址
-d 或者 --dst 指定目標地址
-p {tcp | udp | icmp } 指定協議
-i interface 指定數據報文流入的藉口
-o interface 指定數據報文流出的接口
-j target 跳轉
Accept 容許
Drop 拒絕
Reject 拒絕
擴展匹配:
隱含擴展:不用特別指明那個模塊進行的擴展,所以此時使用
-p {tcp|udp|icmp|
--sport 源端口
-dport 目標端口
--tcp-flags mask comp 只檢查mask指定的標誌位,是逗號分隔的標誌列表, comp :此列表中出現的標記爲必須爲1, comp中沒出現,而mask中出現的,必須爲0
例 --tcp-flags SYN,FIN,ACK,RST SYN
表明這四個標誌位,只有SYN爲 1,其餘都爲0,也就表明,這是三次握手的第一次 ,這個語法的簡寫是 --syn
-p icmp
--icmp-type
0 :echo-reply
8 : echo-request
-p udp
--sport
--dport
顯示擴展,必須指明那個模塊進行的擴展,在iptables中,使用 -m選項可完成此功能
State:狀態擴展
結合ip_conntrack 追蹤回話的狀態
NEW 新鏈接請求
ESTABLISHED:已創建的鏈接
INVALID 非法鏈接
RELATED 相關聯的
-m state --state NEW , ESTABLISHED-j ACCEPT
檢查狀態,而且狀態爲 NEW(新鏈接請求的) , ESTABLISHED ( 已經創建的鏈接)) 經過
根據狀態鏈接,來實現數據包報文的放行
iptables -t filter -A INPUT -d 192.168.12.11 -p tcp --dport 22 -j ACCEPT
Service iptables save 保存防火牆規則
防火牆規則保存在 /etc/sysconfig/iptables
Cat /etc/sysconfig/iptables
而後在
Service iptables restart
(按理說這時候防火牆規則應清空的)
Iptables -L -n
能夠看到 即便防火牆重啓了,規則還在,因此我想重啓的時候防火牆會讀取 /etc/sysconfig/iptbales 裏的內容
保存防火牆的規則有兩種
1 service iptables save
默認保存在 /etc/sysconfig/iptables
2 iptables-save > /etc/sysconfig/iptables.2016
指定防火牆規則保存在 /etc/sysconfig/iptables.2016文件裏
重啓之後,要第二種方式保存規則的辦法生效
iptables-restore < /etc/sysconfig//iptables.2016
是恢復文件/etc/sysconfig//iptables.2016 中的規則到當前系統
Iptables [-t talble(表名) ] COMMAND chanin [num] 匹配標準 -j 處理辦法
Iptables -t filter -A INPUT -s 172.16.0.0/16 -j DROP
拒絕172.16.0.0 網段的 IP段
馬哥防火牆第二節課
命令
管理規則
-A 添加一條規則,添加在鏈的尾
-I CHIN [num] 插入一條規則,插入爲對應chin上的第num條
-D CHIN [num] 表示刪除指定規則:
-R CHIN [num] 替換指定的規則
管理鏈
-F【chain】 flush 清空指定規則鏈
-P CHAIN 設定指定鏈的默認策略
-N 自定義新的空鏈
-X 刪除一個自定義的空鏈
-Z 重置規則鏈中全部的規則計數器
-E 重命名自定義鏈條
查看類
-L 指定表中的規則
-n: 以數字格式顯示主機地址和端口號
-v 顯示規則詳細信息
-x 顯示計數器的精確值
--line-numbers 顯示規則號碼
Iptables -L -n -v 顯示防火牆詳細規則
動做(target):
ACCEPT 放行
DROP 丟棄
REJECT 拒絕
DNAT 目標地址轉換
SNAT 源地址轉換
Redirect 端口重定向
NASQUEADE 地址假裝
LOG 日誌
MARK 打標機
放行 192.168.12.33 對於本機192.168.12.32 sshd 22/tcp的訪問
Iptables -t filter -A INPUT -s 192.168.12.33 -d 192.168.12.32 -p tcp --dport 22 -j ACCEPT
Iptables -t filter -A OUTPUT -s 192.168.12.32 -d 192.168.12.33 -p tcp --sport 22 -j ACCEPT
Iptables -L -n
service iptables status
Iptables 不是服務,可是有服務腳本,服務腳本主要做用在於管理保存的規則
Lsmod
lsmod 命令:是一個小程序,用來顯示文件、proc/modules的信息,也就是顯示當前內核模塊裝載的模塊。主要用來 查看防火牆的模塊有沒有開啓
Service iptables start
yum -y install httpd vsftpd mysql-server
放行 192.168.12.33 對於本機192.168.12.32 sshd 22/tcp的訪問
Iptables -t filter -A INPUT -s 192.168.12.33 -d 192.168.12.32 -p tcp --dport 22 -j ACCEPT
Iptables -t filter -A OUTPUT -s 192.168.12.32 -d 192.168.12.33 -p tcp --sport 22 -j ACCEPT
Iptables -L -n -v
顯示防火牆詳細信息
Service httpd start
打開網頁輸入192.168.12.32 (web服務器) 能夠訪問
而後
Iptables -P INPUT DROP
Iptables -P OUTPUT DROP
Iptables -P FORWARD DROP
在Web服務器上拒絕全部放行和經過的端口
會發現看不到了,防火牆拒絕了全部的訪問,除了你剛剛設置的ssh訪問
用真實機(同網段的) 也ping不通 web服務器的
容許別的主機訪問本機的80端口 ,
Iptables -I INPUT -d 192.168.12.32 -p tcp --dport 80 -j ACCEPT
報文能進來,可是不能出去,因此還要添加
iptables -I OUTPUT -s 192.168.12.32 -p tcp --sport 80 -j ACCEPT
如今在用真實機子訪問 192.168.12.32 web服務器
能運行了
192.168.12.32 只有80端口和22端口能讓別的主機訪問,真實主機 依然仍是ping不通 192.168.12.32
切換到 Web服務器(192.168.12.32)
如今ping 本身也ping不通了
設置讓本身可以ping通本身
iptables -A INPUT -s 192.168.12.32 -d 192.168.12.32 -i lo -j ACCEPT
iptables -A OUTPUT -s 192.168.12.32 -d 192.168.12.32 -o lo -j ACCEPT
除了ping本身之外,ping 任何人也ping不通的
如今設置咱們能夠ping任何人,但別人不能ping咱們,ping 是icmp協議
iptables -A OUTPUT -s 192.168.12.32 -p icmp --icmp-type 8 (固定值) -j ACCEPT
iptables -A INPUT -d 192.168.12.32 -p icmp --icmp-type 0 (固定值) -j ACCEPT
如今ping同網段的別的主機
Ping 192.168.12.30
如今們能夠ping任何人,但別人不能ping咱們
若是是一臺web服務器,那麼防火牆設置 就請求80端口,那麼就可以預防DDOS,洪水攻擊
Ip_conntrack
Linux中有一個基於Netfilter的鏈接跟蹤機制,即ip_conntrack,每個conntrack表示的就是一個流,該流裏面保存了大量的信息字段,這些字段本地有效,指導着數據包的轉發策略
/proc/net/ip_conntrack 找不到這個配置文件,暈
在 Red hat 6 當中。配置文件的位置在於
vim /proc/net/nf_conntrack
能夠看到,red hat 6( ip是192.168.12.11 ) 只跟真實主機有ssh服務器的聯繫
或者你用
Iptstate 提供 top 類界面,可用來實時查看 iptables 的狀態。
192.168.12.1(也就是本機) 端口63574(隨機) 鏈接 主機 192.168.12.11 的ssh服務器
若是沒有這個命令 就 yum install iptstate
Iptstate -t
iptstate命令以top指令相似的風格時顯示Linux內核中iptables的工做狀態。
顯示全部連接的個數
Service iptables stop
一中止模塊,追蹤功能也中止了
查不到任何信息
modprobe nf_conntrack_ipv4
手動把模塊裝上去
cat /proc/net/nf_conntrack
本地和真實主機的ssh鏈接信息 出現了
Ip_conntrack 有便利,有壞處,慎用
實驗
有個服務器
192.168.12.11
放行 sshd ,httpd 服務
切換到 192.168.12.11 服務器
iptables -A INPUT -d 192.168.12.11 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
放行任意用戶 鏈接本地(192.168.12.11)的22端口,而且,狀態是 NEW,(新鏈接請求
) ESTABLISHED (已經鏈接的)
Lsmod | grep ip
能夠看到,已經開始追蹤了
iptables -A OUTPUT -s 192.168.12.11 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
讓鏈接的用戶出去 狀態是 已經創建的鏈接 22端口
iptables -A INPUT -d 192.168.12.11 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
放行任意用戶 鏈接本地(192.168.12.11)的80端口,而且,狀態是 NEW,(新鏈接請求
) ESTABLISHED (已經鏈接的)
iptables -A OUTPUT -s 192.168.12.11 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
讓鏈接的用戶出去 狀態是 已經創建的鏈接 80端口
iptables -P INPUT DROP
iptables -P OUTPUT DROP
拒絕全部連接,端口
本機輸入192.168.12.11
能夠訪問
Iptstate
查看鏈接狀態
能夠看到本機的 192.168.12.1 (真實主機) 鏈接了 80端口,等信息
在red hat 中
Nf_Conntrack 保存 能夠鏈接多少條 鏈接數的配置文件在
/proc/sys/net/netfilter/nf_conntrack_max
視頻裏是
/proc/sys/net/ipv4/ip_conntrack_max 可是我這裏沒有,由於視頻版本太舊了
理解nf_conntrack和調整nf_conntrack_max nf_conntrack 工做在 3 層,支持 IPv4 和 IPv6,而 ip_conntrack 只支持 IPv4。目前,大多的 ip_conntrack_* 已被 nf_conntrack_* 取代,不少 ip_conntrack_* 僅僅是個 alias,原先的 ip_conntrack 的 /proc/sys/net/ipv4/netfilter/ 依然存在,可是新的 nf_conntrack 在 /proc/sys/net/netfilter/ 中,這個應該是作個向下的兼容
這裏就不作修改了
因此得nf_Conntrack 的配置文件
如今放行別人ping本身
iptables -A INPUT -d 192.168.12.11 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
容許任何 地址從我這裏進來,走的是icmp ( 也就是ping ) 協議
iptables -A OUTPUT -s 192.168.12.11 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
容許任何 地址從我這裏出去,走的是icmp ( 也就是ping ) 協議
而後打開真實主機,看看是否可以ping通
OK
Iptables -L -n --line-numbers
查看防火牆規則,而且顯示行號
能夠看到,出去的規則有三條,如今我要把他設置成一條規則
iptables -I OUTPUT -s 192.168.12.11 -m state --state ESTABLISHED -j ACCEPT
而後不斷的 iptables -L -n -v
你會看到,放出的規則當中,一直都是第一條匹配到了,獲得了數據,其餘的均可以刪了
不斷的
Iptables -D OUTPUT 2
刪除 OUTPUT 放行的防火牆規則中的第二條規則
Iptables -L -n -v
而後看到放出的規則當中,只有一條通用的規則
如今用 真實主機去訪問 192.168.12.11 服務器的80端口。看看是否能通
OK
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
容許本身ping本身
如下的實驗沒成功 不要看
如今 192.168.12.11
Service vsftp start
開啓 ftp 服務
而後用另一臺機子(192.168.12.39)連接,
ftp 192.168.12.39
帳號 ftp (ftp默認機制有匿名用戶,不須要密碼)
密碼
Ls
這時候你ls 會看到,ls沒用,由於他是如今是數據鏈接了,由於咱們只開啓了21端口,只能連接ftp,不能傳送數據 ,此時ftp用戶鏈接着本地的Ftp 服務器,因此他們們的狀態是 相關聯 ( RELATED)的,
再切換回 192.168.12.11
Iptables -A INPUT -d 192.168.12.1 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
容許 任何ip 訪問本地的 192.168.12.1 只要他的狀態是 相關聯的,或者是一直保持聯繫的
想要 ftp 可以ls 必需要 裝上兩個模塊 (ip_conntrack_ftp 和 ip_nat_ftp ),而且
在防火牆規則當中,放行的規則要包過
RELATED,ESTABLSHED
如今
vim /etc/sysconfig/iptables-config
IPtables -L -n
在放行的規則添加規則, 在進入的時候添加 規則
iptables -A INPUT -d 192.168.12.11 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
放行只要狀態是 相關聯的,和狀態是已經鏈接的任何IP
如今修改 放行的規則,加上RELATED 狀態
iptables -R OUTPUT 1 -s 192.168.12.11 -m state --state ESTABLISHED,RELATED -j ACCEPT
是要狀態是正在鏈接着的,相關聯的 通通放行
第三節課
顯示擴展,必須指明那個模塊進行的擴展,在iptables中,使用 -m選項可完成此功能
-m iprange
--src-range
--dst-ranges
iptables -A INPUT -p tcp -m iprange --src-range 192.168.12.1-192.168.12.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
放行狀態是 新鏈接的,或者 已經鏈接的 192.168.12.1 - 192.168.12.100 任意IP 鏈接本地的22號端口
-m connlimit 鏈接數限制
例:限制某個IP最多同時只能發起 多少個鏈接請求
! --connlimit-above n 低於了n個
iptables -A INPUT -d 192.168.12.11 -p tcp --dport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT
訪問192.168.12.11 IP 80端口的 ,同時低於兩個請求就放行,超過兩個以上不放行
-m limit
--limit 速率 (每秒多少人)
--limit-burst 給的是上限 (一批多少人)
Iptables -D INPUT 1
刪除進來的第一個規則
-m string
--algo {bm | kmp }
--string 「字符串」
切換到 192.168.12.11 服務器
在 /var/www/html/index.html
裏編寫h7n9 dw a dwa d dda gd
用真實主機去訪問
如今我要用防火牆去過濾某些字符串,只要頁面包含 h7n9 的字符串通通拒絕
iptables -A OUTPUT -s 192.168.12.11 -m string --algo kmp --string "h7n9" -j REJECT
客戶端 訪問內容包含 「h7n9」的字符串通通拒絕
如今用真實主機訪問下試試
過濾成功
iptables -A INPUT -d 192.168.12.11 -p icmp --icmp-type 8 -j LOG --log-prefix "--firewall log for icmp-- "
記錄 任意IP 只要ping了本身 ,都會記錄在日誌文件當中,
tail -F /var/log/messages
與此同時我用192.168.12.100 的主機
Ping 192.168.12.11
而後在切換到192.168.12.11
能夠看到別人在ping 咱們,而且有詳細的參數
’
第四節課 nat及過濾
Iptables -N clean_in
定義一條新的規則鏈條
Iptables -L -n
能夠看到第三個規則鏈條
Iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
默認拒絕全部
iptables -L -n --line-numbers
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
--syn 是三次握手的第一次的簡寫
若是是tcp協議,而且不是三次握手的第一次,又是新的狀態 默認拒絕
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.12.11 -j RETURN
iptables -I INPUT -j clean_in
不管到那個地址,只要到INPUT 規則的鏈條,先交給 clean_in 鏈條進行處理
Clean_in 若是沒問題,再交給 INPUT 處理
IPtables -L -n --line-numbers
iptables -X clean_in
刪除這條防火牆規則,他說有引用鏈條,因此先取消引用鏈條
暫時刪除不了
利用iptables的recent模塊來抵禦DOS攻擊
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
若是訪問我 ssh 22號端口的鏈接到達3個當即拒絕
1.利用connlimit模塊將單IP的併發設置爲3;會誤殺使用NAT上網的用戶,能夠根據實際狀況增大該值;
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
最近對咱們的服務器上的ssh 發起請求的鏈接的IP 地址記錄下來
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
2.利用recent和state模塊限制單IP在300s內只能與本機創建3個新鏈接。被限制五分鐘後便可恢復訪問。
下面對最後兩句作一個說明:
1.第二句是記錄訪問tcp 22端口的新鏈接,記錄名稱爲SSH
--set 記錄數據包的來源IP,若是IP已經存在將更新已經存在的條目
2.第三句是指SSH記錄中的IP,300s內發起超過3次鏈接則拒絕此IP的鏈接。
--update 是指每次創建鏈接都更新列表;
--seconds必須與--rcheck或者--update同時使用
--hitcount必須與--rcheck或者--update同時使用
iptables -A INPUT -d 192.168.12.11 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
若是訪問 192.168.12.11 主機的 ssh 服務的 22號端口的鏈接到達3個當即拒絕
Recent 模塊,--set設置,SSH 空間(模塊)
最近對咱們的服務器上的ssh 發起請求的鏈接的IP 地址記錄下來
iptables -A INPUT -d 192.168.12.11 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -d 192.168.12.11 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
3.利用recent和state模塊限制單IP在300s內只能與本機創建3個新鏈接。被限制五分鐘後便可恢復訪問。
Iptables -L -n
測試
我複製了3次 遠程登陸鏈接,第三次就被鎖定了
能夠看到規則寫的鏈接數已經大於3個,因此拒絕了
3個過小,稍微坐下調整
iptables -R INPUT 2 -d 192.168.12.11 -p tcp --dport 22 -m connlimit --connlimit-above 6 -j DROP
替換第二條規則, 若是訪問 192.168.12.11 主機的 ssh 服務的 22號端口的鏈接到達6個當即拒絕
一些參數
屏蔽一個IP
# iptables -I INPUT -s 192.168.0.1 -j DROP
怎麼防止別人ping我??
# iptables -A INPUT -p icmp -j DROP
防止同步包洪水(Sync Flood)
# iptables -A FORWARD -p tcp –syn -m limit –limit 1/s -j ACCEPT
防止各類端口掃描
# iptables -A FORWARD -p tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT
Ping洪水攻擊(Ping of Death)
#iptables -A FORWARD -p icmp –icmp-type echo-request -m limit –limit 1/s -j ACCEPT
NAT 應用
DNAT 目標地址轉換
SNAT 源地址轉換 (POSTROUTING , OUTPUT)
-j SNAT
--to-source
注意:【系統在路由及過慮等處理直到數據包要被送出時才進行SNAT】
(有一種SNAT的特殊狀況是ip欺騙,也就是所謂的Masquerading,一般建議在使用撥號上網的時候使用,或者說在合法ip地址不固定的狀況下使用)
-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING鏈)
源地址轉換,SNAT 支持轉換爲單 IP,也支持轉換到 IP 地址池
(一組連續的 IP 地址)
例如:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \
-j SNAT --to 1.1.1.1
將內網 192.168.0.0/24 的原地址修改成 1.1.1.1,用於 NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \
-j SNAT --to 1.1.1.1-1.1.1.10
同上,只不過修改爲一個地址池裏的 IP
SNAT基於原地址的轉換
基於原地址的轉換通常用在咱們的許多內網用戶經過一個外網的口上網的時候,這時咱們將咱們內網的地址轉換爲一個外網的IP,咱們就能夠實現鏈接其餘外網IP的功能。
因此咱們在iptables中就要定義到底如何轉換:
定義的樣式:
好比咱們如今要將全部192.168.10.0網段的IP在通過的時候全都轉換成172.16.100.1這個假設出來的外網地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
這樣,只要是來自本地網絡的試圖經過網卡訪問網絡的,都會被通通轉換成172.16.100.1這個IP.
-j MASQUERADE
動態源地址轉換(動態 IP 的狀況下使用)
下面是源地址轉換的實驗
準備三臺機子
內網
192.168.12.11
外網
192.168.100.101
中繼器
192.168.100.100
192.168.12.39
切換到外網
把網關指向中繼器
route add default gw 192.168.100.100
再切換到內網,把網關也指向中繼器
route add default gw 192.168.12.39
切換到中繼器
Vim /etc/sysctl.conf
設置啓動轉發路由功能
Sysctl -p
而後再切換到外網,去ping 內網看是否可以ping 通
切換到192.168.100.101
Ping 192.168.12.11
成功
OK
如今我要測試,讓內網不能ping外網
環境略有改變
內網
192.168.10.11
外網
192.168.100.101
中繼器
192.168.100.100
192.168.10.39
內網網關指向192.168.10.39
外網網關指向192.168.100.100
外網 yum -y install httpd vsftpd
外網開啓httpd
切換到中繼器
iptables -A FORWARD -s 192.168.10.0/24 -p icmp -j REJECT
設置192.168.10.0 網段的用戶不能使用ping
Iptables -L -n
切換到內網
不能ping 通外網
Curl 192.168.100.101
能訪問外網
而後切換到中繼器
Iptables -F
iptables -P FORWARD DROP
拒絕一切轉發功能的規則
如今切換到內網,看看是否能ping通外網,和 查看外網的web頁面
不能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
放行 192.168.10 網段的任意IP ,只要訪問外網80端口 而且狀態是新請求的,就放行
如今切換到內網
能訪問外網的80端口,而且不能ping通
iptables -A FORWARD -s 192.168.10.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
設置192.168.10.0 網段(內網)的用戶可以ping 通 外網
切換到內網 192.168.10.11
能ping 通外網
切換到外網
Yum -y install vsfptd
service vsftpd start
切換到中繼器
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT
內網(192.168.10.0) 全部主機訪問 外網 (192.168.100.101)的21 端口 都放行
iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
修改第一條規則,加上RELATED
意思就是說只要 狀態是 肯定的, 有關係的,都放行
如今切換到真實主機 ftp:192.168.100.101試試
能訪問
語法的介紹~~~~
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 192.168.100.100
當客戶端來源IP是192.168.10.0/24 網段的時候, 無論訪問什麼協議,源地址都轉換成 192.168.100.100 (本地外網網卡)
DNAT目標地址轉換
對於目標地址轉換,數據流向是從外向內的,外面的是客戶端,裏面的是服務器端經過目標地址轉換,咱們可讓外面的ip經過咱們對外的外網ip來訪問咱們服務器不一樣的服務器,而咱們的服務卻放在內網服務器的不一樣的服務器上。
如何作目標地址轉換呢?:
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2
目標地址轉換要作在到達網卡以前進行轉換,因此要作在PREROUTING這個位置上
下面的目標地址轉換的實驗
環境
內網
192.168.10.11
外網
192.168.100.101
中繼器
192.168.100.100
192.168.10.39
內網網關指向192.168.10.39
外網網關指向192.168.100.100
外網 yum -y install httpd vsftpd
外網開啓httpd
和上面不同,中繼器的防火牆沒有任何規則
Iptables -P FORWARD ACCEPT
Iptables -t nat -L -n
iptables -t filter -L -n
內網
Yum -y install httpd vsftpd
Service httpd start
service vsftpd start
切換到外網
Curl 192.168.10.11
Yum -y install ftp
ftp 192.168.10.11
帳戶ftp
密碼
如今我要把外網的網關去掉, 只要訪問中繼器,就能轉到內網
切換到外網
route del default gw 192.168.100.100
切換到中繼器
iptables -t nat -A PREROUTING -d 192.168.100.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.11
作個地址轉換,只要訪問本地192.168.100.100 網絡 轉轉到內網的 192.168.10.11
查看
如今切換到外網,訪問 192.168.100.100 看他是否能 轉到內網的服務器
基於上面的實驗,如今我要 用外網訪問 中繼器的80端口, 中繼器會轉交到內網的8080端口
切換到內網192.168.10.11
vim /etc/httpd/conf/httpd.conf
Service httpd rstart
切換到中繼器
iptables -t nat -L -n
修改此規則
iptables -t nat -R PREROUTING 1 -d 192.168.100.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.11:8080
若是是訪問192.168.100.100 的80端口 (中繼器的外網口)。便轉發 192.16810.11 的8080端口(中繼器的內網)
Iptables -t nat -L -n
如今切換到 外網地址
Curl 192.168.100.100 (中繼器的IP)
看到了內網的8080端口的 web服務器
如今我要在中繼器上設置
外網訪問咱們內網,內網網頁中帶有 「neiwang」 字符串就拒絕訪問
切換到中繼器
iptables -A FORWARD -m string --algo kmp --string "neiwang" -j DROP
這時候切換到外網
Curl 192.168.100.100 訪問內網,訪問不成功,證實過濾成功