两个具有多个 IP 的桥接接口,需要 NAT,iptables

两个具有多个 IP 的桥接接口,需要 NAT,iptables

我尝试在基于 Debian 的盒子上设置一个奇怪的配置。

这是一种具有两个网络接口 eth0 和 eth1 的工业 PC。我将其用作客户网络的“扫描设备”。有些使用 DHCP,有些则不使用。有些可以给我一个固定 IP,有些则不能,甚至不知道我的设备将收到的 DHCP 地址。

因此我在 /etc/network/interfaces 中创建了以下设置:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual
auto eth1
iface eth1 inet manual

# Bridge interface
auto br0
iface br0 inet dhcp
      bridge_ports eth0 eth1
      bridge_hw aa:bb:cc:dd:ee:ff

# pre-set interface IP for client requirements, if DHCP is not working
auto br0:1
iface br0:1 inet static
    address 172.16.21.150
    netmask 255.255.255.0
    network 172.16.21.0
    broadcast 172.16.21.255
    # Gateway
    post-up route add default gw 172.16.21.254
    pre-down route del default gw 172.16.21.254


# Set default fallback interface IP address
auto br0:100
iface br0:100 inet static
    address 169.254.111.111
    netmask 255.255.255.0
    network 169.254.111.0
    broadcast 169.254.111.255

如您所见,有三个接口。br0 用于 DHCP,br0:1 用于客户提供的静态 IP。通常 br0 和 br0:1 不会同时使用。br0:100 也是静态的,但具有链接本地地址。我使用它来访问没有连接计算机显示器的盒子,只需通过 IP 和 ssh 即可。除了当我通过直接连接将笔记本电脑连接到 br0:100 时(请记住,它是一种虚拟接口,而不是专用的物理接口!),一切都运行良好。

当通过 ssh 在盒子上工作时,我能够访问客户的网络并连接到互联网(除了客户端可能的 fw 规则......)

但是我无法从我的笔记本电脑访问互联网,只能从客户的网络访问。所以我的想法是,本地客户的配置确实只允许从他们的网络范围访问互联网。但我的笔记本电脑有其他范围。一个好主意是设置 NAT,我尝试了这些简单的 NAT 规则:

# IP Forwarding im Kernel aktivieren
echo 1 > /proc/sys/net/ipv4/ip_forward

# Masqerading auf br0 und br0.1 aktivieren
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o br0:1 -j MASQUERADE

# Forwarding Regeln einrichten
# Forwarding etablierter Verbindungen von extern (br0 & br0.1) nach intern (br0.100)
iptables -A FORWARD -i br0 -o br0:100 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i br0:1 -o br0:100 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Forwarding aller Verbindungen von intern (br0.100) nach extern (br0 & br0.1)
iptables -A FORWARD -i br0:100 -o br0 -j ACCEPT
iptables -A FORWARD -i br0:100 -o br0:1 -j ACCEPT

这破坏了我的整个设置。盒子本身无法再连接到网络。

我不知道哪里出了问题,也不知道该如何解决。任何想法都值得赞赏。

问候奥拉夫

答案1

  1. 您使用的是别名,而不是虚拟接口。别名只是接口上的 IP 地址。因此您不能在iptables 规则的--input-interface( -i) 和output-interface( -o) 选项中使用它。

  2. 使用命令检查整个防火墙规则集iptables-save -c。您可能会看到指定别名(接口名称中带有冒号)的规则的计数器为零。

  3. 如果我理解正确的话,你需要按照以下步骤来实现你的目标:

    • 在您的笔记本电脑上分配一个范围内的 IP 地址169.254.111.0/24(例如169.254.111.112/24)和默认网关169.254.111.111
    • 在 Linux 机器上你需要 iptables 规则:
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE

iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD --src 169.254.111.112 -j ACCEPT
  1. 最好也禁止在 Linux 机器上发送重定向:
sysctl -w net.ipv4.conf.all.send_redirects=0
  1. 要解决问题,请运行tcpdump

相关内容