基于路由转发+iptables方式实现docker容器跨节点通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于路由转发+iptables方式实现docker容器跨节点通信相关的知识,希望对你有一定的参考价值。

参考技术A 参考文献:
https://blog.csdn.net/wangshuaiwsws95/article/details/80687384

    目前正在研究docker的网络,kubernetes网络的相关解决方案,如calico;
而calico的底层也是调用iptables, ipset来实现的。 如何解决跨主机通信是值得研究的。
分析完这个后,有助于理解calico是如何在docker、k8s环境中应用的。

    有两个物理主机1和主机2,在各自宿主机上启动一个容器,启动成功之后,两个容器分别运行在两个宿主机之上,默认的IP地址分配如图所示,这也是Docker自身默认的网络

在master节点进行测试

注意,这里仅仅可以master节点上去ping slave节点, 反之不行,
如果想实现双向通信的话, 操作步骤跟上面类似。

https://www.cnblogs.com/davidwang456/p/3540837.html

网路防火墙iptables

linux操作系统自身可以充当交换机,还可以当路由器,也就是说linux多网卡之间拥有互相转发数据包的能力,这种能力的实现主要依靠的是防火墙的功能进行数据包的转发和入站。
路由选择点,就是在一个点分辨出事转发还是入站,在路由选择点之前的路叫路由选着前,出站之后的路叫路由选择后
存储链的表示filter 和nat
filter里村的是入站出站,和转发
nat存的是路由前,路由后和出站。

入站叫INPUT

出站叫OUTPUT

转发叫FORWARD

入站前叫PREROUTING

出站叫之后叫POSTROUTING

保存防火墙规则的配置文件/etc/sysconfig/iptables

导出备份的命令

iptables-save > 文件路径

导入还原命令

iptables-restore < 文件路径

 

iptables的命令用法和参数

iptables -t 【表名】 选项 【链名】 【条件】 【-j控制类型】

注意事项:

不指定表名时:默认的是filter表

不指定链名时:默认是表内所有的链

除非设置链的默认匹配,否则必须知道匹配条件

选项、链名、控制类型使用大写字母、其余的均为小写

控制类型常用的参数

ACCEPT:允许通过

DROP:直接丢包,不给出任何的回应

REJECT:拒绝通过 ,必要时会给出提示

LOG:记录日志信息,然后传给下一条规则继续匹配

选项类的参数

-A:在链的末尾追加一条规则,

-I:在链的开头(或指定序号)插入一条规则

查看表规则参数。

-L:列出所有的规则条目

-n:以数字形式显示地址,端口等信息

-v:以更详细的方式显示规则信息

--line-numbers:查看规则时,显示规则的序号。--line与之同效

删除清空规则的参数

-D:删除链内指定序号(或内容)的一条规则

-F:清空所有的规则

iptables -D INPUT 3
删除input链上的序号是3的规则

 

修改、替换规则

-R:修改替换规则

修改链规则

-P:修改链的规则

iptables -P FORWARD -j DROP
所有的转发链都丢包

 

通用匹配参数

-p:协议匹配,指定协议

-s:来源地址匹配,指定来源

-d:目标地址匹配,指定目标

-i:指定入站的网卡匹配

-o:指定出站的网卡匹配

隐含的匹配

隐含的匹配需要在有通用的匹配后才能使用,--开头

--sport:来源端口,需要指定协议后才能匹配

--dport:目标端口,需要指定协议后才能匹配

iptables -A INPUT -s 192.168.200.0/24 -p tcp --sport 22:21 -dport 53 -j ACCEPT
例句的意思是在input链上追加一条,来源ip为200网段的tcp协议,来源端口是22~21,目标端口是53的都同一通过

 

--tcp-flags:检查范围被设置的标记

iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ADK,SYN -j DROP
例句的意思是在input链上插入一条从eth1网卡进来的tcp协议,被标记的syn等包都丢掉

 

icmp协议的隐含匹配

--icmp-type 类型

8 Echo request 请求包

0 Echo reply 应答包

3 错误回显

iptables -A INPUT -p icmp --icmp-type 8 -j DROP
例句的意思是最近一条规则在input链,所有的icmp协议的请求包都丢掉

 

状态匹配 -m state --state 连接状态

常见的连接状态

NEW:新连接

ESTABLISHED:响应请求,或已经建立连接的

RELATED:与已连接有相关性的,如ftp数据连接

iptables -A INPUT -p tcp --dport 80 -m state --state ESTABLISHED,RELATED,NEW -j DROP
命令的意思是在input链上追加一条tcp规则已经连接和有关联的连接新的连接都拒绝

 

技术分享图片

 

 SNAT将来源的ip转换成自己设定的ip

iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o eth1 -j SNAT --to-source 192.168.100.100
例句的意思是指定nat表最近一条针对出站后的链来源ip是200网段的从eth1出的,统统把来源ip换成192.169.100.100

 

DNAT将目标ip转换成自己设定的ip

iptables -t nat -A PREROUTING -i eth0 -d 192.168.100.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.200.88:8080
例句的意思是将nat表 入站前 从eth网卡来的目标ip是192.168.100.100 端口是80来的tcp协议都改成目标ip为192.168.200.88端口是8080

 











以上是关于基于路由转发+iptables方式实现docker容器跨节点通信的主要内容,如果未能解决你的问题,请参考以下文章

iptables路由转发及控制

IPTABLES防火墙

网路防火墙iptables

iptables命令详解是啥

2个机器之间的端口转发 iptables实现

防火墙iptables实现Linux强大的NAT功能