iptables的SNAT和DNAT实验

前言

最近工作涉及到一点iptables的使用,所以通过实践学习一下iptables的用法。实验的平台还是正点原子的stm32板。具体组网如下:
iptables的SNAT和DNAT实验_第1张图片
路由器是外网的入口。利用这个组网,主要做SNAT和DNAT相关的实验。

1. SNAT

网上的说法是,SNAT是内网访问外网的工具,实际上是通过伪装源ip实现的。我的目标是,PC1可以访问到PC2的任意服务。也就是在我的实验中,PC2是外网,PC1是内网。
iptables移植后,还需要内核支持,所以重新配置内核后编译安装了内核。之后打开iptables的支持配置:

echo 1 > /proc/sys/net/ipv4/ip_forward

之后执行iptables的SNAT命令。

iptables -t nat -A POSTROUTING -s 10.168.32.0/24 -o wlan0 -j SNAT --to-source 192.168.31.103

这条命令简单的翻译就是,在nat表的POSTROUTING链里面添加一条规则,凡是从10.168.32.0/24源IP进来的包,从wlan0出去的包,都把源修改为本地wlan0网卡的ip:192.168.31.103。这样,PC1通过eth0进入的包,就可以成功通过wlan0转发了。这里截包的话可以看到两个包,一个是10.168.32.1->192.168.31.131的包,另外是192.168.32.103->192.168.31.131。截包还可以分析SNAT的性能等。
配置完成之后,我们在PC1上ssh到PC2,最后现象为:

root@DESKTOP-NRAKKQ5:/home/liuzhixing# ssh [email protected]
[email protected]'s password:
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 4.4.0-19041-Microsoft x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sat Sep  3 17:33:30 CST 2022

  System load:    0.52      Processes:              12
  Usage of /home: unknown   Users logged in:        0
  Memory usage:   32%       IPv4 address for wifi2: 192.168.31.131
  Swap usage:     0%


116 updates can be applied immediately.
73 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '22.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sat Sep  3 17:32:27 2022 from 192.168.31.103
liuzhixing@XP-PC-liuzx9:~$

这里也可以看到PC2认为连接的源IP是103。
另外,因为路由器连接了外网,而且没有配置DROP规则和限制目的ip,所以这条配置添加之后,PC1已经可以与外网连通。

2. DNAT

网上的说法是,DNAT是内网暴露端口给外网访问的工具,实际上是通过修改包的目的地实现的。这里我通过DNAT,让PC2能访问PC1的sshd和http服务。同样的,这里PC1还是内网,PC2还是外网。
执行iptables的DNAT配置命令:

iptables -t nat -A PREROUTING -d 192.168.31.103 -i wlan0 -p tcp -m tcp --dport 12346 -j DNAT --to-destination 10.168.32.1:8080
iptables -t nat -A PREROUTING -d 192.168.31.103 -i wlan0 -p tcp -m tcp --dport 12345 -j DNAT --to-destination 10.168.32.1:22

这两条命令的翻译是,在nat表的POSTROUTING链里面添加两条规则:从wlan0网卡进入的tcp包,目的是192.168.31.103的12346端口的,转发到10.168.32.1的8080端口,目的是192.168.31.103的12345端口的,转发到10.168.32.1的22端口。这样,虽然stm32上没有监听12345和12346端口,但是PC2还是能正常访问。
最后,http的现象是:

http转发
而ssh的现象是:

liuzhixing@XP-PC-liuzx9:~/.ssh$  ssh -p 12345 [email protected]
The authenticity of host '[192.168.31.103]:12345 ([192.168.31.103]:12345)' can't be established.
ECDSA key fingerprint is SHA256:KAdoRRuXSWfbDxKfGiar59Rf12Rqa271a8kEwQvMvUI.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[192.168.31.103]:12345' (ECDSA) to the list of known hosts.
[email protected]'s password:
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.4.0-19041-Microsoft x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


214 packages can be updated.
159 updates are security updates.


Last login: Sat Sep  3 17:37:43 2022 from 192.168.31.131
liuzhixing@DESKTOP-NRAKKQ5:~$

后记

iptables是利用内核的netfilter机制实现的,后面还需要分析内核相关源码,才能完全了解工作原理。

你可能感兴趣的:(linux,嵌入式硬件,网络)