Redhat 7.2下使用iptables实现NAT
一、注意环境:
一台DELL LATITUDE C610笔记本(PIII1G,256M SDRAM,30G 4200rpm HDD)上安装Redhat Linux 7.2(完全安装)。Redhat 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下使用iptables就可以实现NAT了。
【编辑推荐】