我参考了几篇博客,想研究一下tun做代理的原理,但是卡在无法将报文从tun转发给eth这个点上
我在阿里云上弄了2台centos7的服务器,然后一台做转发用的代理服务器,一台做客户端
客户端用tun拦截ip包再通过eth转发给代理服务器,之后服务器端从eth读取ip包,写入tun,然后正常流程是tun发现ip包的目的地址不是本机,通过报文转发和nat转化把ip包交给eth发到外网,外网的服务器响应的ip包再经过nat和转发从eth到tun,我再从tun读取转发过来的ip包发给客户端。但是我在tun转发给eth这步失败了
我参考别人的文章,开启了报文转发
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p
以及nat转换
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
给客户端的tun赋予ip
sudo ifconfig tun0 192.168.0.11 netmask 255.255.255.0
给服务端的tun赋予ip
sudo ifconfig tun0 192.168.0.10 netmask 255.255.255.0
我尝试用客户端去ping 14.215.177.38 //百度的ip
我打印了服务端从eth获取的客户端发来的ip包
src:192.168.0.11
des:14.215.177.38
这没问题,
然后我把这个ip包写入tun,再从tun读取响应的ip包,打印ip
src:192.168.0.10
des:192.168.0.11
这里就不对了,src的地址应该是14.215.177.38,但是实际上是代理服务器的tun的ip地址,这说明这个包没发送到外网,
ip包交给tun后目标地址被更改成本机tun的地址,然后代理服务器自己响应的了这次的ping请求。
我想知道为什么服务端把ip包交给tun后为什么没发给eth到外网,而是目的地址被改为tun的地址发给本机了。
是我的iptables规则写的有问题吗,还是有哪里没配置导致这种奇怪的现象。
这是我参考的文章
https://www.cnblogs.com/blumia/p/Make-a-simple-udp-tunnel-program.html