转自html
***linux/iptablesshixiandanwangkaduankouzhuanfa_79492_1362921069.htmllinux
iptables是集成与Linux内核 IP 信息包过滤系统,iptables除了是一个强大的防火墙之外,它还以实现NAT,借助于iptables的帮助,一台普通的linux主机均可以做为简单的路由器服务器
通常而言,iptables中的NAT分为SNAT和DNAT,SNAT是源地址转换,DNAT是目的地址转换,SNAT较多的用于共享上网,DNAT较多用于端口转发less
网上不少的关于SNAT和DNAT的使用和例子,可是,这些例子都有一个共同的条件:主机拥有两张或多张网卡,那么,若是主机只有一张网卡勒?ssh
如下面的例子为例 :tcp
1. 服务器A可以被公网访问,可是服务器B不能被公网访问,服务器B不能被公网访问,可是能够被服务器A访问ide
2. 服务器A只有一张网卡,服务器B也一样只有一张网卡spa
3.服务器A并非服务器B的网关代理
这里咱们假设服务器A的系统是Linux,而且安装了iptables,那么若是才能借助于iptables实现外网访问服务器B的资源(好比服务器B是一个http服务器)勒?(这种状况常见于高校校内资源访问和部分的企业内部资源访问)htm
首先咱们要知道,服务器A只有一张网卡,那么传统的端口转发还不够,须要额外的配置 :
咱们使用服务器A的端口8080来转发到服务器B的80 端口:
sudo iptables -t nat -p tcp -A PREROUTING --dport 8080 -i eth0 -j \DNAT --to 211.211.211.2:80 #这里的地址和端口根据实际状况而定
当服务器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地址为服务器A的ip地址,这样,服务器A就会将应答包发送给A,A又将应答包转发给远端的用户,
实现的命令以下:
sudo iptables -t nat -A POSTROUTING -p tcp --dport 80 -d 211.211.211.2 -j \SNAT --to 211.211.211.1
须要注意的一点是:只要代理转发服务器不是目的服务器的网关,或者目的服务器没有将代理转发服务器设置为网关,那么都须要第三步才能实现端口转发
那么,借助于iptables,在单网卡状况下咱们也能够实现端口转发了。
咱们也能够实现端口转发了。