通过 DMZ 为 webapp 和通过 LAN 为互联网进行双 NIC Ubuntu Netplan 配置

通过 DMZ 为 webapp 和通过 LAN 为互联网进行双 NIC Ubuntu Netplan 配置

我有一台双宿主 Ubuntu 22.04 LTS 服务器,其中一个 NIC 位于 DMZ,另一个位于 LAN。我一直在努力解决 netplan 配置问题,由于网关配置和路由最近发生了变化,我的搜索发现了许多关于如何实现所需配置的混合建议。我已阅读 netplan 文档:https://netplan.readthedocs.io/en/latest/netplan-tutorial/

目前我有以下设置:

$ ip route:

default via 192.168.2.2 dev eth0 proto static metric 100 onlink 

172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 

172.18.0.0/16 dev br-e9fa8283d45d proto kernel scope link src 172.18.0.1 

192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.39 

192.168.14.0/24 dev eth1 proto kernel scope link src 192.168.14.2 

当前 netplan .yaml 配置文件:

network:

  version: 2

  renderer: networkd

  ethernets:

    eth0:

      addresses:

        - 192.168.2.39/24

      dhcp4: no

      routes:

        - to: 0.0.0.0/0

          via: 192.168.2.2

          metric: 100

          on-link: true

      nameservers:

        addresses:

          - 192.168.2.29

          - 192.168.2.10

    eth1:

      addresses:

        - 192.168.14.2/24

      dhcp4: no

      routing-policy:

        - from: 192.168.14.0/24

          table: 199

      routes:

        - to: 0.0.0.0/0

          via: 192.168.14.1

          metric: 100

          table: 199
$ ip rule list

0:   from all lookup local

32765:   from 192.168.14.0/24 lookup DMZ proto static

32766:   from all lookup main

32767:   from all lookup default

当前 rt_table:

xxx@xxx:/etc/iproute2$ cat /etc/iproute2/rt_tables

#

# reserved values

#

255   local

254   main

253   default

0   unspec

#

# local

#

#1   inr.ruhep

199   DMZ
xxx@xxx:/etc/iproute2$ ip -d route show table 199

unicast default via 192.168.14.1 dev eth1 proto static scope global metric 100 

当我尝试用以下内容替换表 199 中的路由时:

sudo ip r 替换默认通过 192.168.14.1 dev eth1 proto static scope link metric 100 onlink table 199

我收到以下错误:“错误:Nexthop 的范围无效。”

我想要实现的目标:

1. 允许互联网访问和本地网络通过 LAN 连接出去。

2. 允许从我们的 NAT 公共 IP 到 DMZ 接口的入站流量:192.168.14.2 到达我们的 Web 应用程序并在原始 NIC(DMZ)上返回。

目前,使用此配置我可以访问互联网,但我的 Web 应用程序超时。我已进行数据包跟踪,以确定标志 [S] 的流量正在进入 Ubuntu 服务器,但没有回复返回。

我发现,如果我将默认路由(默认通过 192.168.2.2 dev eth0 proto static metric 100 onlink)替换为默认通过 192.168.14.1 dev eth1 proto static metric 100 onlink,那么我的 Web 应用程序就可以正常工作,而且我可以看到返回流量,但是我的服务器无法访问互联网,因为我需要该流量(更新等)通过 LAN 接口出去。

请提供一些关于我需要什么样的 netplan 配置才能允许双 NIC 工作并在重启时继续运行的指导。

预先感谢您的任何帮助。

[编辑:1] 谢谢 - 我已经通读了 netplan.io 并尝试了不同的配置,但都无济于事。如果可能的话,我希望有人能使用现代版本的 netplan 成功做到这一点,因为我们已经花了 2 周的时间研究这个问题,问题发布在其他两个论坛上,但并没有得到解决,因为人们推荐的是弃用的选项。我删除了“on-link: true”,但这并没有改变任何行为。

[编辑:2] 我的内部访问站点 192.168.2.39:8444 在上述配置下运行良好。但是,我无法从 DMZ 192.168.14.2:443 访问其他面向公众的站点。我可以使用路由表或主表更改默认路由:默认通过 192.168.2.2 dev eth0 proto static metric 100 onlink 到默认通过 192.168.14.1 dev eth1 proto static metric 100 onlink adn 然后我的公共站点运行良好,但我无法访问我的内部应用程序。这似乎是 Windows 上很容易解决的问题,但我对 Linux 中的路由配置并不熟练。

[编辑:3] 我使用 tcpdump 捕获了数据包,可以看到公共流量只有一方与 进行对话Flag [S],但没有通过 DMZ 的返回流量,使用以下命令:sudo tcpdump -i eth1 -n port 443 -S -vv。我可以使用以下命令看到尝试从 eth0 发出的回复sudo tcpdump -i eth0 -n port 443 -S -vv

sudo tcpdump -i eth1 -n port 443 -S -vv
18:46:03.273544 IP (tos 0x0, ttl 47, id 62306, offset 0, flags [none], proto TCP (6), length 60)
    xxx.xx.xxx.xx.60921 > 192.168.14.2.443: Flags [S], cksum 0x0b11 (correct), seq 3026599530, win 65535, options [mss 1460,nop,wscale 9,sackOK,TS val 178557874 ecr 0], length 0
sudo tcpdump -i eth0 -n port 443 -S -vv
18:46:51.177103 IP (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.14.2.443 > xxx.xx.xxx.xx.18874: Flags [S.], cksum 0xbc3f (incorrect -> 0x7356), seq 78744143, ack 2652949040, win 65160, options [mss 1460,sackOK,TS val 1512654855 ecr 178596451,nop,wscale 7], length 0

[编辑:4] 这可能与我们有两个需要在不同的物理网卡上响应的 docker 容器有关吗?DMZ 容器需要允许并响应 eth1 上的端口 80/443。LAN 容器需要响应 eth0 上的端口 8443 并访问互联网进行更新。我想知道 docker 网络是否需要注意。这是当前路由 -e:

$ sudo route -e
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         _gateway        0.0.0.0         UG        0 0          0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U         0 0          0 br-e9fa8283d45d
192.168.2.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
192.168.14.0   0.0.0.0         255.255.255.0   U         0 0          0 eth1

看起来所有 docker 容器都使用 br-e9fa8283d45d,并且它是默认网关 0.0.0.0,而该网关又指向 eth0。这是否会导致 eth1 上的传入请求在回复时被路由到 eth0?

谢谢-

答案1

请参阅下面的示例并尝试实现您也可以查看这篇文章 https://technokona.com/how-to-add-static-routes-in-ubuntu-with-netplan/

network:
    ethernets:
        eth0:
            addresses:
            - 192.168.1.100/24
            gateway4: 192.168.1.1   #Your default gateway to the internet 
            nameservers:
                addresses:
                - 8.8.8.8
        eth1:
            addresses:
            - 10.1.1.130/26
            routes:
            - to: 10.1.2.100  # Your We ABB IP address
              via: 10.1.1.129   #Gateway to be used by Ubuntu to WebAPP
    version: 2

答案2

在这种情况下,您可能需要启用指向 Web 应用程序的静态路由。默认网关应始终指向互联网网关,但对于 LAN 上的特定 Web 应用程序,您需要启用静态路由,指定实际的 Web 应用程序 IP 地址

相关内容