Iptables
libvirt vm 無法連接到 smtp
我的一台虛擬機有問題。在我的設置中,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
所以我不得不去掉最後三個規則。
我不知道我何時或為什麼將它們放在那裡,但這解決了問題!