转自

***linux/iptablesshixiandanwangkaduankouzhuanfa_79492_1362921069.html

iptables是集成与Linux内核 IP 信息包过滤系统,iptables除了是一个强大的防火墙以外,它还以实现NAT,借助于iptables的帮助,一台普通的linux主机都可以作为简单的路由器

一般而言,iptables中的NAT分为SNATDNATSNAT是源地址转换,DNAT是目的地址转换,SNAT较多的用于共享上网,DNAT较多用于端口转发

网上很多的关于SNATDNAT的使用和例子,但是,这些例子都有一个共同的条件:主机拥有两张或多张网卡,那么,如果主机只有一张网卡勒?

以下面的例子为例 :

wps5D8E.tmp

 

现在面临的问题是:

1. 服务器A能够被公网访问,但是服务器B不能被公网访问,服务器B不能被公网访问,但是可以被服务器A访问

2. 服务器A只有一张网卡,服务器B也同样只有一张网卡

3.服务器A并不是服务器B的网关

这里我们假设服务器A的系统是Linux,并且安装了iptables,那么如果才能借助于iptables实现外网访问服务器B的资源(比如服务器B是一个http服务器)勒?(这种情况常见于高校校内资源访问和部分的企业内部资源访问)

首先我们要知道,服务器A只有一张网卡,那么传统的端口转发还不够,需要额外的配置 

1. 配置端口转发:

我们使用服务器A的端口8080来转发到服务器B80 端口:

sudo iptables -t nat -p tcp -A PREROUTING --dport 8080 -i eth0 -j \DNAT --to 211.211.211.2:80 #这里的地址和端口根据实际情况而定

 

2.配置源地址转换 :

当服务器B将应答数据发送给B时,由于是服务器B在应答,因此在数据路由后送出端口之前,我们需要修改原始的地址,因为服务器B的地址是不可被公网访问的,而服务器A可以被公网访问 :

sudo iptables -A POSTROUTING -t nat -p tcp --sport 80 -s 211.211.211.2 -j \SNAT --to 211.211.211.1

但是,这里存在一点问题,为什么服务器B要把应答包往A发送勒?服务器A发送的包中的原始地址又不是服务器A的地址,因此,我们需要在转发包路由后修改包的源IP地址为服务器Aip地址,这样,服务器A就会将应答包发送给AA又将应答包转发给远端的用户,

3.修改转发包的源IP地址

实现的命令如下:

sudo iptables -t nat -A POSTROUTING -p tcp --dport 80 -d 211.211.211.2 -j \SNAT --to 211.211.211.1

需要注意的一点是:只要代理转发服务器不是目的服务器的网关,或者目的服务器没有将代理转发服务器设置为网关,那么都需要第三步才能实现端口转发

那么,借助于iptables,在单网卡情况下我们也可以实现端口转发了

我们也可以实现端口转发了。