测试工作室在会议室内,作为独立测试环境,希望于公司现有网络分开;因为希望能够访问公司内网的资源,也希望不用去会议室就可以远程桌面访问测试服务器,或者通过不同端口访问发布在工作室内部的应用程序。
这里就提出了两个要求:
1、 测试工作室可以随意访问公司内网(主要是访问内网的数据库服务器或者共享文件);
2、 公司内网可以通过特定端口访问测试工作室(http协议访问应用程序,远程桌面访问控制测试服务器)。
这恰巧就是一台普通路由器应该具备的功能。普通家庭用的路由器就是具备路由转发功能,实现共享上网,然后还可以映射端口,供外网访问到内网开启的对外服务。
这里重点写下里面的路由实现原理,以解释我们访问实现方法。
操作系统:Redhat Linux9
网络图:
公司内网(10网段)——公司网关——外网
|
网卡Eth0(10.1.10.173)
|
linux代理做的路由
|
网卡Eth1(192.168.1.1)
|
交换机——工作组(192网段)
网卡:
Eth0:IP:10.1.10.173
Mask:255.255.255.0
Gateway:10.1.10.254
Eth1:IP:192.168.1.1
Mask:255.255.255.0
Gateway:空
路由表:设置完毕后,系统自动添加
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth1
10.1.10.0 * 255.255.255.0 U 0 0 0 eth0
default 10.1.10.254 0.0.0.0 UG 0 0 0 eth0
路由脚本:
touch /var/lock/subsys/local
#到达指定目录
/sbin/modprobe ip_tables
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp
#加载这些功能模块
/sbin/iptables –F
#删除file表中的全部规则
/sbin/iptables -F -t nat
#删除nat表中的全部规则
/sbin/iptables –X
#删除用户指定的链
/sbin/iptables –Z
#把所有链的包及字节的计数器清空
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
#指定默认的链 INPUT、FORWARD、OUTPUT都允许。
echo 1 > /proc/sys/net/ipv4/ip_forward
#开启内核包转发功能
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 10.1.10.173
#修改出去的192.168.1.*的包成转化为地址10.1.10.173出去
echo "60" > /proc/sys/net/ipv4/tcp_keepalive_time
#TCP链路保持连接时间60s
echo "45" > /proc/sys/net/ipv4/tcp_keepalive_intvl
#keepalive探测包的发送间隔
echo "5" > /proc/sys/net/ipv4/tcp_keepalive_probes
#如果对方不予应答,探测包的发送次数
iptables -t nat -A PREROUTING -d 10.1.10.173 -p tcp --dport 7001 -j DNAT --to 192.168.1.11:7001
iptables -t nat -A PREROUTING -d 10.1.10.173 -p tcp --dport 3389 -j DNAT --to 192.168.1.11:3389
#端口映射(-t 表nat, -A后面增加一条, PREROUTING 修改路由之前进入的包, -p 采用的tcp协议,--dport 端口号,-j 目标跳转,DNAT 进来的时候改变目的地址)对nat表增加一条进来的地址为10.1.10.173,端口为*的包跳转到内网地址的对应的端口。3389为远程桌面默认端口。
1、测试工作室机器互相访问
测试工作室的机器(IP为192.168.1.*)的机器访问同一网段的机器当然没有问题,默认路由表里面已经有了,192.168.1.*网段的数据包都通过eth1网卡转发。(没有这块网卡其实也是可以访问的,只不过是通过对局域网进行广播寻找到目的地址)。
2、测试工作室机器对公司内网访问
测试工作室的机器(192.168.1.*)的机器对公司内网机器(10.1.10.*)的访问,网卡自动识别目的地址为10.1.10.*的数据包,于是eth1就把数据表交给eth0,然后从eth0发给公司内网的机器。
3、公司内网通过端口访问测试工作室的机器
公司内网的机器(10.1.10.*)访问测试工作室的机器(192.168.1.*)时,并不能直接访问到192.168.1.*网段,因为我们的网关是10.1.10.254,他找不到测试工作室的网段。但是我们可以访问10.1.10.173,这块和我们同一个网段的网卡,同时也是路由的eth0外网卡,然后路由识别对10.1.10.173的访问,然后把包丢该eth1,eth1按照我们设置好的规则(脚本里面的规则),把对不同端口访问的数据包丢给相应的测试工作室的机器。
其中需要说明的重点:
1、“开启内核包转发功能”,路由才会去把两个网段之间访问的数据在两块网卡之间转发。
2、我们发送的数据都是被打包分成很多很多小的数据包转发的,数据包里面包含了源地址、目的地址、校验码等等信息。数据包通过网卡转发的时候,网卡会修改这些信息,以实现我们夸网段的访问。
比如192.168.1.2访问10.1.10.6,数据包地址经过一次192.168.1.2转换为10.1.10.173,由eth0发给10.1.10.6,当返回请求的数据包到达10.1.10.173,网卡了解到请求是192.168.1.2发出的,所以再把10.1.10.173地址修改为192.168.1.2交给eth1去转发给192.168.1.2。
这些都是基于TCP/IP协议的访问。
由此我们还可以自己思考下,测试工作室的机器(IP为192.168.1.*)访问google的时候数据包经过eth1转发,再通过公司网关10.1.10.254伪装成公司公网地址*.*.*.*转发,当我们的请求返回的时候可想而知数据包包含的信息量,以及TCP/IP这些底层协议的奇妙。