我有一个类似的问题链接到服务器故障,但在进一步研究这个问题之后,我相信我已经将问题细化为 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 实例能够自给自足地接收流量并对其进行过滤。我不需要状态跟踪,我们只是想阻止坏地方的出站流量(许可 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