iptables chain
iptables table:
- filter:
- nat:
- magle:
- raw:
query
iptables
こんにちは
iptables chain
iptables table:
query
iptables
最近遇到了一件事, 让我又多熟悉了下HTTPS的相关内容, 先看看HTTPS的结构
通常的HTTP网络结构如下
+------+| HTTP |+------+| TCP |+------+| IP |+------+ ...
HTTP的的相关内容是通过TCP明文传输的, 如果有中间监听者, 可以直接看结相关内容.
HTTPS的结构
2021-03-20 01:25AM
最近一直在研究关于如何给一个fabric的组织更换一个新的证书, 包括所有加入的通道, 所有peer和orderer.
用了很多看似完美的方法却多次测试失败, 最后总算找到一种方法.
{ "channel_group": { "groups": { "Application": { "groups": { "Org1MSP": { "groups": { }, "mod_policy": "Admins", "values": { "MSP": { } }, "version": "0" }, "Org2MSP": { "groups": { }, "mod_policy": "Admins", "values": { "MSP": { } }, "version": "0" } }, "version": "1" }, "Orderer": { "groups": { "OrdererOrg": { "groups": { }, "values": { "MSP": { } }, "version": "0" } }, "values": { "ConsensusType": { "mod_policy": "Admins", "value": { "metadata": { "consenters": [ { "client_tls_cert": "==", "host": "orderer.example.com", "port": 7050, "server_tls_cert": "==" } ], "options": { "election_tick": 10, "heartbeat_tick": 1, "max_inflight_blocks": 5, "snapshot_interval_size": 16777216, "tick_interval": "500ms" } }, "state": "STATE_NORMAL", "type": "etcdraft" }, "version": "0" } }, "version": "0" } }, "sequence": "2" }}
一个通道配置块类似上面这种,为了看的清楚有些内容我删了, 更换证书我们需要保证application及orderer的MSP是相同的, 否则更新配置块是不会成功的, 且我们得保证当前组织的raft节点的证书也要全部更换掉.
比如grub在/etc/default/grub的GRUB_CMDLINE_LINUX_DEFAULT=中添加
intel_iommu=on i915.enable_gvt=1 i915.enable_guc=0
在/etc/mkinitcpio.conf的MODULES=()`中添加:
# linux 5.14后,arch的linux内核模块已经不会勾选vfio-mdev,自测不影响gvt-gkvmgt vfio vfio-iommu-type1s
然后运行,我用的zen内核所以是linux-zen,默认内核是linux
sudo mkinitcpio -p linux-zen
重启计算机
查看/sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types可以看见类似如下的目录
生成一个密钥
gpg --full-gen-key
之后会选择加密方式, 有效期, 用户名及邮箱, 密码, 按自己需求填就行了.
创建一个子密钥
gpg --edit-key [key hash] gpg> addkey#只有与前面是相同的, 按需求选择. gpg> save# 保存
导出密钥
gpg -o /path/gpg_key --export-secret-keys [key hash]
导出子密钥
gpg -o /path/gpg_key.sub --export-secret-subkeys [key hash]
导出吊销证书
gpg --generate-revocation [key hash]# 输出是文本内容, 复制保存下来就行了
complete document MaxMind DB File Format SpecificationDescription
here is only how convert trie tree to array
0100, 1011 -> trie
trie -> array
left is 0, right is 1
value is index of array
这个DNS系列现在有以下几篇文章
完整代码请看DNS
DOH就比较简单了,因为DOH使用的请求数据和应答数据均为之前的DNS协议格式,包括DNS,EDNS,DNSSEC…当然是否支持EDNS,DNSSEC需要看DNS服务器的支持情况
DOH的最主要的区别是把DNS使用的UDP,换成了HTTPS,这样就能防止DNS污染了,而且可以使用DNSSEC加上ESNI来防止证书劫持,DOH的协议在rfc8484中有定义
DOH主要有两种方式HTTP的GET请求和POST的请求
GET请求需要使用BASE64对请求的字节数据进行序列化,然后作为参数传递,获取到的数据使用我们之前的解析进行解析就行了
func get(dReq []byte, server string) (body []byte, err error) { query := strings.Replace(base64.URLEncoding.EncodeToString(dReq), "=", "", -1) urls := "https://" + server + "/dns-query?dns=" + query res, err := http.Get(urls) if err != nil { return nil, err } defer res.Body.Close() body, err = ioutil.ReadAll(res.Body) if err != nil { return nil, err } return}
POST并不需要进行序列化,直接把原始请求数据作为body就行了
这个DNS系列现在有以下几篇文章
完整代码请看DNS
注意: 这里我只完成了请求字段,主要原因是因为我学习这些DNS协议是为了找到防止DNS污染的方法,而DNSSEC并不能,而且应答头比较复杂,可能还要了解ssl和tls的知识,所以这里我没有完成代码,想了解的请看protocol change rfc4034 rfc4035 Algorithm
DNSSEC也是使用了EDNS,而且只需要改一个字段,就是之前提到Z,具体协议请看
+0 (MSB) +1 (LSB) +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+0: | EXTENDED-RCODE | VERSION |+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+2: |DO| Z |+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
完成请求头
这个DNS系列现在有以下几篇文章
DNS EDNS DNSSEC DNS over HTTPS 完整代码请看DNS
上一篇我们写了DNS,EDNS就是DNS的功能扩充.
上一篇的DNS里头部有ARCOUNT的计数,EDNS就包含在那个里面,EDNS发送的请求在请求头之后的Additional中,应答在Answer和Authoritative之后,我们可看以下图,跟清晰了吧
+---------------------+ | Header | +---------------------+ | Question | the question for the name server +---------------------+ | Answer | RRs answering the question +---------------------+ | Authority | RRs pointing toward an authority +---------------------+ | Additional | RRs holding additional information +---------------------+