当前位置: 首页 > Linux相关 > 正文

iptables实现单网卡端口转发

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

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

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

      以下面的例子为例 :

iptables DNAT拓扑

现在面临的问题是:

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

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

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

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

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

1. 配置端口转发:

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

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地址为服务器A的ip地址,这样,服务器A就会将应答包发送给A,A又将应答包转发给远端的用户,

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,在单网卡情况下我们也可以实现端口转发了,如果有错误或疑问,还请留言斧正



本文固定链接: http://kuaile.in/archives/1294 | 蒲公英的博客

该日志由 蒲公英 于2013年02月27日发表在 Linux相关 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: iptables实现单网卡端口转发 | 蒲公英的博客
关键字: ,

iptables实现单网卡端口转发:目前有2 条留言

  1. 沙发
    8954i:

    现在局域网有两台跑着同样80端口的机器但是我想用a转发给b具体怎么做?

    2013-05-30 下午 2:34 [回复]
    • 在a上做端口转发就可以了,转发a的80到b的80端口

      2013-06-03 下午 12:42 [回复]

发表评论


You must enable javascript to see captcha here!

快捷键:Ctrl+Enter