在 Ubuntu 上设置公共路由和私有路由

在 Ubuntu 上设置公共路由和私有路由

我已经环顾了一段时间,似乎找不到一个好的答案,所以我想我应该先问一下,然后再花几天时间把头撞在桌子上。

我有一个 Ubuntu 盒子,有两个物理接口和一个虚拟接口。

  eno1 - 172.16.0.100
  eno2 - 172.16.0.101
eno1:0 - x.x.x.x

我想得到什么

  1. 对于对传入数据包的响应,我希望数据包在其请求传入的接口上发出。
  2. 对于传出数据包,我希望它们默认发出...

    A。 eno1 - 用于发往专用网络的数据包(多个不连续的 172.16.x.0 范围) eno1:0 - 用于发往所有其他网络的数据包

当前设置

IP规则列表

0:  from all lookup local 
32760:  from all to x.x.x.x lookup eno1:0 
32761:  from x.x.x.x lookup eno1:0 
32762:  from all to 172.16.0.101 lookup eno2 
32763:  from 172.16.0.101 lookup eno2 
32764:  from all to 172.16.0.100 lookup eno1 
32765:  from 172.16.0.100 lookup eno1 
32766:  from all lookup main 
32767:  from all lookup default

ip路由列表表eno1:0

default via x.x.x.1 dev eno1 

ip 路由列表表 eno1

default via 172.16.0.1 dev eno1 
172.16.0.0/24 dev eno1  scope link  src 172.16.0.100 

ip 路由表 eno2

default via 172.16.0.1 dev eno2 
172.16.0.0/24 dev eno2  scope link  src 172.16.0.101

IP路由列表

default via 172.16.0.1 dev eno1 onlink 
x.x.x.0/23 dev eno1  proto kernel  scope link  src x.x.x.x 
172.16.0.0/24 dev eno2  proto kernel  scope link  src 172.16.0.101 
172.16.0.0/24 dev eno1  proto kernel  scope link  src 172.16.0.100

eno1 和 eno2 的 sysctl 值

arp_filter=1
arp_ignore=1
arp_announce=2

问题

  1. 我可以偶尔从子网之外的范围到达 eno1 和 eno2,但我根本无法到达 eno1:0。
  2. 从盒子里我根本无法访问互联网(公共IP)。

答案1

发现了——或者更确切地说是重新发现了——答案......

问题在于 Unix 认为主机是网络实体而不是端口,这会导致多宿主服务器上出现各种 arp 问题。所以基本上我需要将接口上的 arp 响应限制为与该接口关联的 IP 地址,否则 Unix 将在任何接口上响应,而不管 IP - 这确实让子网上的所有其他设备感到困惑。

所以...安装了arptables

sudo apt-get -y install arptables

将每个接口上的响应限制为该接口上的 IP

sudo arptables -n -v --line-numbers -L
Chain INPUT (policy DROP 6011K packets, 168M bytes)
1 -j ACCEPT -i eno1 -o * -d x.x.x.x , pcnt=2496 -- bcnt=69888 
2 -j ACCEPT -i eno1 -o * -d 172.16.0.100 , pcnt=294 -- bcnt=8232 
3 -j ACCEPT -i eno2 -o * -d 172.16.0.101 , pcnt=294 -- bcnt=8232 

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
1 -j ACCEPT -i * -o eno1 -s x.x.x.x , pcnt=2503 -- bcnt=70084 
2 -j ACCEPT -i * -o eno1 -s 172.16.0.100 , pcnt=295 -- bcnt=8260 
3 -j ACCEPT -i * -o eno2 -s 172.16.0.101 , pcnt=294 -- bcnt=8232 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

瞧,所有 IP 都在其正确的端口上做出响应。

男人!我希望我不会再忘记这一点!

相关内容