我在根服务器上运行 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 时,我可以毫无问题地访问容器。是不是我意外阻止了什么或忘记启用了什么?
答案1
答案很明显:
我为来自接口 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