Lxc
無法在 Ubuntu 上使用 UFW 進行埠轉發
在 Ubuntu 上使用時,我試圖讓埠轉發工作以公開 LXC 容器,
ufw
但無濟於事。我根據網際網路上的指南建構了以下工作流程($$ 1 $$$$ 2 $$$$ 3 $$); 最值得注意的是關於
/etc/ufw/before.rules
我看到的部分在所有地方都重複但是….我無法讓它為我工作。 如果有人遵循本指南並取得成功……請告訴我(這樣我可能會先哭泣,然後回過頭來編寫我自己的防火牆工具)重現/測試的步驟
設置
- 測試環境
具有 NAT 和 NAT 網路介面的新 VM(我使用 virtualbox)“host1”
- 安裝 Ubuntu 伺服器 16.04 - 只需執行預設安裝
第二個虛擬機實例“host2”,在同一個 NAT 網路上
- 在主機 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 nat
LXC 安裝已經配置了偽裝您可能想要快照此基本狀態。
此時有兩條路由:帶有普通 iptables 的 A 路由,以及有問題的帶有 ufw 的 B 路由
- 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 登陸頁面。成功!問題
- 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 次不同的步驟——不走運,總是一樣的。
誰能指出我做錯了什麼……?
- $$ 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 ...
事實證明,允許一般流量流動還需要一些配置步驟:
在頂部
/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
如問題描述中所述,這對我的測試環境進行了處理。