iptables主机防火墙功能及常用命令
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网络防火墙:FORWARD
路由:
NAT:/proc/sys/net/ipv4/ip_forward地址属于内核,地址当前属于主机的都给予响应路由:对Linux主机而言,设定/proc/sys/net/ipv4/ip_forward的值为1,即为开启路由 路由表的生成 静态:手动添加 动态:基于路由协议学习,RIP2 OSPFNAT:网络地址转换 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 OUTPUTProxy(代理):工作在应用层
举例说明:
网络拓扑
简单网络访问路由转发功能
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.confnet.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 ACCEPTnat规则举例初始化:# iptables -P INPUT ACCEPT# iptables -P OUTPUT ACCEPT//需要accept否则将无法通过路由转发任何数据包# iptables -P FORWARD ACCEPT模拟dnat功能之互联网访问局域网服务器
外网端: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模拟snat功能之局域网访问互联网应用
172.16.1.10 和 172.16.1.254的eth1都放置于 vmnet2虚拟交换环境中
充当路由功能的机器
外网接口:
DEVICE=eth0ONBOOT=yesBOOTPROTO=noneIPADDR=192.168.8.15BROADCAST=192.168.8.255NETMASK=255.255.255.0GATEWAY=192.168.8.254NETWORK=192.168.8.0DNS配置/etc/resolve.confnameserver 192.168.8.251内网接口:# cd /etc/sysconfig/network-scripts/# cp ifcfg-eth0 ifcfg-eth1DEVICE=eth1ONBOOT=yesBOOTPROTO=noneIPADDR=172.16.1.254BROADCAST=172.16.1.255NETMASK=255.255.255.0NETWORK=172.16.1.0内网的机器:
172.16.1.10
DNS:192.168.8.251GAWEWAY:172.16.1.254配置192.168.8.251# vim /etc/sysctl.conf打开防火墙转发功能net.ipv4.ip_forward = 1sysctl -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服务器反向代理
访问量统计网站:
tupdump抓包
详细的文档见
基本语法
========
过滤主机--------- 抓取所有经过 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 (dsthost192.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