实验环境:
主机:Windows 10 20H2
虚拟机:Windows XP SP3,Ubuntu 16.04
网络连接:Ubuntu采用双网卡(NAT网络+内部网络),提供服务的WinXP采用内部网络,充当外网访问的WinXP采用NAT网络。
详细过程:
建立网络实验虚拟环境
准备一个Ubuntu虚拟机以及两个WinXP虚拟机。将Ubuntu虚拟机的网卡1设置为NAT模式,网卡2设置为内部网络模式;将WinXP虚拟机的网卡设置为内部网络模式、NAT网络模式(图1)。
图 1
在Ubuntu虚拟机中配置内网网卡(enp0s8),设置静态IP地址为192.168.0.1。然后编辑/etc/sysctrl.conf,将net.ipv4.ip_forward=1的注释去掉。操作结果如图2。使用命令/etc/init.d/networking restart重启服务。
图 2
由于内部网络中需要Ubuntu虚拟机为两台WinXP虚拟机分配IP,因此需要通过apt安装dnsmasq。安装完成后,运行/etc/init.d/dnsmasq停止服务,修改/etc/dsnmasq.conf如图3。(由于命令较为分散因此使用grep逐个列出)。重启Ubuntu虚拟机使所有配置生效。
图 3
两台WinXP虚拟机与Ubuntu虚拟机所处的内部网络名称应一致(intnet)。启动WinXP虚拟机并将IP改为自动获取,使用ipconfig查看能否从Ubuntu虚拟机获取IP。查询结果如图4,证明WinXP能够从Ubuntu虚拟机获取IP地址,IP地址分别为192.168.0.121和192.168.0.135。
图 4
Ubuntu虚拟机的网络属性如图5。综上所述,Ubuntu虚拟机外网IP为10.0.2.15,内网IP为192.168.0.1;WinXP虚拟机IP分别为192.168.0.121和192.168.0.135。
图 5
在两台WinXP虚拟机上开启http服务和ftp服务。在控制面板->添加或删除程序->添加/删除Windows组件中勾选IIS进行安装。安装完成后,需要配置http服务的默认网页。新建文本文件,写入简单的html代码如图6,另存为index.html,并拷贝一份至C:\Inetpub\wwwroot目录下。
图 6
在控制面板中找到Internet信息服务,右击“默认网站”设置属性。在“网站”页面中,将端口更改为8080;在“文档”页面中,添加index,html并上移至顶部。
图 7
在WinXP浏览器中访问http://127.0.0.1:8080,可以看到出现自己编写的页面;访问ftp://127.0.0.1 可以出现默认文件。http和ftp服务验证结果如图8。
图 8
SNAT应用
1. SNAT配置
为了使两台WinXP能够通过SNAT上网,需要在Ubuntu虚拟机iptables的nat表添加SNAT转发规则。向iptables的nat表添加的规则如图9所示,在POSTROUTING链上将源地址为192.168.0.0/24网段的IP转换为Ubuntu虚拟机的外网IP(10.0.2.15)。添加规则后,通过-L参数查看rules,如图10。
图 9
图 10
在两台WinXP虚拟机上分别使用IE浏览器打开baidu.com、在cmd中ping baidu.com,测试结果如图11。结果显示,两台WinXP均能够通过http和ICMP访问外网。
图 11
2. 协议过滤
在配置SNAT完成的基础上,可以在filter表中的FORWARD链对协议进行过滤,从而阻止或放行指定协议的数据包。本次实验中允许ICMP数据包通过,阻止http数据包通过。为了防止访问网站时出现https协议的干扰,因此将https协议一同阻止。配置命令如图12。
图 12
配置完成后,通过-L参数查看规则,如图13所示。由于nat表没有变化,因此此处只展示filter表的规则。图中蓝框线内为配置的规则。
图 13
在两台WinXP虚拟机上分别使用浏览器访问baidu.com、在cmd中ping baidu.com,测试结果如图14。结果显示,两台WinXP均能够通过ICMP访问外网,但是不能通过http访问外网。
图 14
3. IP过滤
执行iptables -t filter -F清除filter表的规则。如果要使一台WinXP能够上网,另一台不能上网,则可以通过IP过滤实现。配置命令如图15。配置的规则为:阻止源地址为192.168.0.110~192.168.0.130的数据包的转发,允许源地址为192.168.0.131~192.168.0.150的数据包的转发。这里IP过滤的是一段范围内的IP地址,当然也可以禁止单个IP地址。
图 15
通过-L参数查看filter表的规则,如图16所示。蓝色框线内为配置的规则。
图 16
在两台WinXP虚拟机上分别使用浏览器访问baidu.com、在cmd中ping baidu.com,测试结果如图17。结果显示,一台WinXP不能通过http和ICMP访问外网,另一台WinXP能够通过http和ICMP访问外网。
图 17
DNAT应用
由于在NAT/NAT网络模式下主机访问虚拟机需要进行端口转发,而ftp在被动模式下往往需要随机端口建立数据链路,因此需要在NAT网络中设置WinXP虚拟机充当外网主机。网络结构大致如下图18所示。
图 18
1. DNAT配置
为了使外网计算机能够访问到内网计算机(服务器)提供的服务,需要使用DNAT技术对IP地址进行转换。由于内网有两台WinXP提供服务,每台WinXP提供两种服务,因此不能简单地将发往Ubuntu的IP地址转换为其中一台WinXP的地址,而需要加上端口的对应关系。在本次实验中,(IP:Port)的转换关系如下表:
DNAT转换前 | DNAT转换后 |
10.0.2.15:121 | 192.168.0.121:21 |
10.0.2.15:221 | 192.168.0.135:21 |
10.0.2.15:180 | 192.168.0.121:8080 |
10.0.2.15:280 | 192.168.0.121:8080 |
使用iptables实现如上规则。四条规则均通过nat表的PREROUTING链实现,需要指定转换前的端口和转换后的端口。配置命令如图19。
图 19
如此配置完成后,发现“外网”的WinXP能够成功访问内网服务器提供的http服务,但是ftp服务无法正常访问。考虑到目前ftp推荐使用被动模式,因此需要对被动模式下的ftp进一步配置。
经查阅资料,资料[1]提出需要使用modprobe命令加载ip_conntrack_ftp和ip_nat_ftp模块;资料[2]显示加载的模块所提供的功能是Connection Tracking,能够记录连接的状态信息,从而动态地调整过滤或转发行为;资料[3]提出当Linux内核版本为4.7及以上时需要通过配置文件或iptables -A PREROUTING -t raw -p tcp --dport xxx -j CT --helper ftp命令启用某端口的ftp服务的Connection Tracking功能。对于ftp来说,connection tracking能够将ftp在随机端口发起的数据传输连接标记为RELATED,从而允许该连接的转发。有关模块加载和激活的命令如图20。
图 20
通过-L参数查看已配置的规则,如图21。
图 21
在NAT网络的WinXP上使用ftp客户端FileZilla以被动模式访问内网两台WinXP的ftp服务,使用IE浏览器访问http服务。验证结果如图22,证明经过DNAT的相关配置后处于“外网”的计算机确实能够访问内网提供的ftp和http服务。
图 22
参考资料:
[1] https://blog.youkuaiyun.com/weixin_33918357/article/details/90631341
[2] https://www.rigacci.org/wiki/lib/exe/fetch.php/doc/appunti/linux/sa/iptables/conntrack.html
[3] https://wiki.archlinux.org/title/Very_Secure_FTP_Daemon
2. IP限制
如果想要使外网计算机只能访问一台WinXP的http和ftp服务,则需要对IP地址和端口进行过滤。对于DNAT的IP和端口过滤,需要知道nat表的PREROUTING和filter表的FORWARD的执行顺序。根据资料[1],nat表的PREROUTING先于filter表的FORWARD执行,因此filter表中拒绝的IP地址应为192.168.0.121(内网的一台WinXP),端口为8080和21。Iptables的filter表配置如图23。
图 23
使用-L参数查看filter表配置的规则如图24。此处虽然开启了ftp的Connection Tracking,但只需要拦截其建立控制链路的数据包使其无法建立控制连接即可。
图 24
配置完成后使用外网的WinXP访问内网两个WinXP的ftp服务和http服务,结果如图25。结果显示,经过在filter表中对IP地址和端口的过滤后,其中一台WinXP的http服务和ftp服务已经无法访问,而另一台WinXP提供的服务可正常访问。
图 25
参考资料: