Iptables

在 VPN 客戶端上執行電子郵件伺服器,希望流量通過來自 vpn 伺服器的 smtp、pop3、imap 等。

  • June 6, 2015

我有一個家庭寬頻網路,我還執行一個電子郵件伺服器。由於我的提供商不會給我一個固定的 IP 地址,而且大多數伺服器拒絕接受來自動態 IP 範圍的 smtp 郵件,我覺得我們將在我已經擁有的虛擬伺服器和我的郵箱之間執行 VPN 的簡單解決方案.

我做得很好,我安裝了 openvpn 並且連接很好。我的家庭網路在 192.168.1.x 上執行,vpn 在 10.8.0.x 上執行,客戶端(我的郵件伺服器)在隧道末端的地址為 10.8.0.6。vps 在 Internet 端有一個真實世界的 IP 地址。

我啟用了 ip 轉發,我可以愉快地從客戶端、電子郵件、網路瀏覽等發送流量,但是我不知道如何通過 smtp、imap、pop3 等埠將來自 Internet 的流量轉發到我的郵件伺服器.

我希望我已經提供了足夠的資訊。

提前致謝。

對於所有埠:

iptables -t nat -A PREROUTING -p tcp --dport 25 -d $real_world_ip -j DNAT --to-destination 10.8.0.6
iptables -t nat -A POSTROUTING -p tcp --dport 25 -d 10.8.0.6 -j SNAT --to-source 10.8.0.x
iptables -A FORWARD -p tcp --dport 25 -d 10.8.0.6 -j ACCEPT

編輯1(評論回答)

可以讓郵件伺服器看到原始地址(這很簡單,您只需忽略 SNAT 規則)。挑戰是將回複數據包返回到虛擬伺服器。為此,您需要高級路由。我猜你還需要 Netfilter 連接標記。您標記來自虛擬伺服器的所有新連接,將連接標記複製到數據包標記並使用數據包標記進行路由決策。您需要在 /etc/iproute2/rt_tables 中定義一個額外的路由表。您可以將其命名為 to_vserver。

每個埠的 iptables 阻塞,其他埠只阻塞一次。

# mark new connections from VPN interface
iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 25 -j CONNMARK --set-mark 42
# set packet mark of outgoing locally created packets which have this connection mark
iptables -t mangle -A OUTPUT -m connmark --mark 42 -j CONNMARK --restore-mark

# in this routing table: send everything over the VPN
ip route add table to_vserver 10.8.0.x dev tun0 src  10.8.0.6
ip route add table to_vserver default via 10.8.0.x

# use routing table to_vserver (instead of main) for every packet with this packet mark
ip rule add fwmark 42 priority 100 table to_vserver

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