FSM:Finite State Machine 有限狀态機
用戶端:closed -->syn_sent -->established --> fin_wait_1 -->find_wait_2 --> timewait(2MSL)
伺服器:closed -->listen -->syn_rcvd -->establised --> close_wait -->last_ack
-m state:追蹤連接配接狀态
模闆:記憶體中會維持一個空間
NEW
ESTABLISHED
RELATED
INVALID
在前端的伺服器中盡量不要開啟追蹤連接配接
iptables子指令
規則:-A,-I,-D,-R
鍊:-N,-X,-F,-Z,-E,-P -S
通:預設 DROP
堵:預設ACCEPT
顯示:-L -S
-L
-n -v -x --line-numbers
規則定義:iptables -t table -A|-I|-R chain 比對條件 -j target
比對條件
通用比對:-s -d -i -o -p
擴充比對
隐含擴充
-p tcp
--sport --dport --tcp-flags
--syn
-p udp
--sport --dport
-p icmp
--icmp-type
echo-request 8
echo-reply 0
顯示擴充:
-m state
--state
-m multiport
--sprots, --dports, --ports
-m iprange
--src-range, --dst-range
-m string
-algo {bm|kmp} --string --hex-string
-m connlimit
! --connlimit-above
-m limit
--limit n(/second|/minute|/hour|/day), --limit-burst
-m time
--datestart --datestop
--timestart -- timestop
--weekdays
-j
ACCEPT,DROP,REJECT,LOG,REDIRECT,SNAT,DNST,MASQUERADE,MARK,RETURN,自定義鍊
四表:raw mangle nat filter
五鍊:PREROUTING INPUT FOEWARD OUTPUT POSTOUTING
規則儲存和恢複:iptables-save iptables-restore
主機防火牆:INPUT OUTPUT
路由:
NAT:
/proc/sys/net/ipv4/ip_forward
位址屬于核心,位址目前屬于主機的都給予響應
路由:對Linux主機而言,設定/proc/sys/net/ipv4/ip_forward的值為1,即為開啟路由
路由表的生成
靜态:手動添加
動态:基于路由協定學習,RIP2 OSPF
NAT:網絡位址轉換
A:10
B:172.16-172.31
C:192.168.0-192.168.255
NAT: 工作于傳輸層和網絡層
過載技術
Basic NAT:靜态NAT
NAPT:動态NAT,網絡位址端口轉換
源位址轉換:SNAT 用于内網主機通路網際網路
目标位址轉換:DNAT
讓網際網路上主機通路本地内網中的某伺服器上的服務(釋出)
iptables基于SNAT和DNAT這兩個目标實作位址轉換技術
-j SNT --to-source SIP
規則添加:POSTROUTING鍊
-j MASQUERAADE 動态擷取
-j DNAT --to-destination DIP{:PORT}
支援端口映射
基于nat表
PREROUTING
POSTROTING
OUTPUT
Proxy(代理):工作在應用層
網絡拓撲
172.16.1.10能ping通192.168.8.40,但不能ping通192.168.8.39
192.168.8.39能Ping通172.16.1.254,但不能ping通172.16.1.10
配置開啟路由轉發功能
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
讓配置生效
# sysctl -p
也可以,采用如下指令臨時生效
# sysctl -w net.ipv4.ip_forward=1
驗證
# cat /proc/sys/net/ipv4/ip_forward
windows用戶端添加路由,也可以實作通路
route add 172.16.1.0 mask 255.255.255.0 172.16.1.254

将轉發規則屏蔽,則無法通路
# iptables -P FORWARD DROP
放行192.168.8.39中80口的通路
# iptables -A FORWARD -s 172.16.1.10 -d 192.168.8.39 -p tcp --dport 80 -j ACCEPT
# iptables -A FORWARD -d 172.16.1.10 -s 192.168.8.39 -p tcp --sport 80 -j ACCEPT
放行172.16.1.0/24網段對192.168.8.0網段22号端口的通路
# iptables -A FORWARD -s 172.16.1.0/24 -d 192.168.8.0/24 -p tcp --dport 22 -j ACCEPT
# iptables -A FORWARD -s 192.168.8.0/24 -d 172.16.1.0/24 -p tcp --sport 22 -j ACCEPT
重新編寫規則
# iptables -F FORWARD
# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
# iptables -R FORWARD 2 -d 192.168.8.39 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
nat規則舉例
初始化:
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
//需要accept否則将無法通過路由轉發任何資料包
# iptables -P FORWARD ACCEPT
外網端:172.16.1.10
内網端:192.168.8.39
//将通路172.16.1.254 80端口的服務映射到8.89的80端口上
# iptables -t nat -F
# iptables -t nat -A PREROUTING -d 172.16.1.254 -p tcp --dport 80 -j DNAT --to-destination 192.168.8.39
在目标8.39的web日志中可以看到是172.16.1.10通路的,而不是192.168.8.40路由通路
禁止172.16.1.10的IP通路
# iptables -I FORWARD -s 172.16.1.10 -j REJECT
通過外網位址172.16.1.254的22022端口通路192.168.8.39的22号端口(相當于端口映射)
# iptables -t nat -A PREROUTING -d 172.16.1.254 -p tcp --dport 22022 -j DNAT --to-destination 192.168.8.39:22
172.16.1.10 和 172.16.1.254的eth1都放置于 vmnet2虛拟交換環境中
外網接口:
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.8.15
BROADCAST=192.168.8.255
NETMASK=255.255.255.0
GATEWAY=192.168.8.254
NETWORK=192.168.8.0
DNS配置
/etc/resolve.conf
nameserver 192.168.8.251
内網接口:
# cd /etc/sysconfig/network-scripts/
# cp ifcfg-eth0 ifcfg-eth1
DEVICE=eth1
IPADDR=172.16.1.254
BROADCAST=172.16.1.255
NETWORK=172.16.1.0
172.16.1.10
DNS:192.168.8.251
GAWEWAY:172.16.1.254
配置192.168.8.251
# vim /etc/sysctl.conf
打開防火牆轉發功能
sysctl -p 使配置生效
在防火牆上添加規則,對來自内網 172.16.1.0網段的機器進行源位址轉換
# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 192.168.8.15
tupdump抓包
nginx用來做什麼?
靜态資源的web伺服器
http伺服器反向代理
通路量統計網站:
基本文法
========
過濾主機
--------
- 抓取所有經過 eth1,目的或源位址是 192.168.1.1 的網絡資料
# tcpdump -i eth1 host 192.168.1.1
- 源位址
# tcpdump -i eth1 src host 192.168.1.1
- 目的位址
# tcpdump -i eth1 dst host 192.168.1.1
過濾端口
- 抓取所有經過 eth1,目的或源端口是 25 的網絡資料
# tcpdump -i eth1 port 25
- 源端口
# tcpdump -i eth1 src port 25
- 目的端口
# tcpdump -i eth1 dst port 25網絡過濾
# tcpdump -i eth1 net 192.168
# tcpdump -i eth1 src net 192.168
# tcpdump -i eth1 dst net 192.168
協定過濾
# tcpdump -i eth1 arp
# tcpdump -i eth1 ip
# tcpdump -i eth1 tcp
# tcpdump -i eth1 udp
# tcpdump -i eth1 icmp
常用表達式
----------
非 : ! or "not" (去掉雙引号)
且 : && or "and"
或 : || or "or"
- 抓取所有經過 eth1,目的位址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 資料
# tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dsthost
192.168.1.200)))'
- 抓取所有經過 eth1,目标 MAC 位址是 00:01:02:03:04:05 的 ICMP 資料
# tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
- 抓取所有經過 eth1,目的網絡是 192.168,但目的主機不是192.168.1.200 的 TCP 資料
# tcpdump -i eth1 '((tcp) and ((dst net192.168) and (not dst host 192.168.1.200)))'
- 隻抓 SYN 包
# tcpdump -i eth1 'tcp[tcpflags] = tcp-syn'
- 抓 SYN, ACK
# tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] &tcp-ack != 0'
抓 SMTP 資料
# tcpdump -i eth1 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'
抓取資料區開始為"MAIL"的包,"MAIL"的十六進制為0x4d41494c。
抓 HTTP GET 資料
--------------
# tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x47455420'
"GET "的十六進制是 47455420
抓 SSH 傳回
---------
# tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x5353482D'
"SSH-"的十六進制是 0x5353482D
# tcpdump -i eth1 '(tcp[(tcp[12]>>2):4] = 0x5353482D) and(tcp[((tcp[12]>>2)+4):2]
= 0x312E)'抓老版本的 SSH 傳回資訊,如"SSH-1.99.."
- 抓 DNS 請求資料
# tcpdump -i eth1 udp dst port 53
其他
----
-c 參數對于運維人員來說也比較常用,因為流量比較大的伺服器,靠人工 CTRL+C 還是
抓的太多,于是可以用-c 參數指定抓多少個包。
# time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null
上面的指令計算抓 10000 個 SYN 包花費多少時間,可以判斷通路量大概是多少。
實時抓取端口号8000的GET包,然後寫入GET.log
tcpdump -i eth0 '((port8000) and (tcp[(tcp[12]>>2):4]=0x47455420))' -nnAl -w /tmp/GET.log
本文轉自rshare 51CTO部落格,原文連結:http://blog.51cto.com/1364952/1956943,如需轉載請自行聯系原作者