网页浏览总次数

2010年11月20日星期六

实现跨机房NAT转发

场景描述:有两台服务器 HostA 和 HostB,位于不同的机房。需要把 HostA 的邮件连接请求(tcp/25)通过 HostB转发到公网其他机器,在其他机器看来,该邮件连接请求仿佛是从HostB发出来的。

这种需求是有的,比如HostA被列为邮件服务器黑名单,把HostA的邮件服务迁移到HostB又比较麻烦,最省心的应急处理方式是把HostB作为邮件发送跳板。

基本思路是在HostA和HostB之间建立一个ip通道(ssl通道、pptp或者ipsec),然后把对外连接tcp/25的请求转发到HostB,再由HostB做来源地址改写(SNAT)。

1. 建立 HostA与HostB之间的ip通道

为简单起见,我们用ipip方式建立通道。在HostA做如下配置

modprobe ipip
ip tu add ipiptun mode ipip local remote ttl 64 dev eth0
ip ad ad dev ipiptun 172.33.1.1 peer 172.33.1.2/32
ip li se dev ipiptun up

在HostB做如下配置

modprobe ipip
ip tu add ipiptun mode ipip local remote ttl 64 dev eth0
ip ad ad dev ipiptun 172.33.1.2 peer 172.33.1.1/32
ip li se dev ipiptun up

2. 设置HostA的Netfilter Marking & Routing

echo 201 mail.out >> /etc/iproute2/rt_tables
iptables -A OUTPUT -t mangle -p tcp --dport 25 -j MARK --set-mark 1
ip rule add fwmark 1 table mail.out
ip rule ls
ip route add default via 172.33.1.2 dev ipiptun table mail.out

3. 设置HostB的SNAT

iptables -A INPUT -i ipiptun -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.33.1.1/32 -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s /32 -o eth1 -j MASQUERADE

没有评论:

发表评论