首页 文章 精选 留言 我的

精选列表

搜索[数据库知识开放麦],共10027篇文章
优秀的个人博客,低调大师

详解网络知识:iptables规则

本文分享自华为云社区《【理解云容器网络】1-基础篇-iptables介绍》,作者: 可以交个朋友。 iptables规则 下图为数据包到达linux主机网卡后,内核如何处理数据包的大致流程 什么是规则 规则是管理员对数据包制定的一种触发机制,即当数据包达到某种条件,就执行指定的动作。 条件:可以是数据包源地址、目的地址、协议等 动作:可以是拒绝、接受、丢弃等;详细介绍见下表 动作 说明 ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(nat:postrouting) REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则炼(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。 SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。 DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则炼(filter:input 或 filter:forward)。 MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。 RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。 使用iptables命令写入规则示例: iptables -t filter -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 -m multiport --dports 443,80 -j ACCEPT #-t:操作那个表 #-A:在表末追加规则;-I为表首插入规则、-D为删除规则 #INPUT:链名称;该规则在那条链上生效 #-j:数据包处理动作;比如接受、拒绝等 整条命令解释:允许经过本机网卡eth0,访问协议是TCP,源地址是192.168.1.0/24 段的数据包访问本地端口是80和443的服务 什么是表 表主要用来存放具体的防火墙规则,而规则具有功能性,比如修改数据包源/目的ip、拒绝来自某个网段的数据包访问本机等;所以我们可以对规则进行分类,不同的功能存入不同的表 raw表:主要用于决定数据包是否被状态跟踪机制处理 mangle表:主要用于拆解报文修改数据包的 IP 头信息 nat表:主要用于修改数据包的源地址和目的地址、端口号等信息(实现网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。 filter表:主要用于对过滤流入和流出的数据包,根据具体的规则决定是否放行该数据包 security 表:最不常用的表,用在 SELinux 上;用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现 其中nat表和filter表最常用 什么是链 上文提到表主要存放具体的规则,但是规则什么时候生效呢?比如客户端访问VIP,数据包到达本机后必须先用DNAT(网络地址转换)将vip转换成实际的后端实例ip,然后才能路由判断,因为后端实例可能有多个且分布在不同主机,直接用vip进行路由判断肯定是不行的。所以规则有生效时机,根据生效时机可以分为: PREROUTING:在数据包到达防火墙时,进行路由判断之前执行的规则 INPUT:路由判断之后确定数据包流入本机,应用其规则 FORWARD:路由判断之后确定数据包要转发给其他主机,应用其规则;linux主机需要开启ip_forward功能才支持转发,在/etc/sysctl.conf文件中配置参数net.ipv4.ip_forward=1 OUTPUT:本机应用向外发出数据包时,应用其规则 POSTROUTING:在数据包离开防火墙时进行路由判断之后执行的规则 在每条链中,规则按照从上到下的顺序进行匹配,当一个数据包与某个规则匹配成功后,就会按照该规则的动作进行处理,并且后续的规则将不再被考虑。 表、链、规则三者的关系是什么 表是区分相同链的上下顺序,规则在每条链中的上下顺序确定规则执行顺序: 如果规则来自不同表,通过表的优先级确定链的优先级: 比如完整的PREROUTING链中有来自raw表、mangle表、nat标的PREROUTING链规则,通过表优先级(raw>mangle>nat>filter>security)区分优先级。所以一个报文发送到某台虚拟机后,被虚拟机网卡接收,会进入的虚拟机网络协议栈处理,先经过PREROUTING链处理,具体来说先走raw表的PREROUTING规则、再走mangle表、最后在走nat表PREROUTING规则。 如果规则来自同一个表,则按规则插入表的顺序自上而下。 数据报文进/出节点经过哪些规则 对于客户端来说,发送报文过程 先进入OUTPUT链处理(raw、mangle、nat、filter、security表对应的PREROUTING规则依次匹配),如果没有被拦截则根据路由选择出网口,再进入POSTROUTING链处理(mangle、nat表对应的POSTROUTING规则依次匹配),最后从网卡出去 对于服务端来说,发送报文过程 先进入PREROUTING链处理(raw、mangle、nat表对应的PREROUTING规则依次匹配),根据路由判断数据报文发给本机,报文进入INPUT链处理(mangle、nat、filter、security表对应的INPUT规则依次匹配),如果没有被拦截则报文被应用程序处理 对于转发场景,发送报文过程 先进入PREROUTING链处理(raw、mangle、nat表对应的PREROUTING规则依次匹配),根据路由判断数据报文不是发给本机,报文进入FORWARD链处理(mangle、filter、security表对应的FORWARD规则依次匹配),如果没有被拦截则进入POSTROUTING链处理(mangle、nat表对应的POSTROUTING规则依次匹配),最后从网卡出去 *补充:转发场景需要Linux开启转发功能,否则数据报文进入FORWARD链直接丢弃;临时开启执行命令sysctl net.ipv4.ip_forward=1或者echo "1" >/proc/sys/net/ipv4/ip_forward;永久生效需要修改/etc/sysctl.conf,增加内容net.ipv4.ip_forward = 1保存,再执行命令:sysctl -p NAT(网络地址转换)介绍 NAT应用最广的场景就是解决局域网内设备访问互联网的问题。SNAT(源地址转换)主要用于修改数据包的源IP和源端口,一般在nat表的PREROUTING链中增加规则:局域网内所有设备要上外网,如果每个设备都分配一个公网ip成本太大,可以在路由器出口分配一个公网ip,局域网内的设备访问外网时统一走路由器出口,路由器此时需要做两件事: 数据包从出口出去之前,将数据包的源地址和源端口改成公网ip和随机端口 同时将转换关系记录保存,响应数据包返回时根据记录转发给局域网内的设备 SNAT示例: iptables -t nat -A POSTROUTING -d 192.168.1.11 -p tcp --dport 88 -j SNAT --to-source 122.9.3.47:88 # -j:值为SNAT需要静态指定修改后的值,值为MASQUERADE表示动态修改源地址为出口网卡地址 # --to-source:将数据包的源地址转换成指定值 # 整条命令解释:将发给192.168.1.11:88的数据包,其源地址改为122.9.3.47 DNAT(目的地址转换)主要用于修改数据包目的地址和端口路由器,一般在nat表中的PREROUTING链中增加规则:接收到数据包后,将目的地址和目的端口根据转换规则修改为实际的内网地址,规则需要提前在路由器上手动添加,如下图:将访问公网ip 100...155:10022的数据包转发给内网设备172.30.100.136:22 DNAT示例: iptables -t nat -A PREROUTING -d 202.12.10.100 -p tcp --dport 20022 -j DNAT --to-destination 192.168.10.11:22 # --to-destination:修改数据包的目的地址 # 整条命令解释:将发给202.12.10.100:20022的数据包,其目的地址改为192.168.10.11:22 注意:linux内核使用CONNTRACK表(连接跟踪)记录NAT转换关系,一个连接仅在首次经过iptables链条时会计算nat表,一旦conntrack记录下这次的改写关系,后续无论是去程包还是回程包都是依据conntrack表进行改写关系的处理,不会再重复执行nat表中的DNAT/SNAT规则 点击关注,第一时间了解华为云新鲜技术~

优秀的个人博客,低调大师

函数知识点详解

目录 函数的定义 概念: 在函数中输入形参和实参: 函数的参数 规定: 不指定关键字: *args和 **kwargs : 用函数打印乘法表 函数中字典的应用 字典中get的用法: 函数中列表的用法 sort的用法 高阶函数: 1. map 2. filter: 过滤 3. reudce 函数的定义 概念: 定义函数是一个赋值的过程: def => define: 定义 def function_name(args-参数列表): statement1 return values => 有返回值时使用return,可以return多个值,return时,用","隔开 defprint_university(): print("北大") return1,2,3 test_reture=print_university()#以元组形式显示返回值 int_x,int_y,int_z=print_university() print(test_reture) print(int_x,int_y,int_z) 输出结果为: 在函数中输入形参和实参: 形参: 形式参数,定义在函数时的参数叫做形参 实参: 实际参数,实际传递的时候叫做实参 defprint_university(name):#name:形参 print(name) university="北大"#university:实参 print_university(university) print(type(print_university))#函数定义的数据类型为function function_test=print_university#可以将结果赋给另一个变量 print(type(function_test))#查看其数据类型仍未function function_test(university)#调用 输出结果为: 函数的参数 *args: 参数的复数 arguments:可以传递多个参数 规定: 关键字参数必须放在参数列表的末尾。即从第一个关键字开始,后边必须都是关键字参数 没指定关键字,传参根据顺序去找 deftest_arg(arg1,arg2=None):#arg1:位置参数arg2:关键字参数 print(arg1) print(arg2) test_arg("arg1") print(80*"*") test_arg("arg2") print(80*"*") test_arg("arg1","arg2") 输出结果为: 不指定关键字: deftest_function(arg1,arg2=None,arg3=None): print(arg1,arg2,arg3) test_function(arg1=1)#默认按顺序打印关键字参数 其输出结果为: *args和 **kwargs : *args: 将传入的参数打包成一个元组,在不确定传入参数的个数时使用 ** kwargs: keyword args, 是把传入的关键字参数打包成字典 print("*args----------------------------------------") deffunction_args(arg1,arg2,*args): print(args) function_args(1,2,3,4,5,6)#将对应未打印的剩余元素全部打包给*args print("**kwargs--------------------------------------") deffunction_kwargs(arg1,arg2,**kwargs): print(kwargs) function_kwargs(1,2,arg3=1,arg4=6,arg5=8)#将关键字参数打包成字典输出 输出结果为: 用函数打印乘法表 defmul_table(number): ifnumberinrange(1,10): foriinrange(1,number+1): forjinrange(1,i+1): print(i,"*",j,"=",i*j,end="\t") print() else: print("Thenumberisillegal") mul_table() 在mul_table里边输入数字即可打印乘法表 若输入9打印九九乘法表,则输出结果为: 输入超过9的值,比如输入10,则执行结果为: 函数中字典的应用 字典中get的用法: 格式: get(self, key, default=None, /) Return the value for key if key is in the dictionary, else default./ : 表示"/"前边都是仅位置参数,不能使用关键字参数 *:*后边必须使用关键字参数 deftest_get(value,default=None): returndefault#定义函数,要求返回默认值 data=test_get(1,default=4)#返回定义的默认值 print(data) deftest_get(value1,value2,/,*,kwd1,kwd2): print("Test")#/和*的使用 test_get(1,2,kwd1=3,kwd2=4)#返回函数定义的值 返回结果为: 函数中列表的用法 sort的用法 格式: sort(self, /, *, key=None, reverse=False) If a key function is given, apply it once to each list item and sort them, ascending or descending, according to their function values.key: 是指定你排序规则的函数 list_data=[1,7,8,9,0,6,5,3,4]#定义一个列表 print(list_data) defsort_function(element): returnelement%2 list_data.sort(key=sort_function)#按照取余结果由小到大排序 print(list_data) print("lambda--------------------------------------------") #lambda表达式:匿名函数 #格式:lambdaarguments:element%2 list_data.sort(key=lambdaelement:element%2)#和前边函数定义按取余排序一样 print(list_data) 输出结果为: 高阶函数: 1. map 格式: map(fun, *iterrable) -> map object作用: Make an iterator that computes the function using arguments from each of the iterables. Stops when the shortest iterable is exhausted. (创建一个迭代器,使用每个可迭代对象的实参计算函数。当最短的可迭代对象耗尽时停止。) list_data_1=[1,2] list_data_2=[3,4,5] list_data_3=[6,7,8,9] deffunction_test(i,j,x): returni+1,j+1,x+1 第一种用法 foriinmap(function_test,list_data_1,list_data_2,list_data_3): print(i)#将每个列表相同下标的元素以元组形式打包 第二种用法 list_data=list(map(function_test,list_data_1,list_data_2,list_data_3)) print(list_data) 输出结果为:总结: (1)map的结果取决于最短列表元素的个数,也取决于返回值 (2)map的数据类型其实是一个序列 2. filter: 过滤 格式: filter(function or None, iterable) --> filter object作用: Return an iterator yielding those items of iterable for which function(item) is true. If function is None, return the items that are true. (返回一个迭代器,生成对于某一个函数为可迭代的项为真值。如果function为None,则返回为真值的项。) data=list(filter(lambdax:x%2,[1,2,3,0])) print(data)#定义一个lambda函数,按照取余结果返回所有的真值 输出结果为: [1, 3] 3. reudce 迁移到functools这个模块中格式: def reduce(function, sequence, initial=_initial_missing): 作用: Apply a function of two arguments cumulatively to the items of a sequence, from left to right, so as to reduce the sequence to a single value. (将一个有两个参数的函数从左到右累加到序列的项上,以便将序列简化为单个值。) ruduce作用练习 fromfunctoolsimportreduce data=reduce(lambdax,y:x+y,[1,2,3,4,5]) print(data) 输出结果为: 15

优秀的个人博客,低调大师

网络编程基础知识

一、 cs架构和bs架构二、 互联网三、 osi七层 1.应用层 2.表示层 3.会话层 4.传输层 5.网络层 6.数据链路层 7.物理层 tcp/ip5层(5层名字记住:重点) -1.物理层 -网线,光纤 -2.数据链路层 -网卡 -3.网络层 -路由器 -4.传输层(运输层) -四层路由器 -5.应用层(会话层,表示层,应用层) -http协议,ftp协议,websocket协议... 3.1每一层的功能 1 物理层 -网线----》01010101电信号---》从网线中传输电信号 -8个比特位是一个字节 2 数据链路层 -数据帧:一组电信号是一个数据帧,有头和数据部分 -网卡---》mac地址---》全球唯一---》网卡出厂--》烧在了网卡上 -48位二进制---》看到的都是16进制表示 -广播: -局域网内通信,所有人都会接受到,通过mac地址确定给谁的数据报,如果不是自己的就不处理 -广播风暴 3 网络层 -跨局域网通信,需要经过网络层 -IP地址:0.0.0.0-255.255.255.255 -子网掩码: -192.168.1.1 255.255.255.0 -192.168.2.1 255.255.255.0 -ARP:ip和mac的对照表 4 传输层: -端口:0--65535,一个应用程序可以监听多个端口,但是一个端口只能属于一个应用程序 -TCP协议:可靠传输(可靠传输如何保证?三次握手,四次挥手) -UDP协议:不可靠传输 5 应用层 -htpp,ftp,websocket.... 3.2传输层常用接口 应用程序 FTP TFTP TELNET SMTP DNS HTTP SSH MYSQL 熟知端口 21,20 69 23 25 53 80 22 3306 传输层协议 TCP UDP TCP TCP UDP TCP TCP TCP DNS:把网址转换成ip地址 从浏览器发送出去的数据,都是http协议,默认是80端口 3.3传输层TCP的三次握手和四次挥手 1 tcp可靠传输:三次握手,四次挥手保证数据可靠 2 三次握手 -客户端向服务端发送链接请求 1 -服务端回复可以建立,并且带着跟客户端建立链接的数据报 2 -客户端收到后,链接建好了 3 3 这个过程后就可以可靠传输数据 4 断开链接(4四挥手) -客户端告诉服务端,要断开 1 -服务端收到,回复ok 2 -服务端可能还有数据在传递,暂时还没断开---等数据传完 -服务端告诉客户端,我要断了 3 -客户端收到,回复ok 4 四、Socket层 1 Socket抽象层,从osi七层抽象出来的,抽象了网络层和传输层,跟语言无关 2 专门给开发人员用的 五、基于Tcp的socket套接字(重点)服务端 #导入socket模块 import socket import time #第一个socket是模块名,第二个socket是类名 #类实例化得到对象,得到一个socket对象 #server=socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM) #不写默认就是他 server=socket.socket() #绑定地址跟端口 ,传一个元组,监听的地址,监听的端口 server.bind(('192.168.11.28',8008)) #监听 #半连接池是5,可以缓冲5个 server.listen(5) #等待用户连接(看源码,有两个返回结果) #sock是连接对象,以后这个服务端和客户端交互,使用这个对象交互 #addr是客户端地址(ip和端口) sock,addr=server.accept() #接收客户端发给我的消息 data=sock.recv(1024) #打印 print(data) #服务端给客户端发送消息(必须是byte格式) sock.send(b'helloworld') time.sleep(1) #关闭连接对象 sock.close() #关闭服务 server.close() 客户端 import socket #创建socket对象 client=socket.socket() #连接服务端 client.connect(('127.0.0.1',8008)) #给服务端发了一个sb client.send(b'sb') #收到了服务端给我的 data=client.recv(1024) print(data) #关闭 client.close()

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册