# 防火墙实验课下部分 设置iptables规则,实现内网服务的发布 ## 实验原理 ### 目标网络地址转换(DNAT) 目标网络地址转换(Destination Network Address Translation,简称DNAT)是NAT的一种形式,它主要用于将外部请求的目标IP地址转换为内部网络中的特定IP地址。 DNAT通常用于提供服务器的外部访问,例如Web服务器或邮件服务器。当外部用户发送请求到公共IP地址时,DNAT会将请求的目标IP地址修改为服务器的内部IP地址,从而确保请求能够正确路由到服务器。 DNAT的配置通常在防火墙或路由器上进行,通过将目标IP地址和端口映射到内部网络中的特定IP地址和端口,实现请求的转发。 以下是一个DNAT的示例配置: ``` iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80 ``` 上述配置将所有通过eth0接口发送到端口80的TCP请求的目标IP地址转换为192.168.1.100,并将端口保持为80。 ### 源网络地址转换(SNAT) 源网络地址转换(Source Network Address Translation,简称SNAT)是NAT的另一种形式,它用于将内部网络中的源IP地址转换为公共网络可路由的IP地址。 SNAT通常用于实现多个内部设备共享一个公共IP地址访问互联网的情况。当内部设备发送请求到公共网络时,SNAT会将请求的源IP地址修改为公共IP地址,以确保响应能够正确返回到内部网络。 与DNAT类似,SNAT的配置通常也在防火墙或路由器上进行。以下是一个SNAT的示例配置: ``` iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to-source 203.0.113.10 ``` 上述配置将所有从192.168.1.0/24子网发送到外部网络的请求的源IP地址转换为203.0.113.10。 SNAT还可以配置为动态SNAT,其中IP地址会根据可用的公共IP地址池进行动态选择。这可以实现更好的负载均衡和高可用性。 ## 实验过程 ### 实验环境 ![image](https://hackmd.io/_uploads/BJAOM91Na.png) 如上图所示,假设PC2不能直接访问局域网内的电脑PC1上的服务,但PC2可以与firewall上的公网IP:192.168.58.128 相互通讯,由此可以进行NAT的设置,让PC2访问firewall的公网地址上的服务,再由firewall对数据进行处理,将访问请求发送到内网PC1上。 ### 配置网络环境 首先,给作为firewall的ubuntu增设网卡,并设置两张网卡处在不同的网络中(网卡1使用自定义的VMnet0,网卡2使用自定义的VMnet1) ![image](https://hackmd.io/_uploads/SknQqDJ4p.png) ifconfig查看ip: ![image](https://hackmd.io/_uploads/BJ8HW5yET.png) 设置PC1的网络适配器,与firewall网络适配器ens33处于一个网段(VMnet0);PC2使用另一台虚拟机,网络设置同firewall的网络适配器ens38(VMnet1)。 ![image](https://hackmd.io/_uploads/rJ_wWqkV6.png) ![image](https://hackmd.io/_uploads/SkQYbqyE6.png) PC2 无法ping通 PC1,但是可以ping防火墙 ![image](https://hackmd.io/_uploads/HyxJM51N6.png) PC1 无法ping通 PC2,但是可以ping防火墙 ![image](https://hackmd.io/_uploads/SJVQtLeVT.png) ### 设置NAT规则 在 firewall 开启端口转发功能 ``` echo 1 > /proc/sys/net/ipv4/ip_forward ``` 对公网来的访问数据设置DNAT规则,将其访问目标地址通过NAT修改为提供服务的ip,以便将请求转发到内网对应IP上 ``` iptables -t nat -A PREROUTING -i ens38 -p tcp -d 192.168.58.128 --dport 80 -j DNAT --to-destination 172.19.230.10 ``` 设置一条SNAT的规则,以便内网对公网数据访问的回应信息能够到达请求的客户: ``` iptables -t nat -A POSTROUTING -o ens38 -p tcp -j SNAT --to-source 192.168.58.128 ``` 在FORWARD链上设置允许访问内网的规则: ``` iptables -A FORWARD -i ens38 -p tcp -d 172.28.219.205 --dport 80 -j ACCEPT ``` ``` iptables -A FORWARD -p tcp -m state --state established,related -j ACCEPT ``` 完成设置之后,可以通过 firewall 的公网ip的80端口访问内网服务。 ![image](https://hackmd.io/_uploads/HJXeGPgEp.png) ## 实验反思 通过本次实验,我学习了iptables防火墙的基本操作,熟悉了iptables防火墙的包过滤规则,并实现了一些实用的功能。另外,我动手配置了网络环境,开启防火墙路由转发并设置相应的iptables规则,以此实现内网服务的发布。这些体验都是在书本知识上感受不到的,正所谓“纸上得来终觉浅,绝知此事要躬行”。 此外我了解到了 vmware 的网络连接模式 1. 桥接(Bridged)模式 其实在网络层面,完全可以把桥接模式的虚拟机看做是与宿主机具有同等地位的两台电脑。只要将虚拟机的 IP 地址、子网掩码配置成与宿主机同一网段,那么二者就可以进行通信。 2. NAT 模式 NAT 模式就是让虚拟机借助 NAT (网络地址转换)功能,通过宿主机来访问外部网络。 3. 仅主机(Host-only)模式 在有些情况下,我们需要将虚拟机所在的网络环境与宿主机所在的网络环境进行隔离,这个时候就可以采用 Host-only 模式。