无法在 Ubuntu 上使用 UFW 进行端口转发

无法在 Ubuntu 上使用 UFW 进行端口转发

我试图在ufwUbuntu 上使用时使端口转发工作以公开 LXC 容器,但无济于事。我根据互联网上的指南构建了以下工作流程([1][2][3]);最值得注意的是/etc/ufw/before.rules我看到到处重复的部分,但是......我无法让它为我工作。

如果有人按照本指南操作并取得成功...请告诉我(所以我可能会先哭泣,然后退后并编写自己的防火墙工具)

重现/测试步骤

设置

  1. 测试环境

    • 新的虚拟机(我使用了 virtualbox)“host1”,具有 NAT 和 NAT 网络接口
      • 安装 Ubuntu 服务器 16.04 - 只需执行默认安装
    • 第二个 VM 实例“host2”,位于同一 NAT 网络上
  2. 在 host1 上安装 LXC - 我使用普通的 LXC 进行安装,尚未引入 LXD 设置

    • sudo lxc-create -n web -t download -- -d centos -r 7 -a amd64
    • sudo lxc-start -n web
    • sudo lxc-attach -n web
      • yum install httpd ; yum enable httpd ; yum start httpd
      • exit

我们现在假设

  • host1 上的 NAT 网络接口enp0s8
  • host1 上的容器 IP 是10.0.3.101
  • host1 的 enp0s8 的 IP 是10.0.2.6
  • 看到sudo iptables -L -t nat伪装已经由 LXC 安装配置好了

您可能想要对该基本状态进行快照。

此时有两条路由:A 路由使用普通的 iptables,B 路由(有问题的路由)使用 ufw

  1. iptables
    • sudo iptables -t nat -A PREROUTING -i enp0s8 -p tcp --dport 8080 -j DNAT --to "10.0.3.101:80"
    • 在第二个主机上我可以wget http://10.0.2.6:8080这样做,这会给我标准的 CentOS 登陆页面。成功!

问题

  1. B - 可以在重新启动 host1 后执行此操作,或者,如果您之前已创建快照,则只需恢复即可。无论哪种方式,其行为都相同
    • 编辑/etc/default/ufw
      • MANAGE_BUILTINS=yes
      • DEFAULT_FORWARD_POLICY="ACCEPT"
    • 编辑/etc/ufw/sysctl.conf
      • 取消注释net/ipv4/ip_forward=1
    • 编辑/etc/ufw/before.rules
      • 在引导注释下插入 nat 行(见下文 [4]),但多于线*filter
      • 当然要调整相关配置
    • ufw allow 8080
    • ufw enable
    • 此时,我无法使用 wget、firefox 等从 host2 访问 host1 - 无法建立连接
    • 如果我nc -l 8080在 host1 上执行此操作并尝试从 host2 再次连接,我会得到 HTTP 标头转储 - 表明没有发生端口转发。失败!

我已经使用全新的 VM、digitalOcean droplet 和 AWS EC2 实例重复了近 5 次步骤 - 没有运气,总是一样。

有人能指出我做错什么吗……?

答案1

事实证明,还需要一些配置步骤才能允许一般流量流动:

位于 顶部/etc/ufw/before.rules,在*filter部分之前

*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -i enp0s8 -p tcp --dport 8080 -j DNAT --to 10.0.3.101:80
COMMIT

在靠近底部的地方,最后COMMIT

-A FORWARD -o lxcbr0 -j ACCEPT
-A FORWARD -i lxcbr0 -j ACCEPT

-A INPUT -p udp --dport 53 -i enp0s8 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 53 -i enp0s8 -m state --state NEW -j ACCEPT
-A INPUT -p udp --dport 67 -i enp0s8 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 67 -i enp0s8 -m state --state NEW -j ACCEPT

在 的顶部/etc/ufw/after.rules,过滤器部分之前:

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE
COMMIT

正如问题描述中概述的那样,这对我的测试环境来说已经完成了。

相关内容