Iptables

通過反向代理從本地網路訪問容器時連接被拒絕

  • November 21, 2018

我在根伺服器上執行 Proxmox VE。有幾個虛擬容器,其中一個充當執行 TLS 終止的反向代理。

在 proxmox 機器上,iptables 處理埠轉發和內部網路的保護。配置如下所示:

*nat
# enable network access for vms
-A POSTROUTING -s 192.168.1.0/24 -o enp4s0 -j MASQUERADE
# reverseproxy
-A POSTROUTING -s 192.168.1.2/24 -o vmbr0 -j MASQUERADE
-A PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to 192.168.1.2:80
-A PREROUTING -i vmbr0 -p tcp --dport 443 -j DNAT --to 192.168.1.2:443
COMMIT

*filter
# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# Accepts established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allows all outbound traffic
-A OUTPUT -j ACCEPT
# Allows SSH connection
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# Allow ping
-A INPUT -p icmp -j ACCEPT
# log iptables denied calls (access via 'dmesg' command)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# Reject all other inbound - default deny unless explicitly allowed policy:
-A INPUT -j REJECT
COMMIT

當我嘗試(使用 wget)從一個容器連接到另一個容器的公共 url 時,我收到一條錯誤消息,其中包含:“xxx.xxx.xxx.xxx|:443…失敗:連接被拒絕。”

當我從外部訪問相同的 url 時,我可以毫無問題地訪問容器。有什麼我不小心阻止或忘記啟用的嗎?

答案很明顯:

我為來自介面 vmbr0(靜態伺服器 ip 和內部網路之間的網橋)的反向代理啟用了埠轉發,但沒有為 vmbr1(連接容器的網橋)啟用埠轉發。由於域名解析為外部 IP,但數據包來自內部網橋 vmbr1 而不是來自外部 vmbr0,因此沒有進行埠轉發。

解決方案是在 *nat 表中添加這個:

-A POSTROUTING -s 192.168.1.2/24 -o vmbr1 -j MASQUERADE
-A PREROUTING -i vmbr1 -d SERVERIP -p tcp --dport 80 -j DNAT --to 192.168.1.2:80
-A PREROUTING -i vmbr1 -d SERVERIP -p tcp --dport 443 -j DNAT --to 192.168.1.2:443

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