课堂部分

实验环境

Firewall-VM:Kali Linux(192.168.232.129)
Client-VM1:winxp(192.168.232.130,00-0C-29-69-14-0D)
Client-VM2:ubuntu(192.168.232.128)
将两台虚拟机的网络连接均设置为“仅主机模式”



winxp ping通kali

ubuntu ping通kali

清空所有链的防火墙规则

1
iptables -F

设置iptables实现特定功能

禁止所有主机 ping 本地主机

设置规则

1
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

仅允许某特定 IP 主机 ping 本地主机

清空规则iptables -F
设置规则

1
2
iptables -A INPUT -p icmp --icmp-type echo-request -s 192.168.232.130 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

winxp ping成功

ubuntu ping失败

为了验证来自 Ubuntu (192.168.232.128) 的 ping 被防火墙 DROP 规则成功阻断,在防火墙主机 (Kali) 上进行了抓包。
过滤器icmp.type == 8,抓取Echo (ping) request的数据包

过滤器icmp.type == 0,抓取ICMP Echo Reply的数据包

防火墙清楚地接收到了来自 192.168.232.128ICMP echo request 包(证明网络是通的),但防火墙没有发送任何 ICMP echo reply 包作为回应。这有力地证明了 iptables INPUT 链中的 DROP 规则成功生效,在网络层丢弃了该请求。

允许每 10 秒钟通过 1 个 ping 包

清空规则iptables -F
设置规则
每10秒1个包就是每1分钟6个包

1
2
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 6/minute --limit-burst 1 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

winxp进行验证

1
ping 192.168.232.129 -t


Windows 的 ping -t 输出时间和 Linux 内核令牌刷新时间并不是完全同步,因此这里的结果并不是严格的“每10个ping有1个成功”。

使用ubuntu进行验证。由于都是linux系统,完全同步,这里看icmp_seq可以发现是严格的“每10秒钟通过1个ping包”

阻断来自某个 MAC 地址的数据包

获取 MAC:在 Client-VM 上获取其 MAC 地址(Windows: ipconfig /all | Linux: ifconfig)。
清空规则iptables -F
设置规则

1
iptables -A INPUT -m mac --mac-source 00:0C:29:69:14:0D -j DROP

阻断winxp的mac地址

winxp ping失败

ubuntu ping成功

配置iptables允许远端客户机SSH连接

打开SSH服务

清空规则iptables -F
开启 SSH 服务:在 Firewall-VM 上,确保 SSH 服务已启动 。

  • systemctl start ssh (或 /etc/init.d/ssh start)
  • systemctl status ssh (或 /etc/init.d/ssh status)

关闭:/etc/init.d/ssh stop

先尝试用ubuntu连接kali

1
ssh kali@192.168.232.129

输入kali的密码后连接成功

尝试winxp连接kali

连接成功

再用kali查看status,看到两台client都成功连接kali

配置并验证 SSH 访问控制规则

先关闭服务/etc/init.d/ssh stop
配置iptables,只允许特定ubuntu SSH连接本地主机

1
2
iptables -I INPUT -p tcp --dport 22 -s 192.168.232.128 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

设置完后再次打开服务
/etc/init.d/ssh start

使用windows xp进行ssh连接,连接失败

使用ubuntu进行ssh连接,连接成功

kali也显示只有一台机连接成功了

课后部分

公网用仅主机,内网用桥接

配置网络环境

防火墙kali

公网客户端ubuntu

内网服务器winxp

手动配置 IP
打开“控制面板”→“网络和Internet连接”→“网络连接”,右键点击“本地连接”,选择“属性”,双击“Internet协议(TCP/IP)”



内网 (VMnet0)

  • Kali (防火墙) eth0: IP为 10.122.214.40,子网掩码为 255.255.192.0
  • WinXP (内网服务器): IP为 10.122.214.100,子网掩码为 255.255.192.0,默认网关为 10.122.214.40

公网 (VMnet1)

  • Kali (防火墙) eth1: IP为 192.168.232.131
  • Ubuntu (公网客户端): IP为 192.168.232.128

连通性测试
内网测试(成功): 从 WinXP ping Kali 内网 IP 成功

从Kali ping WinXP成功

公网测试(成功): 从 Ubuntu ping Kali 公网 IP 成功

从 Kali ping Ubuntu 成功

隔离测试(失败): 从 Ubuntu ping WinXP失败

从WinXP ping Ubuntu失败

打开Winxp的nginx服务


在kali上配置NAT规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 1. 清空所有旧规则
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -F FORWARD

# 2. 开启内核路由转发
sudo echo 1 > /proc/sys/net/ipv4/ip_forward

# 3. 规则1: DNAT (目标NAT)
# 访问 Kali 公网IP (192.168.232.131) 80端口的流量,转发给 WinXP (10.122.214.100)
sudo iptables -t nat -A PREROUTING -i eth1 -p tcp -d 192.168.232.131 --dport 80 -j DNAT --to-destination 10.122.214.100:80

# 4. 规则2: SNAT (源NAT)
# 从内网 (10.122.192.0/18) 来的包,从公网 (eth1) 出去时,源IP伪装成 Kali 的公网IP
# (255.255.192.0 对应的掩码是 /18)
sudo iptables -t nat -A POSTROUTING -o eth1 -s 10.122.192.0/18 -j SNAT --to-source 192.168.232.131

# 5. 规则3: FORWARD (转发新连接)
# 允许从公网 (eth1) 转发到内网 (eth0) 的、目标为 WinXP 80 端口的包
sudo iptables -A FORWARD -i eth1 -o eth0 -p tcp -d 10.122.214.100 --dport 80 -j ACCEPT

# 6. 规则4: FORWARD (允许回复)
# 允许内网 (eth0) 回复公网 (eth1) 的、已经建立的连接
sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT


在ubuntu上打开kali的公网ip,显示出nginx