Iptables

libvirt vm 無法連接到 smtp

  • June 10, 2013

我的一台虛擬機有問題。在我的設置中,kvm/libvirt 管理程序充當防火牆並執行所有 NAT。所有虛擬機都有 1 個虛擬網路 (virbr2)。

作業系統:Ubuntu Server 12.04LTS

有一個傳出介面:eth0

我的問題是我的一個虛擬機無法連接到外部 smtp 伺服器。我試過 gmail、yahoo 和我大學的那個。奇怪的是,雖然它無法訪問任何 smtp 伺服器,但它可以訪問任何埠上的其他主機(區域網路外)。

虛擬機執行 apache、zarafa 和 postfix,可以正常接收郵件。只有發送超時。

May 24 15:50:48 mail postfix/smtp[7848]: connect to mailserver.example.com[1.2.3.4]:25: Connection timed out
May 24 15:50:48 mail postfix/smtp[7848]: 2196B320A81: to=<office@example.com>, relay=none, delay=51881, delays=51790/0.06/91/0, dsn=4.4.1, status=deferred (connect to mailserver.example.com[1.2.3.4]:25: Connection timed out)

我覺得我在這裡遺漏了一些明顯的東西。

這些是我的 iptables 規則。有問題的 IP 是 10.2.3.253

iptables -S; iptables -t nat -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --sport 1024:65535 --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --sport 1024:65535 --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --sport 1024:65535 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i virbr2 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr2 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr2 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr2 -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 16509 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 16509 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5902 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5901 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5903 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5900 -j ACCEPT
-A FORWARD -i virbr2 -o eth0 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 10.2.3.0/24 -o virbr2 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 10.2.3.0/24 -i eth0 -o virbr2 -m state --state RELATED,ESTABLISHED -j    ACCEPT
-A FORWARD -d 10.2.3.0/24 -o virbr2 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.2.3.0/24 -i virbr2 -o eth0 -m state --state NEW,RELATED,ESTABLISHED   -j ACCEPT
-A FORWARD -i virbr2 -o virbr2 -j ACCEPT
-A FORWARD -o virbr2 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr2 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A PREROUTING -p tcp -m tcp --dport 25 -j DNAT --to-destination 10.2.3.253:25
-A PREROUTING -p tcp -m tcp --dport 143 -j DNAT --to-destination 10.2.3.253:143
-A PREROUTING -p tcp -m tcp --dport 465 -j DNAT --to-destination 10.2.3.253:465
-A PREROUTING -p tcp -m tcp --dport 587 -j DNAT --to-destination 10.2.3.253:587
-A PREROUTING -p tcp -m tcp --dport 993 -j DNAT --to-destination 10.2.3.253:993
-A POSTROUTING -s 10.2.3.0/24 ! -d 10.2.3.0/24 -o eth0 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 10.2.3.0/24 ! -d 10.2.3.0/24 -o eth0 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 10.2.3.0/24 ! -d 10.2.3.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -s 10.2.3.0/24 ! -d 10.2.3.0/24 -o eth0 -p tcp -j MASQUERADE
-A POSTROUTING -s 10.2.3.0/24 ! -d 10.2.3.0/24 -o eth0 -p udp -j MASQUERADE
-A POSTROUTING -s 10.2.3.0/24 ! -d 10.2.3.0/24 -o eth0 -j MASQUERADE

我發現了問題所在!

這些規則

-A POSTROUTING -s 10.2.3.0/24 ! -d 10.2.3.0/24 -o eth0 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 10.2.3.0/24 ! -d 10.2.3.0/24 -o eth0 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 10.2.3.0/24 ! -d 10.2.3.0/24 -o eth0 -j MASQUERADE

攔截這些:

-A POSTROUTING -s 10.2.3.0/24 ! -d 10.2.3.0/24 -o eth0 -p tcp -j MASQUERADE
-A POSTROUTING -s 10.2.3.0/24 ! -d 10.2.3.0/24 -o eth0 -p udp -j MASQUERADE
-A POSTROUTING -s 10.2.3.0/24 ! -d 10.2.3.0/24 -o eth0 -j MASQUERADE

所以我不得不去掉最後三個規則。

我不知道我何時或為什麼將它們放在那裡,但這解決了問題!

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