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 访问内网,访问不成功,证实过滤成功