LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1218|回复: 8

急:SNAT 无效但是 MASQUERADE 有效?

[复制链接]
发表于 2006-4-5 20:23:46 | 显示全部楼层 |阅读模式
我有一台不算很老的 PC,现在打算用它来做 NAT 网关。这个机器上装了两块网卡,分别连接至内网和外网,配置如下:

内网网卡 eth0:192.168.0.1,对应内网地址段 192.168.0.0/24,内网其他机器以这台 PC 的内网网卡 IP 地址(192.168.0.1)做网关;
外网网卡 eth1:10.13.9.252,对应外网地址段 10.13.9.0/24,外网网关 10.13.9.254。

我装的是 FC4,默认的内核版本是 2.6.11-1.1369_FC4,iptables 自带的版本是 1.3.0。路由规则如下:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.13.9.0       *               255.255.255.0   U     0      0        0 eth1
192.168.0.0     *               255.255.255.0   U     0      0        0 eth0
169.254.0.0     *               255.255.0.0     U     0      0        0 eth1
default         10.13.9.254     0.0.0.0         UG    0      0        0 eth1

我用 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j MASQUERADE 后,内网的机器无法访问到外网,ping 10.13.9.254 不通。用 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to 10.13.9.250 后,想把内网的机器用 10.13.9.250 这个地址转换进入外网,内网机器还是无法访问外网,ping 10.13.9.254 不通。

后来我用 yum 升级内核至 2.6.15-1.1833_FC4,用 MASQUERADE 就可以,但是用 SNAT 则还是不行,因为内网要针对不同地址范围做更细的划分,使用多个不同的外网地址做地址转换,比如 192.168.0.1-192.168.0.10 的转换为 10.13.9.250,192.168.0.11-192.168.0.20 转换为 10.13.9.251 等,我想还是要靠 SNAT才行,但是现在只有 MASQUERADE 能起作用,但是 SNAT 始终无法起作用,不知道是不是内核不支持?还是要靠自己编译内核才行吗?我试过自己编译 iptables 1.3.5 也是这个样子,只有 MASQUERADE 起作用,SNAT 没有作用。我不需要内网机器做端口映射,只需要能作到类似 MASQUERADE 那样的效果,但要求能对不同范围的内网地址指定转换为不同的外网地址,恳请哪位高手大人指点迷津,非常感谢!!!
发表于 2006-4-5 20:35:55 | 显示全部楼层
$IPTABLES -t nat -A POSTROUTING -s $hosts -o eth0 -j SNAT --to-source $INET_IP

$IPTABLES -t nat -A POSTROUTING -s $hosts         -j SNAT --to-source $INET_IP

这2句我都能实现 SNAT,似乎没什么问题。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-5 21:11:36 | 显示全部楼层
谢谢楼上的,问题是我机器上就是无法实现 SNAT,我想我的写法也没错吧,但是就是没效果,但是 MASQUERADE 是有效果的,不知道是不是我的系统的问题?是否需要重新编译内核?重新编译安装最新的 iptables?不知楼上的 Linux 是什么发行版?内核等情况如何?能否介绍一下?这个现在让我百思不得其解:(
回复 支持 反对

使用道具 举报

发表于 2006-4-5 21:40:14 | 显示全部楼层
我的是内核 2.6.15.6。

运行该命令的时候有什么错误提示么?
回复 支持 反对

使用道具 举报

发表于 2006-4-6 08:51:33 | 显示全部楼层
你的机器外网卡的IP是252,你想用别的IP的话,你必须增加IP别名。

ifconfig eth1:1 10.13.9.250 netmask 255.255.255.0 broadcast 10.13.39.255 up
ifconfig eth1:2 10.13.9.251 netmask 255.255.255.0 broadcast 10.13.39.255 up

因为在外部网络上,你的机器并不是一个路由节点,所有访问10.13.39.x这个网段的地址都是由网关10.13.39.254控制的,当别的主机访问10.13.39.250时,它首先与10.13.39.254进行通信,10.13.39.254将发送广播包查询10.13.39.250这个主机的MAC,可是网络上并没有10.13.39.250这个主机存在,因此10.13.39.254就会给来访主机发送一个主机不可达的回应包。

但如果你的主机IP10.13.39.252是主机10.13.39.250和10.13.39.251的路由节点的话,那么别人访问10.13.39.250的时候,10.13.39.254就会给10.13.39.252发送数据包,这样你不需要添加别名也可以这么做,因此你的系统中状态跟踪表中已经有这个地址转换的记录了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-6 11:43:55 | 显示全部楼层
哦,好像有点明白了!相当于要将 IP 和 MAC 做个对应,以便二层和三层上能够处理转发。但是不太明白 springwind426 的最后一段话的意思:

“但如果你的主机IP10.13.39.252是主机10.13.39.250和10.13.39.251的路由节点的话,那么别人访问 10.13.39.250的时候,10.13.39.254就会给10.13.39.250发送数据包,这样你不需要添加别名也可以这么做,因此你的系统中状态跟踪表中已经有这个地址转换的记录了。”

对于我这个 NAT 网关来说,它处于 10.13.9.0/24 这个外网网段,外网网段的上级网关是 10.13.9.254,这个我无法控制它。如果我不在我这个机器的外网网卡上绑定另外两个外网 IP 地址,那么您说的 252 是 250 和 251 的路由节点,应该如何理解呀?我内网是好几个机器共用 250 做nat,另外好几个机器共用 251 做 nat,本人对路由交换方面还是刚入门,不太理解您的意思?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-6 11:49:16 | 显示全部楼层
或者 springwind426 说的是不是指,在外网网络内,有一条静态路由,规定了访问 250 和 251 的网关是 252,这样也就能够不需要在 252 我这个 NAT 上增加 IP 别名就能够起效果实现转发了对吗?

如果我的理解正确的话,我想这也是个理论上正确的方式。不过现实情况是,上级路由设置我不可能去更改,我只能在我自己的内网路由上有权做设置,所以我想 springwind426 说第一种方式是直接办法。我马上去试验,呵呵!

在此感谢楼上各位大人的指点和帮助,尤其感谢 springwind426!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-6 20:01:04 | 显示全部楼层
试验已成功,谢谢各位的帮助,学到不少!
回复 支持 反对

使用道具 举报

发表于 2006-4-10 09:51:43 | 显示全部楼层
LINUX服务器上安装两个网卡,其一是和学校连接的外网202.113.*.*,另一个是内部局域网的192.168.10.1(内网是192.168.10.0)则:
希望每次启动的时候都会使规则生效, 随便在哪个地方建立一个 nat.sh , 里面写
#!/bin/sh
PATH=$PATH:/usr/sbin:/sbin
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F INPUT
iptables -F FORWARD
iptables -F POSTROUTING -t nat
iptables -P FORWARD DROP
insmod ip_nat_ftp
insmod ip_conntrack_ftp

iptables -A FORWARD -s 192.168.10.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.10.0/24 -j MASQUERADE(感觉好像这一个就可以了)
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to 202.113.*.*(你的公网IP)(这个是确定IP地址的,估计只要上面的就可以了,因为上面的是自动找到IP并转发出去)

存盘后, 运行chmod +x nat.sh

再编辑 /etc/rc.d/rc.local(计算机启动就执行)
在最后添加
/你存放的路径/nat.sh
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表