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

我试图让端口fowarding工作揭露一个LXC容器,当在ubuntu上使用ufw ,但无济于事。 我已经从互联网上的指南([1] [2] [3])中构build了以下工作stream程)。 最显着的是关于/etc/ufw/before.rules的部分,我看到所有的地方重复,但….我不能让它为我工作。

如果任何人按照这个指南,发现成功….请让我知道(所以我可能会先哭,然后回落,写我自己的防火墙工具)

重现/testing的步骤

build立

  1. testing环境

    • 新的VM(我使用virtualbox)“host1”同时具有NAT和NATnetworking接口
      • 安装Ubuntu服务器16.04 – 只做一个默认的安装
    • 第二个VM实例“host2”,在同一个NATnetworking上
  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上的NATnetworking接口是enp0s8
  • host1上的容器IP为10.0.3.101
  • host1的enp0s8的IP为10.0.2.6
  • sudo iptables -L -t nat查看,伪装已经被LXC安assembly置了

你可能想要快照这个基本状态。

在这一点上有两条路线:一个是使用普通iptables的路由,另一个是使用ufw的B路由

  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之上
      • 调整相关configuration的过程
    • ufw allow 8080
    • ufw enable
    • 此时,我无法通过wget,firefox等从host2到达host1 – 无法build立连接
    • 如果我在host1上执行nc -l 8080 ,并尝试再次从host2进行连接,则会得到HTTP标头转储 – 表示没有发生端口转发。 失败!

现在我用了新的虚拟机,digitalOcean水滴和AWS EC2实例,在短短5个不同的时间里完成了我的步骤 – 没有运气,总是一样的。

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

  • [1] https://askubuntu.com/questions/370599/forward-port-to-lxc-guest-using-ufw#435286
  • [2] https://gist.github.com/ShawnHuang/2726ef5e01a76e2eef55
  • [3] https://help.ubuntu.com/lts/serverguide/firewall.html#ip-masquerading
  • [4] Nat线:

     *nat :PREROUTING ACCEPT [0:0] -A PREROUTING -i enp0s8 -p tcp --dport 8080 -j DNAT --to 10.0.3.101:80 COMMIT # comments etc and the rest of the file, like, *filter ... 

原来还有几个configuration步骤需要允许一般stream量stream动:

位于/ *filter section之前的/etc/ufw/before.rules的顶部

 *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的顶部,在filter部分之前:

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

这是为我的testing环境做的,如问题描述中所述。