使用iptables实现外网转发内网

server1: 外网ip w.w.w.w 内网ip n.n.n.n

server2: n2.n2.n2.n2:27017  (mogodb端口)

目标:外部访问server1 w.w.w.w:27017 转发到 n2.n2.n2.n2:27017 

1、开启linux转发功能:

   echo 1 > /proc/sys/net/ipv4/ip_forward

   vi /etc/sysctl.conf,把net.ipv4.ip_forward设置成1,如:net.ipv4.ip_forward = 1

   优点:重启服务器或网络服务后自动开启ip转发功能

   修改立即生效

   sysctrl -p

2、实现转发:

   PREROUTING 和 POSTROUTING 区别:

            落实到网卡上,对于每个网卡数据流入的时候必然经过pre,数量流出必然经过post。

  #当数据包进入路由时,将目标ip为w.w.w.w的数据包的目的ip修改为n2.n2.n2.n2

  iptables -t nat -A PREROUTING -d w.w.w.w -p tcp --dport 27017 -j DNAT --to n2.n2.n2.n2

  #当数据包发出时,将其目的ip为n2.n2.n2.n2的 源ip地址 修改为 n.n.n.n

  iptables -t nat -A POSTROUTING -d n2.n2.n2.n2 -p tcp --dport 27017 -j SNAT --to n.n.n.n

  # 允许路由转发 目的ip为n2.n2.n2.n2 目的端口为 27017 的所有包

  iptables -A FORWARD -p tcp -d n2.n2.n2.n2 --dport 27017 -j ACCEPT

[http://blog.csdn.net/hiccupzhu/article/details/51073557]

知识扩充

1. 首先要明白什么是"PREROUTING" ,什么是"POSTROUTING",我们可以简单的用下面的关系来表示:
源地址发送数据--> {PREROUTING-->路由规则-->POSTROUTING} -->目的地址接收到数据

当你使用:iptables -t nat -A PREROUTING -i eth1 -d 1.2.3.4 -j DNAT --to 192.168.1.40
时,你访问1.2.3.4,linux路由器会在“路由规则”之前将目的地址改为192.168.1.40,并且Linux路由器(iptables)会同时记录下这个连接,并在数据从192.168.1.40返回时,经过linux路由器将数据发送到那台发出请求的机器。所以你的"POSTROUTING"规则没有起作用。

而"POSTROUTING"是“路由规则”之后的动作。

2. PREROUTING的应用
一般情况下,PREROUTING应用在普通的NAT中(也就是SNAT),如:你用ADSL上网,这样你的网络中只有一个公网IP地址(如:6.129.6.5),但你的局域网中的用户还要上网(局域网IP地址为:192.168.1.0/24),这时你可以使用PREROUTING(SNAT)来将局域网中用户的IP地址转换成6.129.6.5,使他们也可以上网:
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -j SNAT 6.129.6.5


3. POSTROUTING的应用
POSTROUTING用于将你的服务器放在防火墙之后,作为保护服务器使用,例如:
A.你的服务器IP地址为:192.168.1.2;
B.你的防火墙(Linux & iptables)地址为192.168.1.1和20.96.12.5

Internet上的用户可以正常的访问20.96.12.5,但他们无法访问192.168.1.2,这时在Linux防火墙里可以做这样的设置:
iptables -t nat -A POSTROUTING -d 20.96.12.5 -j DNAT 192.168.1.2

结:最要紧的是我们要记住PREROUTING是“路由规则”之前的动作,POSTROUTING是“路由规则”之后的动作!

4. SNAT,DNAT,MASQUERADE的区别

SNAT,DNAT,MASQUERADE都是NAT
MASQUERADE是SNAT的一个特例
SNAT是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个IP的主机
MASQUERADE是用发送数据的网卡上的IP来替换源IP,因此,对于那些IP不固定的场合,比如拨号网络或者通过dhcp分配IP的情况下,就得用MASQUERADE
DNAT,就是指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B

因为,路由是按照目的地址来选择的,因此,DNAT是在PREROUTING链上来进行的,而SNAT是在数据包发送出去的时候才进行,因此是在POSTROUTING链上进行的

[http://blog.csdn.net/hiccupzhu/article/details/51073557]

你可能感兴趣的:(网络编程)