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

tai*_*fwa 5 port-forwarding ufw lxc

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

如果有人遵循本指南并取得成功....请告诉我(这样我可能会先哭,然后回过头来编写我自己的防火墙工具)

重现/测试的步骤

设置

  1. 测试环境

    • 带有 NAT 和 NAT 网络接口的新 VM(我使用了 virtualbox)“host1”
      • 安装 Ubuntu 服务器 16.04 - 只需进行默认安装
    • 同一 NAT 网络上的第二个 VM 实例“host2”
  2. 在主机 1 上安装 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 natLXC 安装已经配置了伪装

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

此时有两条路由:A-route with plain iptables,B-route,有问题的,用 ufw

  1. A - 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 标头转储 - 表明没有发生端口转发。失败!

我已经用新的虚拟机、digitalOcean 液滴和 AWS EC2 实例完成了大约 5 次不同的步骤 - 没有运气,总是一样的。

任何人都可以指出我做错了什么......?

tai*_*fwa 3

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

在 的顶部/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
Run Code Online (Sandbox Code Playgroud)

靠近底部,决赛之前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
Run Code Online (Sandbox Code Playgroud)

在 的顶部/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
Run Code Online (Sandbox Code Playgroud)

正如问题描述中所述,这对我的测试环境来说是这样。