Linux 源路由,nexthop 指向 Docker

Linux 源路由,nexthop 指向 Docker

我有一个类似的问题链接到服务器故障,但在进一步研究这个问题之后,我相信我已经将问题细化为 Linux 路由表问题。

背景:

AWS 发布了网关负载均衡器,它使用 GENEVE 封装数据包并将其转发到指定的目标组。我的目标是让运行 Squid 的 EC2 实例充当域过滤的透明代理。我已启动并运行 AWS 路由和 GLB,并且数据包正在传送到 EC2 实例,但我无法使数据包转发行为正常工作。

努力:

因为 EC2 实例在解封装后应该查看其路由表(启用 ipv4 转发后)并将流量转发出 eth0,因为这是默认路由。

但是,因为我需要拦截此流量,所以我想为来自 10.0.0.0/8 的流量设置下一跳以转到 172.17.0.2(docker 容器的 IP)。 docker 容器公开了 tcp/80、tcp/443 和 tcp/3128,以及映射 3128->3128、80->3129 和 443->3130。假设它通过了,流量就会从容器中流出,并到达网络的默认网关 (172.17.0.1/16),然后该网关应遵循其本地路由表前往 EC2 实例的网关 (10.160.221.97)。

EC2 流量

这有点……复杂,但是,我们的想法是让 ec2 实例能够自给自足地接收流量并对其进行过滤。我不需要状态跟踪,我们只是想阻止坏地方的出站流量(许可 URL 列表中没有色情内容!)

那么到目前为止我所做的:

使用 GLBe 的远程单播地址创建 GENEVE 接口:

#enable geneve tunnel
sudo ip link add name geneve0 type geneve id 1000 remote 10.160.221.119
sudo ip link set geneve0 up

启用IP转发:

#set forwarding
sudo sysctl -w net.ipv4.ip_forward=1

创建自定义路由表:

#create custom route table with ID 200
sudo echo "200 custom" >> /etc/iproute2/rt_tables

所以它应该看起来像这样:

cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0   unspec
#
# local
#
#1  inr.ruhep
200 custom

在自定义路由表中添加了规则,说明流量是否来自 10/8 才能使用自定义路由表:

sudo ip rule add from 10.0.0.0/8 lookup custom

为了确保我的笔记本电脑(在 172.16 网络上)不会失去访问权限:

sudo ip route add 172.16.0.0/12 dev eth0 via 10.160.221.97

(而且,你知道,因为我正在发表这篇文章,你可以清楚地看出它不起作用)

所以,我的默认路由表如下所示:

ip route list

default via 10.160.221.97 dev eth0 
10.160.221.96/27 dev eth0 proto kernel scope link src 10.160.221.105 
169.254.169.254 dev eth0 
172.16.0.0/12 via 10.160.221.97 dev eth0
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 

流量进入接口,GENEVE 封装,一切都很好。我遇到困难的是 ec2 实例上的路由。

当我添加自定义表的默认路由时,我失去了访问权限:

sudo ip route add default via 172.17.0.2 dev docker0 table custom

那么,对我所缺少的内容有任何帮助或见解吗?

编辑 - 进一步更新:

如果我更改命令,没有区别:

[ec2-user@proxy-10-160-221-105 ~]$ sudo ip route add default via 172.17.0.2 dev eth0 table custom
Error: Nexthop has invalid gateway.
[ec2-user@proxy-10-160-221-105 ~]$ sudo ip route add default via 172.17.0.2 table custom

答案1

我不认为这是一个路由问题。您不需要任何额外的路由语句。只需使用 iptables,您就会处于良好状态。

在充当 docker 主机的 EC2 实例上启用路由

sudo echo 1 > /proc/sys/net/ipv4/ip_forward

将所有 HTTP 流量 (TCP 80) 重定向到侦听 TCP 3129 的 docker 容器

sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 172.17.0.2:3129

将所有 HTTPS 流量 (TCP 443) 重定向到侦听 TCP 3130 的 docker 容器

sudo iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination 172.17.0.2:3130

启用 NAT(又名 Masqurade)

sudo iptables -t nat -A POSTROUTING -j MASQUERADE

相关内容