在VirtualBox上模拟iptables端口转发

在工作中会遇到这样一种情况,有个别业务只能在专线网络上,或者是公司的内部网络上处理。我们通过外部网络无法和其进行交互,这时候需要一台具有双网卡的机器来作为中间的专发机,一张网卡配有外网IP,一张网卡配有内网IP,通过外网来的任务经过这台机器转发给内网的机器进行处理。听起来和代理十分相似了,当然完全可以用代理的方法来实现。下面介绍一个非常简单的方法,通过iptables端口转发来实现。

目的:当访问A机器的80端口,A机器将请求转发给B机器处理。作为模拟测试,我准备了两台虚拟机A和B,A拥有两张网卡,B有一张网卡。虚拟机的操作系统CentOS 6.6,两台机器上都安装了Apache。

我用的是VirtualBox的虚拟机,网卡配置如下图所示:
QQ图片20150112160712
A机器的网卡一设置
第一张网卡设置的连接方式为“仅主机(Host-Only)适配器”,这张网卡上需配置外网IP,本地机器可以通过外网IP访问到A机器。
QQ图片20150112160727
A机器的网卡二设置
第二张网卡设置的连接方式为“内部网络”,这张网卡上需配置内网IP,它的作用是用于两台虚拟机之间的连通。
如果不清楚VirtualBox网卡的几种连接方式,可以自行Google一下。
B机器的网卡连接方式设置和A机器的第二张网卡一样,都是选择“内部网络”,这样两台虚拟机之间才能连通,我就不上图了。

接下来配置3台机器的IP段(A、B和本地机器),本地机器和A的第一张网卡要配在一个IP段内,而且是外网IP,B机器和A的第二张网卡配置在一个网段内,为内网IP。

先配置本地机器的IP,禁用所有网络连接,只留一个VirtualBox的网卡。如图:
QQ图片20150112162757
打开VirtualBox,左上角“管理”->”全局设定”->”网络”->”仅主机(Host-Only)网络”
QQ图片20150112163347
修改VirtualBox网卡的IP和子网掩码,将本地IP修改为8.8.8.1子网掩码255.255.255.0
QQ图片20150112163353

接下来配置A机器的IP地址
配置网卡一:ifconfig eth0 8.8.8.8 netmask 255.255.255.0
配置网卡二:ifconfig eth1 192.168.10.1
QQ图片20150112164220
用本地机器ping一下8.8.8.8看能ping通不,如果可以再用浏览器访问8.8.8.8看能否访问A机器上的页面(注:分别在A、B两台机器上提前创建两个html文件,为了好区分,例如一个内容为This is A一个This is B),如果可以,就能看到“This is A”。如果请求无相应,检查一下iptables是否允许访问80端口和selinux是否关闭。
检查selinux是否关闭:sestatus
关闭selinux:修改/etc/selinux/config文件中设置SELINUX=disabled ,然后重启服务器。

在iptables中开放80端口:iptables -A INPUT -p tcp -m tcp –dport 80 -j ACCEPT
保存iptables:/etc/init.d/iptables save 或 service iptables save
重启iptables:/etc/init.d/iptables restart 或 service iptables restart

关闭了selinux,开放了80端口,再通过浏览器访问8.8.8.8就可以看到“This is A”了

接着来配置B机器的IP
ifconfig eth0 192.168.10.2
QQ图片20150112170307
同样,这台机器关闭掉selinux,并在iptables中开放80端口。

用A机器ping一下192.168.10.2,没什么问题,是可以ping通的。再访问一下B机器上的页面,方法很多种自行选择(例如:wget http://192.168.10.2),ok,没问题,那么做最后一步的转发工作。

接着配置A机器的iptables,将A机器80端口的请求转发到B机器的80端口上。
iptables -A PREROUTING -p tcp -m tcp –dport 80 -j DNAT –to-destination 192.168.10.2
iptables -A POSTROUTING -p tcp -m tcp –dport 80 -j MASQUERADE
保存iptables:/etc/init.d/iptables save 或 service iptables save
重启iptables:/etc/init.d/iptables restart 或 service iptables restart

最后一步:echo 1 > /proc/sys/net/ipv4/ip_forward
这句的意思是开启路由功能,如果没有这一句,外部无法通过A机器访问到B机器,在/proc/sys/net/ipv4/目录下的ip_forward文件中,0代表关闭路由管道,1代表开启。只有开启后,A机器的两张网卡才可以通信。

好了,用本地机器的浏览器访问一下8.8.8.8,可以看到“This is B”,请求被转发给了B机器。

发表评论

电子邮件地址不会被公开。 必填项已用*标注