篡改eth报文
A. 单host下Docker的默认网络配置
本文用到的环境如下:
host: centos7
docker: 通过 yum install -y docker 安装,版本号为1.10.3
docker镜像:
# Version: 0.0.1 FROM ubuntu:latest MAINTAINER paul liu "[email protected]" RUN apt-get update RUN apt-get install -y net-tools RUN apt-get install -y iputils-ping CMD /bin/bash
场景图:
我的host主机接有无线路由器,通过ADSL拨号上网,网卡eth0固定IP为192.168.0.200,网关为路由器的IP 192.168.0.1。
在host上安装docker,并运行容器。
通过以下命令安装docker,
yum install -y docker
启用docker,
systemctl start docker
然后在host主机运行 ifconfig 或 ip a 命令,可以看到除去host原有的网卡eth0和回环lo外,多了个docker0。
docker0 IP为172.17.0.1,所在的网段默认为B类私网地址172.17.0.0/16。可以将docker0看做是host主机的一块虚拟网卡。这样host主机就等同于配置了双网卡,两块网卡之间可以通信,但前提是启用ip_forward。
这是docker0的第一个身份。
运行两个容器docker1,docker2,然后在host主机上运行 brctl show 查看,
这里可以看出docker0的第二个身份,一个虚拟交换机。每运行一个容器,就会产生一对veth,其中一端连接到docker0上,另一端连接到容器的eth0上。这样,所有连接到docker0的容器组成了一个局域网。如下图:
在host主机上运行 ifconfig ,也会发现多了两个veth这样的网络接口。
在host主机上运行 ip addr show veth6d9a691 ,可以查看到该veth具有mac地址,这也正说明了docker0的虚拟交换机的身份,交换机是通过mac地址通信的,连接到交换机的设备必须具有mac地址。
由于docker0自身也具有mac地址,这个与纯二层交换机是不同的,并且绑定了IP 172.17.0.1,容器默认把docker0作为了网关。也就是docker0还兼具路由的功能,因此可以把docker0看做是一个三层交换机,可以做二层数据包转发,也可以做三层路由转发。
在容器中运行 route -n 查看路由如下:
在host主机上运行 route -n 查看路由如下:
在host中,访问本网段192.168.0.0是通过eth0转发数据包的,访问172.17.0.0网段是通过docker0转发数据包的,而对于其他如公网是通过eth0将数据包转发给网关192.168.0.1,再由该网关进行数据包转发的,比如上网。
在容器中运行 ping sohu.com 或 ping 192.168.0.200 都可以ping通。
默认情况下,不需要再额外做任何配置,在一台host主机上,通过docker0,各容器之间可以互通,并且可以通过host的eth0连接外网。
通俗的讲,通过docker0组成了一个网段为172.17.0.0/16的以太网,docker容器发起请求时,如果是相同网段则经由docker0转发到目标机器,如果是不同网段,则经由docker0,转发到host的另一块网卡eth0上,由eth0负责下一步的数据包转发,比如公网地址。
下面进一步分析一下报文是怎么发送到外面的。
容器内部发送一条公网请求报文,通过eth0,在veth被接收。此时报文已经来到了主机上,通过查询主机的路由表( route -n ),如果发现报文应该通过主机的eth0,从默认网关发送出去,那么报文就被从docker0转发给主机的eth0,但前提是首先启用ip_forward功能,才能在host主机的docker0和eth0两个网卡间传递数据包。
由于目标地址并不属于host主机所在网段,那么会匹配机器上的 iptables中的nat表POSTROUTING链中的规则。
在host主机运行命令 iptables -L -n -t nat --line-numbers ,查看nat表,这里只看POSTROUTING链:
第一行中说明,对于源地址为172.17.0.0/16网段的数据包,发出去之前通过MQSQUERADE伪装。linux内核会修改数据包源地址为host主机eth0的地址(也就是192.168.0.200),然后把报文转发出去。对于外部来说,报文是从主机eth0发送出去的。
局域网内的机器由于都是私有IP,是无法直接访问互联网的(数据包可以发出去,但回不来。)如果要上网,除了可以通过硬件路由器,也可以通过软件路由,在iptables的nat表中的POSTROUTING链中添加SNAT规则。
测试一下,在host主机运行命令 iptables -t nat -D POSTROUTING 1 将第一条规则删掉,那么在容器中就运行命令 ping sohu.com 就ping不通了。但仍然可以ping通host主机。
在host主机运行命令以下命令恢复:
iptables -t nat -I POSTROUTING -s 172.17.0.0/16 -o eth0 -j SNAT --to-source 192.168.0.200
或者
iptables -t nat -I POSTROUTING -s 172.17.0.0/16 -j MASQUERADE
关于SNAT和MASQUERADE,这篇文章已经有过描述,可以参考: Docker前传之linux iptables
新建一Dockerfile,用以运行nginx容器:
# Version: 0.0.1 FROM paulliu/ubuntu_ip RUN apt-get install -y nginx EXPOSE 80
在host主机运行构建命令构建镜像 docker build -t paulliu/nginx .
在host主机运行容器启动命令 docker run -d -p 80 --name nginx1 paulliu/nginx nginx -g "daemon off;"
在host主机查看容器的端口映射 docker port nginx1 80
在host主机运行命令 iptables -nat -L -n 可以看到在PREROUTING链中多了以下DNAT规则:
也就是在容器启动时通过 -p 80 将host主机192.168.0.200:32773映射为容器172.17.0.4:80。
注意:docker容器每次启动时获取的IP地址未必是一样的,而且 -p 80 是在host主机上随机选择一个端口号进行映射,每次启动的端口号也未必是一样的。但iptables中相关的规则是自动变更的。
在host主机运行 curl localhost:32773 或者在其他主机运行 curl 192.168.0.200:32773 结果如下:
B. 华为s1730链路聚合负载分担方式
数据流是指一组具有某个或某些相同属性的数据包。这些属性有源MAC地址、目的MAC地址、源IP地址、目的IP地址、TCP/UDP的源端口号、TCP/UDP的目的端口号等。
对于负载分担,可以分为逐包的负载分担和逐流的负载分担。
逐包的负载分担
在使用Eth-Trunk转发数据时,由于聚合组两端设备之间有多条物理链路,就会产生同一数据流的第一个数据帧在一条物理链路上传输,而第二个数据帧在另外一条物理链路上传输的情况。这样一来同一数据流的第二个数据帧就有可能比第一个数据帧先到达对端设备,从而产生接收数据包乱序的情况。
逐流的负载分担
这种机制把数据帧中的地址通过HASH算法生成HASH-KEY值,然后根据这个数值在Eth-Trunk转发表中寻找对应的出接口,不同的MAC或IP地址HASH得出的HASH-KEY值不同,从而出接口也就不同,这样既保证了同一数据流的帧在同一条物理链路转发,又实现了流量在聚合组内各物理链路上的负载分担。逐流负载分担能保证包的顺序,但不能保证带宽利用率。
目前交换机仅支持逐流的负载分担。
转发原理
如图4-9所示,Eth-Trunk位于MAC与LLC子层之间,属于数据链路层。
图4-9 Eth-Trunk接口在以太网协议栈的位置
Eth-Trunk模块内部维护一张转发表,这张表由以下两项组成。
HASH-KEY值
HASH-KEY值是根据数据包的MAC地址或IP地址等,经HASH算法计算得出。
接口号
Eth-Trunk转发表表项分布和设备每个Eth-Trunk支持加入的成员接口数量相关,不同的HASH-KEY值对应不同的出接口。
例如,某设备每Eth-Trunk支持最大加入接口数为8个,将接口1、2、3、4捆绑为一个Eth-Trunk接口,此时生成的转发表如图4-10所示。其中HASH-KEY值为0、1、2、3、4、5、6、7,对应的出接口号分别为1、2、3、4、1、2、3、4。
图4-10 Eth-Trunk转发表示例
Eth-Trunk模块根据转发表转发数据帧的过程如下:
Eth-Trunk模块从MAC子层接收到一个数据帧后,根据负载分担方式提取数据帧的源MAC地址/IP地址或目的MAC地址/IP地址。
根据HASH算法进行计算,得到HASH-KEY值。
Eth-Trunk模块根据HASH-KEY值在转发表中查找对应的接口,把数据帧从该接口发送出去。
负载分担方式
为了避蔽局高免数据包乱序情况的发生,Eth-Trunk采用逐流负载分担的机制,其中如何转发数据则由于选择不同的负载分担方式而有所差别。
负载分担的方式主要包括以下几种,用户可以根据具体应用选择不同的负载分担方式。
根据报文的源MAC地址进行负载分担
根据报文的目的MAC地址进行负载分担
根据报文的源IP地址进行负载分担
根据报文的目的IP地址进行宏尺负载分担
根据报文的源MAC地址和目的MAC地址进行负载分担
根据报文的源IP地址和目的IP地址进行负载分担
根据报文的VLAN、源物理端口等对L2、IPv4、IPv6和MPLS报文进行增强型负载分担。
配置负载分担方式时,请注意:
负载分担方式只在流量的出接口上生效,如果发现各入接口的流量不均衡,请修改上行出接口的负载分担方式。
尽量将数据流通过负载分担在所有活动链路上传输,避免数据流仅在一条链路上传输,造成流量拥堵,影响业务正常运行。
例如,数据报文的目的MAC和IP地址只有一个,则应选择根据报文的源MAC和IP地址进行负载分担,如果选择根据报文的目的MAC和IP地址进行负载分担则会造成流量只在一条链路上传输,造成流量拥堵。
如果您想了解如何判断设备是否存在Eth-Trunk负载分腊轮担不均,和当出现Eth-Trunk负载分担不均时,如何调整Eth-Trunk相关配置,请访问华为公司企业技术支持网站搜索《S系列交换机Eth-Trunk负载分担不均配置调整方法》。
C. wan1eth关闭
wan1eth关闭是指关闭外网以太网接口,以防止外网服务被未经授权的枝粗用户访问、攻击或篡慧姿改。关闭wan1eth接口猛碧镇的步骤如下:
1、登录路由器的管理页面;
2、找到“网络服务/端口转发”;
3、点击“wan1eth”接口,将其状态设置为“关闭”;
4、设置完成后保存配置,以使设置立即生效。
D. 容器网络 - 与外网访问
在 容器间通信 一节中,由于两个 Network Namespace 与主机之间隔离,是无法访问外网的,那么如何访问外网呢。可以想到这样一种网络方案,因为 veth1 和 veth2 是连通的,所以 veth1 的数据是可以传递到 veth2 的,那么此时如果 veth2 的数据能传递给 eth0,借助 eth0 的外网访问能力,就能实现 veth1 的外网访问。
省略容器创建和链接命名空间,分别为容器中的网卡 veth1 和主机网卡 veth2 配置ip
可以看到这两块网卡能
可以看到,当我们直接 ping 时,不会有 ICMP 报文发出,提示网络不可达。这是因为 10.130.0.34和veth1不在同一网段,在没有配置网关的情况下,也不知道应该如何发出去。
正常情况下,为了让 veth1 ping 通 eth0,可以给 veth1 配置默认的路由规则,告诉它如果找不到合适的规则,就把数据包从 veth1 扔给 veth2。
配置好路由规则后,就能够 ping 通 10.130.0.34 了。
ping 通10.130.0.34 并不代表数据到达了 eth0 网卡 ,因为 linux 内部网络交换和外部不一样。梳理一下数据流程。
至此,整个 ICMP 通信完成。自始至终网卡 eth0 未参与。
上一部配置好路由,我们测试了 veth1 能够和主机升备行任意一个 IP 地址通信。本节将借助 eth0 访问到网关。
其中的关键点在于,如何把 veth2 的数据包传递给 eth0
先尝试 ping 一下网关,然后抓取 veth2 的数据包,发现只有请求报文,没有响应报文。
再抓取物理网卡(我这里是物理网卡名称是 enp0s3f0,也就是图式的 eth0,统一用 eth0 代表物理网卡)上的数据包。发现没有任何数据包。
为了让数据包从虚拟网卡 veht2 发到 eth0,需要用到 ip_forward ,也就是启用内核的数据包转发功能。数据转发功能能够让内核接收到不属于本机的数据包时,根据 数据包的目的 ip 地址将数据包通过合适的网卡转发出去。
sysctl -w net.ipv4.ip_forward=1
ping 网关测试,可以连通,抓取物理网卡信息,同时存在请求和响应报文。
既然 ping 通了网关,就意味着数据包已经转发出去了,那么可以访问局域网其滚培他主机或者公网吗。
首先测试一下局域网访问,ping 不通,我们在局域网的 179 这台主机上抓包。可以看到 179 收到了 ICMP 请求包,也将应答包发给了网关。
再抓取一下本机网卡,可以看见本机确实没有收到 ICMP 应答包。
这个问题就比较有意思,前一节,网关收到了 ICMP 请求,能够封装 ICMP 应答包回复给主机,而如果网关收到其他主机的 ICMP 回程报文,则由于网关不能正确传递。
其实不传递才是正常的,当网关收到 179 发来的 ICMP 应吵哗答报文时,需要投递给 192.168.0.101,但是网关上没有这样一个匹配的规则,只能走默认路由或者丢弃。
当我们 ping 网关时,猜测应答有一些特殊操作,能够正确将应答包原路返回 这个问题我暂时也不清楚 。
为了让数据包能正确的被路由,需要使用到 SNAT 技术。
SNAT 功能比较简单,就是将源地址在 192.168.0.0/24 这个网段的数据包,将其源地址转换以后,发送出去,用 iptables 规则就可以实现。
root@merore ~$ iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
此时再 ping 一下其他主机和公网。均能正常访问。
抓取本机网卡数据包,可以看到发出去的数据包源ip地址都被替换为了实际的物理网卡地址 10.130.0.34
至此,就手动完成了单主机下容器与外网通信的整个流程。
容器网络与外网通信用到的技术
其实这里还遗留了一个问题,在配置 SNAT 之后, 我们能够理解数据包能正确的发出去,eth0 网卡也能正确的收到回程报文,但此时回程报文的源地址是 10.130.0.179,目的地址是 10.130.0.34 。这样一个数据包又是如何正确的回传给 虚拟网卡veth2,然后传递 veth1 的呢。可以参考以下链接。
https://blog.csdn.net/sinat_33822516/article/details/81088724
E. 追踪和管理数字资产新姿势,教你学会查看区块链账单
账单记录价值流通和状态,是金融服务的基础功能。
我们常用的银行、支付宝、微信支付等都会为普通用户和商家记录一笔交易,提供不同维度的查询、统计和分析服务。
比如大家爱晒的支付宝年度账单,会统计用户全年的总收支、消费种类、余额宝和其他理财收益、点外卖的次数等。通过大数据技术,展示各个地域,不同年龄段的消费兴趣和趋势,让消费者更了解自己周边的消费环境,商家能够及时把握市场需求。
在去中心化的区块链网络里,交易被永久的记录在链上,公开透明,人人可查。
但是由于区块链的设计更倾向于保证不可篡改和数据压缩需求,导致业务层面的过滤查询功能缺失。 加上不同链的规则不同,追踪和管理加密资产变的异常困难。这也是为什么数字资产投资者常常感叹“总觉得帐没算明白“的原因所在。
SixPencer推出全新区块链记账神器,目前已支持比特币(Bitcoin)和以太坊(Ethereum)底层的资产追踪和管理,免费使用,无需注册。
一经推出,受到了包括矿工、资管机构、OTC商户、加密创业公司、数字资产投资者的喜爱。
作为专业的资管工具,不仅能够查询所有链上交易记录,实时查看账户余额和持有资产,而且 提供每日各币种收支情况、支持单或多地址聚合收支统计、地址画像分析和图表、大额交易记录排行、联系人管理等。
进入网站后, 在首页搜索框,输入比特币或以太坊地址 , 点击搜索即可进入该地址的总览页面。
我们以目前ETH持有量全网排名第一的地址: (标签:bitfinex 1) 账户作为demo账户进行演示,所有数据均为真实链上数据。
这里简单介绍下区块链上的地址和银行账户的区别。 在区块链上,地址就类似于银行卡号,知道地址就等于知道银行卡号一样,可以向其转账。
但不同的是, 区块链是不可篡改的分布式公开账本,通常具有匿名性,任何人可以对任何地址进行公开查询。 银行账户只能查询本人的账户信息,无法通过银行卡号得知其他人的账户信息。
如果用户有多个地址,或者想追踪其他地址,均可以通过搜索, 所有搜索过的地址信息会在资产组合页面进行汇总,点击下拉框即可切换或者删除账户。
SixPencer除包含区块链浏览器提供的基础信息外,添加展示了一些个性化的指标,帮助用户了解自己的链上画像,也可以追踪其他账户的链上轨迹。在下面总览页面可以查看地址的资产概览、历史指标、收支统计、持有资产信息。
地址概览
创建时间:第一次收到ETH的日期
净资产:所有资产,包含ERC20 token资产的合计美元价值
ETH排行:持有ETH数量在所有以太坊地址中的排名
ETH余额和估值:持有的ETH数量和其对应的美元价值
历史指标
历史指标展示交易量、交易次数、代币分析和联系人分析四大维度。 通过统计,算不清的糊涂账终于能算清了,比如最简单的会计计算,ETH总收入=ETH余额+ETH总支出+ETH总手续费。 再比如总交易次数=转入交易次数+转出交易次数。
由于以太坊网络的特殊性,所有转账的手续费都是以ETH支付。因此我们将手续费单独罗列出来,在交易明细中也支持手续费单独筛选,帮助用户统计手续费支出。
一些有趣的数据,demo账户手续费支出为1.1556ETH,ETH单笔大额转账达90万个ETH,持有代币数量有350种,交易次数最多的代币是USDT,与其交易过的地址仅37个。
一般持有上百种不同资产的地址通常都是交易所地址,加上交易次数和联系人并不多,可以排除是对外地址,基本可以判断是bitfinex交易所内部使用地址。
收支情况
统计了本月全部资产合计收入和支出,支出包含手续费支出。
持有资产情况
展示持有的资产数量、价值、资产价格和24h涨跌幅。demo账户这类交易所的地址,持有资产通常10页都放不下。
SixPencer除了提供地址的交易流水外,还支持全历史交易记录查询和筛选、余额信息、日收支统计等。
交易明细
从下面页面可以清晰得知ETH资产的本月收支情况 ,用户还可以根据日期,资金流向、交易分类和标签系统进行筛选,根据自身需求进行更细致的统计,后面会介绍如何进行指定地址的交易筛选。
点击上图中的ETH下拉框,可以切换到其他币种的交易详情页面 ,比如切换到USDT的交易详情查看USDT的明细状况。
除月账单外,SixPencer展示每笔交易的交易明细,提供交易方向、交易对手方、交易金额、账户余额、交易时间、每日收支情况等信息。 下图可以看到近6笔ETH交易均为从bitfinex 3 账户转入bitfinex 1的交易。
交易详情
点击任意一笔交易明细,即可进入该笔交易的交易详情页。 交易哈希是每笔链上转账都有的唯一不可篡改的交易ID,类似于订单号的概念。
通过交易哈希就可以查询到一笔交易的具体信息。
下面所展示的交易数量、交易状态、交易时间、发送和接受方、手续费等都是这笔交易的具体信息,在这里不再赘述。 值得注意的是,SixPencer提供个人标签和备注系统,用户可以对单笔交易,进行个性化分类和备注, 帮助记忆,不遗忘每一笔交易。
如何快速找到和指定地址的交易信息?
时间变久,交易变多后,查询链上指定交易信息就变得异常复杂和困难,SixPencer将交易信息按照业务需求进行细化,并提供标签系统辅助用户进行自定义交易查询和统计。
比如想要查询2020年6月地址(标签:bitfinex 3)一共向demo账户转入了多少ETH。通过我们的账单系统,仅需两步操作即可查询。
1、打标签: 为了演示,我们将“bitfinex 3“这个标签重命名为“测试test”。
2、筛选: 将日期筛选为6月1日-6月30日,在筛选栏 选中“转入”,并在最下面的标签栏选中“测试test”,点击保存。
保存后即可搜索出所有6月“测试test”转入到demo账户的交易信息,从下图可以看出6月份,demo账户共从标签为“测试test“的地址收到58,440.2489个ETH。
如果用户想查询和多个指定地址的交易,选中多个标签后,调整日期、资金流向等信息即可进行资产的自动统计。
在分析一栏,用户可以查询地址不同维度的图表分析信息,包含余额、交易、分类和排行四大维度。 分别点击各维度还能够查看更多详细数据和图表。
余额:余额展示资产的余额数量和价值走势
交易:交易展示全部交易、转入和转出的交易数量、交易数量价值和交易次数走势
分类:分类根据平台地址标签系统对交易类型进行统计,反应地址的交易偏好
排行:排行按照交易次数展示活跃联系人,按照交易金额展示大额交易
比如排行分析,能够很快查看与某个地址的具体交易金额和大额转账情况。如下图,demo账户与标签为“测试test” 的地址在本月一共交易了177次,其他与demo账户交易较多的都是ERC20 Token合约调用交易。
从下图看,大额排行也都是与标签为“测试test”的地址交易信息,表格展示交易对象、交易时间、交易方向、交易数量和价值。 对交易所大户感兴趣的,可以查询交易所地址的大额转账信息,看看哪些地址都是充提大户。
通讯录展示所有和demo账户有过交易记录的地址,除平台自带的标签体系外,用户可以对地址添加标签或者重命名标签。
标签:展示平台标签系统已知标签和用户自行添加的标签
最近联系人:展示最近30天有过交易记录的地址/标签
全部联系人:展示所有有过交易记录的联系人地址/标签,交易数量超过1万笔的地址,取最近1万笔交易的联系人展示
综上,SixPencer的全新资产追踪和管理工具能够提供比区块链浏览器或者钱包更综合的查询和分析功能, 作为一款工具产品意在辅助用户进行数字资产管理,通过对链上用户画像的进一步解析,帮助大家更好的决策。
我们认为区块链的公开透明机制应该让数据查询更简单,但目前按照实际业务需求快速查询区块链数据仍然是难点痛点,并成为商业落地的一大阻碍。
数字资产交易仅仅是其中一小块,未来还将有大量有价值的数据存储在区块链上,SixPencer将继续推出更多实用工具,让数据更好为业务服务。
F. 路由器冗余故障的解决方法
一、组网环境
路由器A和路由器B上通过VLANIF接口或以太子接口与Switch相连,在路由器A和路由器B与Switch相连的链路上配置VRRP备份组,两台路由器都是Master状态,但由于传输没有透传vlan导致VRRP应用不成功。
二、册嫌故障分析
1、两台路由器状态都是Master,说明两台设备肆姿差都不能接收对方的VRRP广播报文,初步判断是Switch没有转发报文。
2、从路由器A的接口Eth2/1/1.1 Ping 路由器B的接口Eth2/1/1.1,不能相互Ping通。
裂皮3、将路由器A的接口Eth2/1/1.1和路由器B的接口Eth2/1/1.1恢复为普通3层以太接口,非VLANIF或以太子接口,配置IP地址,可以相互Ping通。
4、由此判断,是Switch没有透传带Vlan tag的报文。
三、故障处理
1、执行interface ethernet2/1命令,进入接口视图。
2、执行port trunk allow-pass vlan { { vlan-id1 [ to vlan-id2 ] } &<1-10>| all }命令,允许Vlan通过。
3、对交换机端口Eth2/2执行相同操作,过程略,配置完成后,VRRP备份组可正常运行。
使用以太子接口或VLANIF接口配置VRRP备份组时,由于发出的.报文携带Vlan标签,此时一定要使能中间的交换机上透传Vlan标签的能力。
G. 区块链中的硬分叉,以太经典ETC是什么意思
以太经典(ETC)简史
以太经典始于一个不幸的事件。
2016年5月,去中心化自治组织(DAO)举行了一次代币销售,目标是建立一个基于区块链的风险投资,以资助Ethereum生态系统内未来的去中心化应用(DApps)。
基本上,DAO是一个去中心化方式运作的复杂的智能合约–当条件满足时自动在多方之间执行任务的计算机代码。
尽管其有着雄心勃勃的目标以及成功的代币销售,DAO的代码却有一个重大漏洞,使得攻击者可以从去中心化组织中窃取ETH。
攻击者在2016年6月利用这一漏洞,引发了臭名昭著的DAO黑客事件,恶意窃取了大约价值5000万美元的ETH。
毋庸置疑,DAO黑客事件曾震惊了Ethereum社区,也使得ETH价格从20美元跌至13美元。
在DAO黑客事件发生后,Ethereum社区不得不从三个选项中选择。
什么都不做,努力承受攻击带来的后果;
启动软分叉,收回资金;
部署一个硬分叉来恢复丢失的ETH。
软分叉和硬分叉都是重大的网络升级。然而,软分叉允许未升级的用户和升级后的用户相互交流,而硬分叉则不能向后兼容以前的版本。
由于开发人员意识到部署软分叉会使网络受到分布式拒绝服务(DDoS)攻击,Ethereum社区决定发起硬分叉,以恢复在DAO黑客攻击中损失的资金。
虽然这一方案得到了大多数人的支持,但Ethereum社区中的一小部分人却表示反对,他们认为 “代码即律法”,区块链网络应该是不可改变的。
由于双方未能在解决方案上达成一致,最终导致了Ethereum区块链的分裂。
那些试图找回丢失的ETH的人选择了硬分叉,开启了我们今天所熟知的Ethereum(ETH)区块链,而另一群人则留在了最初的Ethereum Classic(ETC)链上。
以太经典解决了那些问题?
以太经典(ETC)是一个允许开发者部署智能合约和DApps的区块链平台。
虽然这个功能与Ethereum(ETH)的功能相同,但ETC区块链有两个主要区别。
首先,Ethereum Classic社区反对篡改分布式账本,支持“区块链网络不能也不该被修改”的观点。
其次,虽然ETH总供应量没有硬性上限,但以太经典采用恒定供应的货币政策,最多允许创建2.3亿个ETC。
作为一个加分项,以太经典在去年启动了Atlantis硬分叉,以增加与Ethereum的交互性,并通过zk-SNARKS提高交易的隐私保护程度。
以太经典ETC推荐的交易平台:火币、OKEX、AAX等。
H. 用python篡改icmp报文再发送给接收方
程序处理上有些问题,建议深入研究一下ICMP协议。下面是Python 3的一个ICMP的简单实现,可以参考一下。
importsocket
importstruct
defchecksum(source_string):
sum=0
countTo=(len(source_string)/2)*2
count=0
碰中铅whilecount<countTo:
thisVal=ord(source_string[count+1:count+2])*256+ord(source_string[count:count+1])
sum=sum+thisVal
sum=sum&0xffffffff
count=count+2
ifcountTo<len(source_string):
培扰sum=sum+ord(source_string[len(source_string)-1])
sum=sum&0xffffffff
sum=(sum>>16)+(sum&0xffff)
sum=sum+(sum>>16)
answer笑好=~sum
answer=answer&0xffff
answer=answer>>8|(answer<<8&0xff00)
returnanswer
defping(ip):
rawsocket1=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.getprotobyname('icmp'))
packet=struct.pack('!BBHHH8s',8,0,0,0,0,b'abcdefgh')
chksum=checksum(packet)
packet=struct.pack('!BBHHH8s',8,0,chksum,0,0,b'abcdefgh')
rawsocket1.sendto(packet,(ip,1))
ping('10.172.23.254')
I. Lvs ip-tun(ip隧道)的原理和实现
采用Nat技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务器应答比请求报文大许多,采用VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。
实验规划:
(1).将物理机上的VMnet1网卡的ip设置为200.168.10.4,子网掩码设置为255.255.255.0
(2).为Lvs服务器配置一块网卡eth0,网络连接设置为VMnet1,设置IP地址:ifconfig eth0 200.168.10.1
(3).为两台迟老真实服务器配置一块网卡,网络连接设置为VMnet1,设置IP地址:ifconfig eth1 200.168.10.2和ifconfig eth1 200.168.10.3
(4).为Lvs服务器和两台真实服务器都配置一个tunl0网卡,配置为单独的网段:ifconfig tunl0 200.168.10.10 netmask 255.255.255.255 up,route add -host 200.168.10.10 dev tunl0
(5).Lvs ip-tun服务器脚本:
ipvsadm -C
ipvsadm -A -t 200.168.10.10:80 -s rr(-t:采用tcp协议;-s:模式参数;rr:采用轮叫算法)
ipvsadm -a -t200.168.10.10:80 -r 200.168.10.2 -i(-r:真实服务器贺胡ip;-i:ip-tun模式)
ipvsadm -a -t200.168.10.10:80 -r 200.168.10.3 -i
(6).真实服务器脚本:
echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1"禅旦拦 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
注:目前只有Unix/Linux版本的操作系统才具备ip-tun网卡
J. 我用ethereal软件抓包,ping 10.22.99.1 -l 1 -t,发现eth网报文的长度是43字节,按道理以太网字节最小是6
以太网64字节最小,这个64字节是包括以太网头的(smac/damc/ tpid),你再check一下ethereal