技术解析
A 机器建立与 B 机器连接的 gre 通道(并把 10000 端口通过 gre 通道转发到 B 机器):
ip link add gre-y type gre local A 机器 ip remote B 机器 ip ttl 64
ip link set gre-y up
ip addr add 10.1.1.2/24 dev gre-y
iptables -t nat -I PREROUTING -p tcp --dport 10000 -j DNAT --to-destination 10.1.1.3:10000
B 机器建立与 A 机器连接的 gre 通道:
ip link add gre-x type gre local B 机器 ip remote A 机器 ip ttl 64
ip link set gre-x up
ip addr add 10.1.1.3/24 dev gre-x
B 机器上的 10000 端口是通过 docker 启的,B 机器ifconfig
如下:
[[email protected] ~]# ifconfig
docker0: flags=4163 mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:b5ff:fe37:829d prefixlen 64 scopeid 0x20
ether 02:42:b5:37:82:9d txqueuelen 0 (Ethernet)
RX packets 1748106 bytes 280406387 (267.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1747699 bytes 748575892 (713.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
gre-x: flags=209 mtu 1476
inet 10.1.1.3 netmask 255.255.255.0 destination 10.1.1.3
inet6 fe80::5efe:c0a8:8eb1 prefixlen 64 scopeid 0x20
unspec C0-A8-8E-B1-00-00-C0-9B-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC)
RX packets 748 bytes 42201 (41.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 800 bytes 62808 (61.3 KiB)
TX errors 28 dropped 0 overruns 0 carrier 0 collisions 28
我的需求是:B 机器收到 A 机器( 10.1.1.2 )的请求,默认走 B 机器的 gre-x 网卡,随后 B 机器通过 10.1.1.3 返回的流量默认从 gre-x 网卡返回。B 机器上是这么配置的:
ip route add default via 10.1.1.2 dev gre-x table 111
ip rule add pref 1000 from 10.1.1.3 lookup 111
但是流量返回不回去,B 机器上抓包发现问题: A(10.1.1.2) -> B 机器 -> docker 启的 10000 端口( 172.17.0.x )-> 流量从 172.17.0.x 返回。
以至于 A 机器端口转发到 B 机器,无法联通。求助大家该如何解决?