我想根据ip来源模拟不同的ip来测试流量过滤。
我使用 iptables 和 2 个使用桥接网络模拟节点 1 和节点 2 的容器做了一些测试。
- node1是欺骗其源地址并向node2发送请求的节点
- node2只是接收端,我们打算在其中检查ip的来源
我首先尝试使用 ICMP,这很简单:
# node1 : target icmp protocol and change the src @
node1> sudo iptables -t nat -A POSTROUTING -p icmp -j SNAT --to-source 0.0.1.45
# node2 : redirect traffic targeted to 192.168.1.66 to
node2> declare node1="$(dig +short node1)"
node2> iptables -t nat -A OUTPUT -p icmp -d 0.0.1.45 -j DNAT --to-source $node1
TCP ip 欺骗结果并不是那么简单:我尝试通过对请求进行 SNAT 并使用 DNAT 规则将流量发送回真实主机来模拟 ip 223.253.0.5。 node2 上的 tcpdump 显示请求已被很好地接收,但数据包必须在到达用户空间之前的某个时刻被丢弃。
# node1 :
node1> declare node2="$( dig +short node2 )"
node1> sudo iptables -t nat -A POSTROUTING -p tcp -d "$node2" --dport 80 -j SNAT --to-source 223.253.0.5
node1> sudo iptables -t nat -A POSTROUTING -p tcp -d "$node2" --dport 443 -j SNAT --to-source 223.253.0.5
# node2 : where we check the origin of the ip
node2> declare node1="$(dig +short node1)"
node2> iptables -t nat -A OUTPUT -p tcp -d 223.253.0.5 -j DNAT --to-destination $node # to send back traffic to the spoofer
为了模拟请求,我使用了curl
# on the client's side
node1> curl -vvv --insecure -Ls http://$node2:80
# or using socat
# the client
node1> socat - TCP:node2:80
# the server
node2> socat - TCP-LISTEN:80,fork,bind=172.16.2.6
我真的很想知道为什么我不能让它使用 TCP 工作。