Linux iptables建立网关的简单实例(支持NAT及FTP连接穿透)

[+]网络拓扑:

outside? —-? eth0+虚拟机A+eth1? —-? eth0+虚拟机B

*我的试验环境如上图所示,虚拟机A的eth0接口与宿主机的连接外网的网卡桥接,所以可以等价为虚拟机A的eth0接口与外网相连,虚拟机A的eth1接口和虚拟机B的eth0接口是使用virtualbox的内网相连。 其实,采用虚拟机组网仅仅是为了方便,针对本文介绍的全部内容,这些机器是否是虚拟机并没什么影响,完全可以将上图中的虚拟机看作实体主机,后面的操作完全与是否虚拟机无关。

*Outside网络中有一台DHCP服务器,以及DNS服务器,这些也不影响本文介绍的核心内容,后面涉及到这两个服务器时会再次说明。

[+]虚拟机A和B都运行Ubuntu8.04

[+]实现思路:虚拟机A配置iptables,使虚拟机A作为这个简单网络的一个安全网关,虚拟机B透过虚拟机A访问outside网络,对外部网络的服务器进行最基本的HTTP浏览和FTP上传下载。并且在一定程度上保护虚拟机B所在的网络不受outside网络的入侵。

配置步骤如下:
[1],先配置两台虚拟机的联通性,虚拟机A的eth1接口IP:10.10.11.1,虚拟机B的eth0接口IP:10.10.11.2,检查可互相ping通。
[2],将虚拟机A作为虚拟机B的默认网关: route add -net 0.0.0.0/0 gw 10.10.11.1
[3],下面就是配置虚拟机A的iptables了,看一下下面的脚本:

——————————-

simple-gateway.sh的内容:

#! /bin/sh

# If no rules, do nothing.
[ -f ./simple-gateway.rules ] || exit 0

case “$1″ in
start)
echo -n “Turning on gateway:”

/sbin/modprobe iptable_nat #only if using iptables

/sbin/modprobe ip_conntrack_ftp #support ftp
/sbin/modprobe ip_nat_ftp #support ftp
/sbin/modprobe ipt_MASQUERADE

./test.rules #run iptables rules

echo 1 > /proc/sys/net/ipv4/ip_forward # enable ip forward
# for RedHat users, the above line is not needed if you have
# FORWARD_IPV4=true in /etc/sysconfig/network file

echo “.”
;;
stop)
echo -n “Turning off gateway:”
echo 0 > /proc/sys/net/ipv4/ip_forward #disable ip forward
#clean iptables rules
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -F INPUT
/sbin/iptables -F OUTPUT
/sbin/iptables -F FORWARD

/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -X
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
echo “.”
;;
*)
echo “Usage: simple-gateway.sh {start|stop}”
exit 1
;;
esac

exit 0

—————————–
simple-gateway.rule的内容:

/sbin/iptables -F INPUT
/sbin/iptables -F OUTPUT
/sbin/iptables -F FORWARD

/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F #ignore if you get an error here
/sbin/iptables -X #deletes every non-builtin chain in the table

/sbin/iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -m state –state NEW -i ! eth0 -j ACCEPT
# only if both of the above rules succeed, use
/sbin/iptables -P INPUT DROP

/sbin/iptables -A FORWARD -i eth0 -o eth1 -m state –state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

# use this line if you have a static IP address from your ISP
# replace your IP with x.x.x.x? 把下面的***部分换成虚拟机A的eth0接口从DHCP服务器获取到的IP地址(当然,在你的环境中,也可能是静态的IP,虚拟机使用这个IP连接outside网络)
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j SNAT –to x.x.x.x

# use this line only if you have dynamic IP address from your ISP
#/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

/sbin/iptables -A FORWARD -i eth0 -o eth0 -j REJECT

————————-

在虚拟机A上 “./simple-gateway.sh start” 使能其网关功能后,虚拟机B就可以ping通outside网络中的地址了;修改虚拟机B的DNS配置文件”/etc/resolv.conf”(虚拟机A此时应该可以正常访问outside网络的域名,所以改成和虚拟机A的该文件一致即可),则虚拟机B即可解析出域名,访问outside网络的网站。
因为我们在”simple-gateway.sh”脚本中加载了iptables的ftp conntrack以及nat等相关模块,所以此时ftp不会被阻断,在虚拟机B上是可以ftp到outside网络中的FTP服务器的(登录、上传、下载都可以)。并且,虚拟机B所在的10.10.11.0网段在外网是无法访问的(虚拟机B通过虚拟机A做NAT映射访问outside),这样就达到了保护内网安全的目的。
在虚拟机A上 “./simple-gateway.sh stop” 即可关闭前面打开的网关功能,恢复初始状态。
当然,本文的iptables脚本非常的简陋,只能作为本文的一个小demo,真正的应用环境,还需要针对实际情况完善补充,才能支持更多的协议通过gateway,并且增加其安全性。

本文参考资料Setting up a Linux Home Gateway

EOF

发表评论

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

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>