跳转至

iptables

2023/07/08

背景

玩TryHackMe时需要用Windows,然而在Windows上使用openvpn不知道为何无法连接目标网络。于是尝试依旧用kali连接THM,然后将Windows访问THM的流量转发到kali,由kali转发至THM。相当于让kali充当一个路由器/防火墙。

拓扑:Windows(10.10.10.20) —— kali(eth0:10.10.10.10 —— enumad:10.50.47.202) —— THM目标网络(10.200.49.0/24)

启用IP转发功能

命令行写入:sysctl [-w] net.ipv4.ip_forward=1

  • 使用 -w 即和修改 /etc/sysctl.conf 文件里的 net.ipv4.ip_forward=1 一样
  • 若是修改配置文件,执行此命令使更改生效:sysctl -p

确认配置

确认是否为1:sysctl net.ipv4.ip_forward

配置转发规则

方法1

tracert的第一跳直接目标,且“显示”无延迟。

sudo iptables -t nat -A PREROUTING -i eth0 -s 10.10.10.20 -j DNAT --to-destination 10.50.47.202
sudo iptables -t nat -A POSTROUTING -o enumad -s 10.10.10.20 -j MASQUERADE
  • -j MASQUERADE:动态地对源地址进行网络地址转换(SNAT),用于实现源地址伪装,使其看起来好像是从转发规则出口的接口发送的。在一个网络中,当你有多个主机通过一个公共IP地址连接到互联网时,你需要使用NAT来转换网络数据包的源地址和目标地址。这使得数据包在从私有网络传输到公共网络时,看起来好像是由NAT设备(通常是路由器)发送的,而不是来自于原始的主机。
  • Linux上的 IP MASQUERADE 就是一般意义上的 NAPT
  • 与方法2类似,可理解为方法1指定出口的源IP为接口并配置MASQUERADE,而方法2直接指定源IP为接口的IP。

方法2

sudo iptables -t nat -A PREROUTING -s 10.10.10.20 -d 10.10.10.10 -j DNAT --to-destination 10.50.47.202
sudo iptables -t nat -A POSTROUTING -s 10.10.10.20 -j SNAT --to-source 10.50.47.202

方法3

sudo iptables -A FORWARD -i eth0 -o enumad -s 10.10.10.20 -j ACCEPT
sudo iptables -A FORWARD -i enumad -o eth0 -d 10.10.10.20 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o enumad -s 10.10.10.20 -j MASQUERADE
  • 这个方法是最详细的,包括了防火墙规则和NAT规则。
  • 前两条规则用于允许从10.10.10.20到10.50.47.202的流量通过防火墙。第一条规则允许出站流量,第二条规则允许相关或已建立的流量返回。
  • 第三条规则使用MASQUERADE对流量进行NAT(同方法1的第二条规则),以便从10.10.10.20发送的流量经过enumad接口时具有伪装的源IP地址。

其他命令

  • 确认配置的NAT表:sudo iptables -t nat -L
  • 确认filter表:sudo iptables -L (因为iptables默认filter表所以不用-t选项)
  • 清除配置:sudo iptables -F [-t nat]

注意

  • 需要在Windows添加路由:route add 10.200.49.0 mask 255.255.255.0 10.10.10.10
  • 这些规则将在当前会话中生效,但不会在系统重启后持久生效。如果你希望在系统重启后仍然生效,你需要将这些命令添加到适当的启动脚本中(如/etc/rc.local)。(也有其他方式)