Lxc

無法在 Ubuntu 上使用 UFW 進行埠轉發

  • April 4, 2017

在 Ubuntu 上使用時,我試圖讓埠轉發工作以公開 LXC 容器,ufw但無濟於事。我根據網際網路上的指南建構了以下工作流程(

$$ 1 $$$$ 2 $$$$ 3 $$); 最值得注意的是關於/etc/ufw/before.rules我看到的部分在所有地方都重複但是….我無法讓它為我工作。 如果有人遵循本指南並取得成功……請告訴我(這樣我可能會先哭泣,然後回過頭來編寫我自己的防火牆工具)

重現/測試的步驟

設置

  1. 測試環境
  • 具有 NAT 和 NAT 網路介面的新 VM(我使用 virtualbox)“host1”

    • 安裝 Ubuntu 伺服器 16.04 - 只需執行預設安裝
  • 第二個虛擬機實例“host2”,在同一個 NAT 網路上

  1. 在主機 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 安裝已經配置了偽裝

您可能想要快照此基本狀態。

此時有兩條路由:帶有普通 iptables 的 A 路由,以及有問題的帶有 ufw 的 B 路由

  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 次不同的步驟——不走運,總是一樣的。

誰能指出我做錯了什麼……?

*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

如問題描述中所述,這對我的測試環境進行了處理。

引用自:https://serverfault.com/questions/841951