[iptables]Redhat 7.2下使用iptables实现NAT
Redhat 7.2下使用iptables实现NAT
zerg_79 | 2005年二月24日, 17:16
环境:
一台 DELL LATITUDE C610 笔记本( PIII1G , 256M SDRAM , 30G 4200rpm HDD )上安装 Redhat Linux 7.2 (完全安装)。
这台笔记本自带一块内置百兆以太网卡( 3Com 3C920 ),在 Redhat 中标识为 eth0 , IP 地址为 192.168.59.27/24 , Gateway 为 192.168.59.1 。另外插上一块 PCMCIA 接口的网卡( Realtek 8139 ),在 Redhat 中标识为 eth1 , IP 地址为 10.0.0.254/24 ,这块网卡的 TCP/IP 设置中仅设置 IP 和 NetMask ,不设置 Gateway 。这样,在 netstat –rn 或者 route print 命令中看到缺省路由唯一指向 192.168.59.1 。
关于如何驱动双网卡,建议在 X - Windows 环境下配置,详见相关文档。
一台 Cisco 2621 路由器,其 FastEthernet0/0 口配置 IP 地址为 10.0.0.1/24 ,另一个以太网接口 Down 掉。配置一条缺省路由“ ip route 0.0.0.0 0.0.0.0 10.0.0.254 ”,路由器的缺省网关就指向了 10.0.0.254 。
试验环境拓扑图如下:
如上图所示,这台笔记本的 eth0 ( 3Com )网卡接入办公室局域网,其他 ip 地址在 192.168.59.0/24网 段的机器也连接在这个局域网里。最后都通过网关192.168.59.1以 NAT 接入 Internet 。
在试验中还需要用到一台 192.168.59.x 的 PC 机 Client 来测试 ping 等网络功能。
开始试验:
在笔记本上进入 Linux 操作系统,以 root 用户身份登录到字符界面。
首先输入 setup ,进入配置菜单。进入 system service ,选项,关闭里面的 ipchains (去掉选项前面的 * 号),启用里面的 iptables (在选项前加上 * 号)。这里设置后, Linux 的服务并没有按照我们的意愿启动或停止,这只是标记一下并告诉系统下次启动时将要自动启动哪些服务而不启动哪些服务,可以重新启动 Linux 操作系统( reboot )使设置生效。在不需要重新启动操作系统的前提下,可以重启端口守护进程: /etc/rc.d/init.d/xinetd restart
启动好 iptables 之后,就需要配置它了。
首先 打开 ip 转发功能(相当于让计算机工作在路由状态,能够转发各个网络接口上的数据包):
echo 1 >/proc/sys/net/ipv4/ip_forward
注意,在“ echo 1 ”和“ > ”之间有一个空格,否则语句就不起效果。
这一句执行前,我们可以 vi /proc/sys/net/ipv4/ip_forward ,看到文件内容为一个字符“ 0 ”,这表明 ip forward 功能被禁用。该语句正确执行后,文件内容被改为“ 1 ”,表明 ip forward 功能被启用。
也可以 手工去修改 ip_forward 文件内容为“ 1 ”,启用 ip 转发功能,但是下次 系统重启后,又会被置为 0 。
这 是实现 iptables NAT 的准备工作,我们可以将这条语句写进 /etc/rc.d/rc.local 这个启动脚本中,下次操作系统重新启动时,这条语句会被自动执行。
在 iptables 的 filter 表里面不做任何设置,所有规则为空,默认即为所有包均允许通过。
iptables –L 即 iptables –t filter –L ,显示包过滤规则
iptables –t nat –L 现实 NAT 规则
同样的,
iptables –A 和 iptables –D 表示添加和删除包过滤规则,完全写法为 iptables –t filter –A 和 iptables –t filter -D
iptables –t nat –A 和 iptables –t nat –D 表示添加和删除 NAT 规则
iptables –F 表示清空包过滤规则,完全写法为 iptables –t filter –F ,再次强调,包过滤规则为空表示对所有通过的数据包均放行不予拦截( ACCEPT )。
iptables –t na –F 表示清空 NAT 规则
接下来在 iptables 的 NAT 表里面做相应的地址转换设置。
用以下语句添加两条 NAT 规则:
iptables –t nat –A POSTROUTING –s 10.0.0.0/24 –o eth0 –j SNAT ―― to 192.168.59.27
iptables –t nat –A PREROUTING –p tcp –d 192.168.59.27 ―― dport 2323 –i eth0 –j DNAT ―― to 10.0.0.1:23
需要说明的是源地址转换( SNAT ) 是在路由后进行的,所以是 POSTROUTING ,需要确定数据包出防火墙的接口;而目的地址转换( DNAT )是在路由前进行的,所以是 PREROUTING ,需要确定数据包进防火墙的接口。
对第一条 NAT 规则解释如下:
这是一个源地址转换规则,数据包出防火墙( -o )的接口是 eth0 。这条规则将所有源地址为 10.0.0.0/24 的数据包在从 eth0 接口出防火墙的时候,转换其源地址为 192.168.59.27 。这样就让内部网( 10.0.0.0/24 )的机器能够共享一个外部网 IP ( 192.168.59.27/24 )访问到外部网段( 192.168.59.0/24 )。这条规则适合部署一台 NAT 防火墙实现 Office 或 Home 的多台机器共享上网。
对第二条 NAT 规则解释如下:
这是一个目的地址转换规则,数据包进防火墙( -i )的接口是 eth0 。当一个数据包试图访问防火墙的 eth0 接口( 192.168.59.27 ) 2323 端口的时候,数据包的目的地址将被改变为 10.0.0.1 ,同时,访问的端口也将被改变为 23 ,也就是说,这个数据包将被防火墙从其 eth1 接口转发(因为 eth1 接口 IP 是 10.0.0.0/24 这一段的)出去并送达 10.0.0.1 访问其 23 端口。这是一个典型的静态端口重定向规则。
测试:
因为 10.0.0.1 是路由器 Cisco 2621 的快速以太口,我们可以 telnet 上路由器,然后确定 sh ip route 显示其缺省路由指向 10.0.0.254 ,并确保能在路由器上 ping 通 10.0.0.254 。然后试图 ping 192.168.59.1 ,发现能够 ping 通,但是速度不稳定有时会丢包,怀疑到 192.168.59.1 是一台 Catalyst 6509 多层交换机,整个公司均利用其作为网关出口,所以该设备的 NAT 处理非常频繁,可能会导致处理数据包能力下降。所以从路由器上 ping 另一个 IP 例如 192.168.59.22 ,发现连通性非常稳定,这表示 SNAT 功能成功实现。
由于路由器打开了 telnet 功能,其 IP 为 10.0.0.1 的以太网接口的 23 端口( telnet )是处于侦听状态的,
而防火墙(笔记本)上的 eth0 接口的 2323 端口被映射到 10.0.0.1 的 23 端口。所以从一台 192.168.59.0/24 网段内任意一台 Client 机器上 telnet 192.168.59.27 2323 ,显示出了 Cisco 2621 的 telnet 登录界面,输入口令“ cisco ”后进入了 Cisco 2621 。这表明 DNAT 功能成功实现。
因为防火墙(笔记本)的网关指向了 192.168.59.1 ,所以从路由器上能 ping 通 Internet 上的公网 IP 比如 202.38.64.2 (中国科技大学 www 服务器)。
接着输入:
iptables –t nat –D PREROUTING 1查看更多关于Redhat 7.2下使用iptables实现NAT的详细内容...