Firewall

iptables birectional nat / 兩次 nat 用於 smtp

  • September 26, 2010

我們使用具有多個外部 IP 地址的 linux 防火牆。假設我們有這個:

webserver (www.blabla.com)   : (ext)10.0.0.1 -> (int)172.99.0.2 
mailserver (mail.blabla.com) : (ext)10.0.0.2 -> (int)172.99.1.2

這個路由是通過簡單的埠轉發完成的。但如果郵件伺服器發送郵件,它會使用第一個外部 IP 地址 (10.0.0.1)。

它工作得很好,但一些 smtp 伺服器將我們的郵件視為垃圾郵件。因為 10.0.0.1 沒有被 mail.blabla.com 覆蓋(這是修復)。

我讀了一些關於雙向 nat 的東西來完成這個:

偽邏輯:

if destination port == smpt and source is internal 172.99.1.2 {
  set external address 10.0.0.2
}

你知道怎麼做嗎?

這是一種方法嗎:

iptables -t nat -A POSTROUTING -s $INTERNAL_NET -d ! $INTERNAL_NET -dport SMTP -j SNAT --to $EXTERNAL_IP

是的,這基本上就是您需要的防火牆規則。當心,它是 --dport,即你需要一個雙破折號。

另一種方法是要求您的 ISP 為第二個 IP 地址放置另一個反向 DNS 記錄(也稱為 PTR),然後使用具有更高值的相同 IP 地址創建一個 MX 記錄,以便始終從外部傳遞首先在真實伺服器上嘗試。

我會使用 iptables 和 iproute:

1.使用 iptables 標記來自郵件伺服器並發送到任何埠的數據包,埠 25

iptables -A PREROUTING -i <mailsrv_iface> -t mangle -p tcp --dport 25 -j MARK --set-mark 25

2.通過正確的介面正確路由標記的數據包

echo 25 mailgw >> /etc/iproute2/rt_tables
ip ru add fwmark 25 table mailgw
ip ro add default via <correct_mailgw_ip> dev <correct_mailgw_iface> table mailgw

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