我试图在ufw
Ubuntu 上使用时使端口转发工作以公开 LXC 容器,但无济于事。我根据互联网上的指南构建了以下工作流程([1][2][3]);最值得注意的是/etc/ufw/before.rules
我看到到处重复的部分,但是......我无法让它为我工作。
如果有人按照本指南操作并取得成功...请告诉我(所以我可能会先哭泣,然后退后并编写自己的防火墙工具)
重现/测试步骤
设置
测试环境
- 新的虚拟机(我使用了 virtualbox)“host1”,具有 NAT 和 NAT 网络接口
- 安装 Ubuntu 服务器 16.04 - 只需执行默认安装
- 第二个 VM 实例“host2”,位于同一 NAT 网络上
- 新的虚拟机(我使用了 virtualbox)“host1”,具有 NAT 和 NAT 网络接口
在 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
- 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 登陆页面。成功!
问题
- 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
- 当然要调整相关配置
- 在引导注释下插入 nat 行(见下文 [4]),但多于线
ufw allow 8080
ufw enable
- 此时,我无法使用 wget、firefox 等从 host2 访问 host1 - 无法建立连接
- 如果我
nc -l 8080
在 host1 上执行此操作并尝试从 host2 再次连接,我会得到 HTTP 标头转储 - 表明没有发生端口转发。失败!
- 编辑
我已经使用全新的 VM、digitalOcean droplet 和 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 :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 ...
答案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
正如问题描述中概述的那样,这对我的测试环境来说已经完成了。