我有一个类似的问题链接到ServerFault,但是在进一步研究这个问题之后,我相信我已经将这个问题改进为一个Linux路由表问题。
背景:
AWS发布了他们的网关负载均衡器,它用GENEVE封装数据包并将它们转发给指定的目标组。我的目标是让运行Squid的EC2实例充当域筛选的透明代理。我已经启动并运行了AWS路由和GLB,并且正在将数据包传递到EC2实例,但无法使数据包转发行为正确工作。
努力:
因为EC2实例,即反封装后,应该查看它的路由表(一旦启用了ipv4转发),并将流量转发给eth0,因为这是默认路由。
但是,因为我需要拦截这些通信量,所以我想为10.0.0.0/8中的通信量设置一个下一跳,转到172.17.0.2 (码头容器的IP )。码头容器公开了tcp/80、tcp/443和tcp/3128,并映射了3128->3128、80->3129和443->3130。假设它通过,流量从容器中排出,并命中网络的默认网关(172.17.0.1/16),然后按照它的本地路由表到达EC2实例的网关(10.160.221.97)。
它是一个bit...complicated,但其思想是让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
发布于 2020-12-07 14:17:14
我不认为这是一个路由问题。您不需要任何额外的路由声明。只要和iptable一起玩,你就会状态良好。
在充当停靠主机的EC2实例上启用路由
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
将所有HTTP流量(TCP 80)重定向到侦听TCP 3129的停靠容器
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 172.17.0.2:3129
将所有HTTPS流量(TCP 443)重定向到侦听TCP 3130的停靠容器
sudo iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination 172.17.0.2:3130
Enable NAT (又名Masqurade)
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
https://unix.stackexchange.com/questions/622607
复制相似问题