欢迎各位兄弟 发布技术文章
这里的技术是共享的
NFS服务端:/var/www:共享出去
NFS客户端: 挂载NFSERVER:/var/www至本地的/var/www
linux:网络防火墙
netfilter: 网络过滤器 Frame (是一个内核中的过滤框架,规则生效位置的框架)
iptables: 生成防火墙规则,并能能够附加在netfilter上,真正实现数据报文过滤的(NAT mangle等规则生成)工具
网络: IP报文首部,TCP报文首部
0-1023端口是 系统使用的
0-65535 是所有端口
5000以上是客户连接服务器的端口 (是任意的5000以上)?是吗?
对linux 而言 一切皆文件,每打开一个端口,就是打开一个套接字文件
tcp udp 在 IP协议的data里面
防火墙:硬件,软件 规则:(匹配标准,处理办法)
网络安全百分之六七都是内贼
Framework: 可以是一个硬件,也可以是一个软件,但无论如何我们需要定义规则以后,让其生效,它才能真正工作起来
默认规则:一般情况下,对于服务器来讲,拒绝所有未知,只开放我们明确已知的报文
开放: 堵
关闭: 通
规则:
匹配标准
IP:源IP(SIP),目标IP(DIP)
TCP:SPORT,DPORT (source port 源端口)(destination port 目标端口),SYN=1,FIN=0,RST=0,ACK=0
UDP:SPORT,DPORT (source port 源端口)(destination port 目标端口)
ICMP:icmp-type (icmp报文类型)(网关不可达,主机不在线,请求超时,主机名称无法解析等等类型)(报文格式各不相同)
ICMP是(Internet Control Message Protocol)Internet控制报文协议(网络控制消息协议)。(三层半的位置)它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
(SYN=1,FIN=0,RST=0,ACK=0 是 TCP握手中的第一次)
(SYN=1,FIN=0,RST=0,ACK=1 是 TCP握手中的第二次)
(SYN=0,FIN=0,RST=0,ACK=1 是 TCP握手中的第三次)(ESTABLIEHED) 已建立的连接
数据报文过滤,它就是防火墙
早期没有防火墙的功能 OpenBSD机制,参考别人的机制移植过琮的
linux2.0
ipfw/firewall
linux2.2
ipchain/firewall
linux2.4以后
iptables/netfilter
hook function :钩子函数
1)来本地路 (进) input
2)从本地走的路(出) output
3)转发的路(转发) forward
事实上钩子函数不止这三个,还有两个
4)到网卡,还未到路由表决策的时候,做手脚 prerouting (在路由决策之前)
5)路由已经作出决策,已到出去的网卡,在网卡的缓冲里,即将发出的时候,做手脚
这两个位置不是为了允许(放行)或拒绝的,而是为了做地址转换的 postrouting (在路由决策之后,已到网卡,就要离开本机了) (post在什么什么之后)
多个规则组合起来,串起来像一条链,叫规则链:每一条钩子放在规则组合起来,叫一个规则链
规则链:(全大写 )
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
filter(过滤): 表(功能)
INPUT
OUTPUT
FORWARD
nat(地址转换): 表(功能) nat(network address transactions 网络地址转换)
PREROUTING
POSTROUTING
还有一个 OUTPUT
mangle(修改报文首部)(拆开,修改,封装):表,把报文拆开,做了修改,再缝上 表 (功能)
ttl 每过一个网站减去1,mangle可以在这里加上1(本来过一个网关就减去1,我这里加上去,别人就意识不到它的存在了)
mangle 可以修改服务类型之类的,还可以打上标记,可以给报文分给组(分给一号报文,二号报文等等),可以在下面五个上面进行
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
filter的INPUT 不能与 mangle 的 INPUT 放在一起,其实任意两种其实都不可以
不能交叉存放 ,但彼此间还是按链(按大类)放在一起的
raw(不对报文做任何修改,还原为原来的样子)(原始格式) 表 (功能)
PREROUTING
OUTPUT
规则:匹配标准.处理动作
iptables 由四表五链组成
TCP/IP协议中每个钩子函数对应一个链(INPUT OUTPUT FORWARD PREROUTING POSTROUTING )
500条规则
能否使用自定义链:
自定义的链只能被默认链调用以后才能发挥功能的
可以使用自定义链,但只在被调用时才能发挥作用,而且如果没有被任何一条规则匹配到,还应该有返回机制
用户名以删除自定义的空链,不能删除非空链,默认链不能被删除
每个规则都有两个内置的计数器
1)被匹配的报文个数
2)被匹配的报文大小(体积)之和
iptables [-t TABLE ] COMMAND CHAIN [num] 匹配标准(匹配条件) -j 处理办法(处理动作)
(COMMAND是iptables的子命令,也可以说成SUBCOMMAND) ( -j 就是 jump的意思)
匹配标准:
通用匹配 (普通匹配)
-s,--src 指定源ip地址,源网络
-d,--dst 指定目标ip地址,目标网络
-p {tcp|udp|icmp} 指定协议 (指的是四层协议)
-i INTERFACE (input interface)(比如 ethX网卡,pptX网络接口):指定数据报文流入的接口 (进来的)
PREROUTING,INPUT,FORWARD 用在这些链上,可用于定义的标准链
-o INTERFACE (output interface)(比如 ethX网卡,pptX网络接口):指定数据报文流出的接口 (出去的)
POSTROUTING,OUTPUT,FORWARD 用在这些链上,可用于定义的标准链
扩展匹配:使用netfilter的扩展模块才能完成的匹配
隐含扩展:不需要明确指定(特别指明)由哪个模块扩展,因为此时使用了 -p {tcp|udp|icmp}
显式扩展:必须指明由哪个模块进行的扩展,在 iptables中使用-m选项可完成此功能
-j TARGET (ACTION): j是jump的意思
ACCEPT 允许,接受,通过
DROP 拒绝 (悄悄丢弃)(一般用它)
REJECT 拒绝 (丢弃后,骂人一通)(在测试的情况下才建议用它)
(-A是增加一条规则的意思)
iptables -t filter -A INPUT -s 192.16.0.0/16 -j DROP 访问我本机的都丢弃(无论访问本地的哪个地址都丢弃)
iptables -t filter -A INPUT -s 192.16.0.0/16 -d 172.16.100.7 -j DROP 访问我本机的且我本机上( 172.16.100.7 这个网卡)都丢弃(转发的吧 它就不丢弃吧)
没有关联性的规则应该把范围大(比如 111.111.11.0/24比222.222.22.2 范围大)的放上面,把访问频繁(比如 web比ftp更频繁)的放上面
有关联性的(一个允许,另一个拒绝) 应该把范围小的放上面
比如 (
1.0.0.0/8 允许访问,
1.1.1.1 拒绝访问,
)
必须把 1.1.1.1 放上面,否则 1.1.1.1会允许访问
规则次序作用很大
Type of Service(TOS):服务类型
滑动窗口:一批传多少,双方用来协商发送缓冲 接受缓冲的对应大小
客户端(接收端)收不到就重传
窗口大小:协议一个最佳的传送的大小(一般指接受方的大小)
上图是: 帧, ip报文, tcp协议报文, http协议报文 (前面的分别封装后面的,后面的作为前面的data)
(比如 ip报文 封装了 tcp协议报文, tcp协议报文作为ip报文的data)
只要是第一次与对方通信 那么 SYN=1
CLOSED
SYN_SENT:发送状态
SYN_RCV (SYN_RECEIVED):接收状态
ESTABLISHED:连接已建立
上图中的 LISTEN 监听
上图中的 SYN_SENT(不是SYN_SEND?) 发送同步请求
上图中的 SYN_RECV(不是SYN_RECD) 接受同步请求
上图中的 ESTABLISHED 是 处于已连接状态
SYN 是发送连接请求
ACK 是确认
FIN 是断开请求
MSL 就是最大段生存时间 就是报文传输时间吧
上图 time-wait1 (time_wait1 )改成 FIN-wait1 (FIN_wait1)更准确吧
上图 time-wait2 (time_wait2 )改成 FIN-wait2 (FIN_wait2)更准确吧
上图的 2*MSL Closed 就是 TIME_WAIT吧
上图的 LAST_ACK 最后确认
TCP状态转移
能够实现TCP状态转移的机器叫做 TCP的有限状态机
只要写完规则后,规则后 app(iptables)就没用了
iptables 只是一个规则生成器
只要进入本地网卡之后 送到TCP/IP协议站后,先做路由决策,
(上图 站转发的回路不准确,原转发的路是准确的), 发现是转发的就到转发的位置上
有三个路:1)来本地路 (进) 2)从本地走的路(出) 3)转发的路(转发)(只有一条)
这三个位置(三个门) 就是可以让 iptables 放规则的位置
三个门就是三个钩子
被第一个钩子匹配到,就不匹配第二个钩子,第二个匹配了,就不匹配第三个钩子了
如果没有关联度的话,就把范围大的放在上面, 比如 http 服务比 ssh 多很多,就把 http 的规则放上面,把访问最频繁的规则请求放在上面
如果范围大的和范围小的有关联性, ( 1.0.0.0/8网络范围大,1.1.1.2ip范围小 ) 把小的放上面,否则的话把大的放上面的话,大的规则就起作用了,小的规则就不起作用了
4)到网卡,还未到路由表决策的时候,做手脚
5)路由已经作出决策,已到出去的网卡,在网卡的缓冲里,即将发出的时候,做手脚
这两个位置不是为了允许(放行)或拒绝的,而是为了做地址转换的
NAT会话表;保存的是时间 和 地址转换,以及目标地址
地址转换 把原来的源地址 172.16.100.6 改成 12.1.1.6 (通过网卡出去的时候改源地址)
回应过来的报文 又根据NAT会话表,把12.1.1.6这个目标地址改成 172.16.100.6 (通过网卡进来的进候,改目标地址)
DNAT:destination ip NAT (destination network address transfer)
[root@localhost ~]# iptables -t raw -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
四表五链
INPUT OUTPUT FORWARD PREROUTING POSTROUTING 这五个链,也就是五个钩子函数
fiter,nat,mangle,raw 四张表,就是四个功能
[root@localhost ~]# rpm -ql iptables (一般iptables默认是安装上去的)
这些 .so模块就是iptables的扩展模块