docker与物理网络互通
微服务的流行推动着容器技术的发展,伴随着新技术的应用产生了新的问题。比如开发人员本机无法运行诸多的微服务,如何保障开发正常进行。本文将介绍如何打通开发环境网与docker环境之间的网络。
网络互通配置
由于Kubernetes集群会使用CNI插件创建Pod/Service内部子网,外面一般无法访问内部IP和域名,给开发、测试、 联调带来了很大的麻烦,因此打通开发测试环境Kubernetes集群内部子网和办公室的局域网、实现互联互通是经常遇到的问题。
通过路由跳转打通容器网络
选一台docker节点做路由转发,连接办公室网络和 docker 集群服务
- 节点 IP 地址 192.168.1.90
- 容器网段 10.42.0.0/16
- 办公网段 192.168.0.0/24
我的网络整体结构本身不复杂,所以相对来说配置简单。
节点,做snat:
开启转发
1 | vim /etc/sysctl.d/k8s.conf |
来自办公室访问docker service snat
iptables
顺便回顾一下iptables的用法,主要是时间久了没用过都忘了。
iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分。可以直接配置,也可以通过许多前端和图形界面配置。
语法
1 | iptables(选项)(参数) |
选项
1 | -t<表>:指定要操纵的表; |
iptables命令选项输入顺序:
1 | iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作 |
表名包括:
- raw:高级功能,如:网址过滤。
- mangle:数据包修改(QOS),用于实现服务质量。
- net:地址转换,用于网关路由器。
- filter:包过滤,用于防火墙规则。
规则链名包括:
- INPUT链:处理输入数据包。
- OUTPUT链:处理输出数据包。
- PORWARD链:处理转发数据包。
- PREROUTING链:用于目标地址转换(DNAT)。
- POSTOUTING链:用于源地址转换(SNAT)。
动作包括:
- [accept]:接收数据包。
- DROP:丢弃数据包。
- REDIRECT:重定向、映射、透明代理。
- SNAT:源地址转换。
- DNAT:目标地址转换。
- MASQUERADE:IP伪装(NAT),用于ADSL。
- LOG:日志记录。
1 | iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -d 10.42.0.0/16 -j MASQUERADE |
POSTROUTING是源地址转换(SNAT),要把你内部网络上受防火墙保护的ip地址转换成你本地的公网地址才能让它们上网。
PREROUTING是目的地址转换(DNAT),要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的服务器。
MASQUERADE,地址伪装,算是snat中的一种特例,可以实现自动化的snat
借用阿里云的一张图
多个内网段SNAT,就是多条SNAT语句即可
1 | iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 10.42.0.0/16 -j MASQUERADE |
在办公室的出口路由器上,设置静态路由,将docker的网段,路由到节点上
1 | ip route 10.42.0.0 255.255.255.0 192.168.1.90 |
以上步骤操作后,我们就可以在本地电脑通过访问docker ip去访问服务。
通过VPN打通容器网络
生成服务端配置文件和证书
生成服配置文件
1 | OVPN_DATA=/data/openvpn |
参数说明
-u SERVER_PUBLIC_URL # vpn所在服务器的公网ip
-n DNS_SERVER # dns服务器地址
-p PUSH # 推送路由
-s SERVER_SUBNET # vpn内网范围,一定要注意,不要和已有物理网络、Kubernetes网络冲突。
修改配置
注释push "block-outside-dns"
一行,我这里不注释 dns 解析异常
生成密钥文件
1 | OVPN_DATA=/data/openvpn |
在此要输入ca的密码,需要输入两次。
1 | Enter New CA Key Passphrase: |
此处要输入组织,可直接回车跳过。
1 | Common Name (eg: your user, host, or server name) [Easy-RSA CA]: |
输入之前设置的私钥密码,需要输入两次
1 | Enter pass phrase for /etc/openvpn/pki/private/ca.key: |
启动OpenVPN服务
1 | OVPN_DATA=/data/openvpn |
生成客户端配置和证书
生成客户端证书
CLIENTNAME可以是你想要的名字
1 | OVPN_DATA=/data/openvpn |
输入之前设置的密码
1 | Enter pass phrase for /etc/openvpn/pki/private/ca.key: |
导出客户端配置
1 | OVPN_DATA=/data/openvpn |
基于用户密码方式认证
参考之前的Cenos7搭建OpenVPN
最终配置
服务端配置文件
1 | server 10.4.0.0 255.255.255.0 |
客户端配置文件
1 | client |
参考链接: