5年前,我写了一篇文章,介绍如何使用IPIP隧道实现IPv4地址的映射。今天,我来介绍一下使用更通用的GRE隧道(Generic Routing Encapsulation tunnel)实现IPv4地址的映射。
有很多场景需要使用IP地址映射。比如,我们有两台服务器,服务器A有大容量的硬盘和很多个IP地址,我们打算用它来做媒体播放储存;服务器B有很高的性能,但是只有一个IP地址,我们打算用它来做多个独立IP站点或者独立IP虚拟机。此时,我们就希望能够将服务器A的IP地址映射到服务器B上使用。而这个映射IP地址的过程就需要使用隧道。
我们假设将服务器A上的多余IP地址映射到服务器B上。这里假设服务器A的多余IP地址为88.88.88.88,服务器B的IP地址为99.99.99.99. 下面我们开始详细教学。
本文作者为香菇肥牛,原文链接为https://qing.su/article/create-gre-tunnel-for-ipv4-mapping.html,转载需注明原文链接。谢谢大家的支持!
1, 绑定IP地址
一般来说,服务器A上只绑定了一个主IP地址;其他的分配的IP地址需要手动绑定到服务器上。当然,部分主机商提供了自动绑定IP的功能,然而大部分是没有提供这个功能的。
以Ubuntu 20.04为例,想要在服务器A上绑定多个IP地址,首先执行
1 | ifconfig |
查询网卡名称和MAC地址。我这里网卡名称是eno3, MAC地址假设为00:00:00:00:00:00
编辑文件/etc/netplan/50-cloud-init.yaml,添加下面这一段:
1 2 3 4 5 6 7 8 9 10 | network: version: 2 ethernets: eno3: dhcp4: true match: macaddress: 00:00:00:00:00:00 set-name: eno3 addresses: - 88.88.88.88/32 |
如果主机商给你分配了多个IP地址,需要逐条在addresses栏中列出。
保存退出后,启用并保存网卡设置:
1 2 | netplan try netplan apply |
这样就在服务器上绑定好了IP地址。此时,如果你使用SSH登录IP为88.88.88.88的服务器,你应该能登录到服务器A上。
如果您的服务器不是Ubuntu 20.04, 那么可以参考这里绑定您的IP地址。https://docs.ovh.com/gb/en/dedicated/network-ipaliasing/
2, 开启GRE模块与其他前期准备
分别在A, B两台服务器上执行
1 2 | modprobe ip_gre lsmod | grep gre |
如果能看到类似ip_gre或者gre这样的模块,说明GRE模块是开启的。有部分老版本的内核不支持GRE,以及部分老的OpenVZ 6的VPS也不支持;大部分情况都应该是支持的。
然后,需要在服务器A上开启IP转发功能。
1 2 | echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf sysctl -p |
如果您使用的是CentOS或者其他基于RHEL的Linux发行版,您可能需要禁用Selinux. 如果您的服务器上安装了防火墙,您可能需要设定相关规则,或者禁用防火墙。
我们还需要使用路由表。如果您的服务器上没有安装iptables与iproute2,需要在两台服务器上使用apt或者yum安装相关的程序。
1 | apt-get install -y iptables iproute2 |
至此,前期准备完毕,开始构建GRE隧道。
3, 搭建GRE隧道
首先,在服务器A(提供多余IP的服务器)上,执行:
1 2 3 | ip tunnel add qingsu mode gre local 88.88.88.88 remote 99.99.99.99 ttl 255 ip addr add 10.0.0.1/30 dev qingsu ip link set qingsu up |
这里qingsu是隧道的网络名称,可以任意替换为你想设定的名称。如果你有多个IP地址需要映射,这里需要对每个IP分别设置。
然后同样地,在服务器B(接受IP映射的服务器)上,执行:
1 2 3 | ip tunnel add qingsu mode gre local 99.99.99.99 remote 88.88.88.88 ttl 255 ip addr add 10.0.0.2/30 dev qingsu ip link set qingsu up |
可以看到,我们搭建了名为qingsu的GRE隧道,并且将服务器A和B构建成了一个虚拟局域网,服务器A的局域网内地址为10.0.0.1,服务器B的局域网内地址为10.0.0.2. 如果一切无误,此时GRE隧道应该已经通了。
此时,在服务器A上ping 10.0.0.2,或者在服务器B上ping 10.0.0.1,应该都可以ping通了。
4, 设置路由表、数据与端口转发
首先,需要在服务器B上设置路由路径,保证经由GRE隧道传输的数据的正常通行。
1 2 3 | echo '100 GRE' >> /etc/iproute2/rt_tables ip rule add from 10.0.0.0/30 table GRE ip route add default via 10.0.0.1 table GRE |
然后,需要在服务器A上设置并允许通向服务器B的数据传输。
1 2 3 | iptables -t nat -A POSTROUTING -s 10.0.0.0/30 ! -o gre+ -j SNAT --to-source 88.88.88.88 iptables -A FORWARD -d 10.0.0.2 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s 10.0.0.2 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT |
最后,在服务器A上设置端口转发。
1 2 | iptables -t nat -A PREROUTING -d 88.88.88.88 -p TCP -m TCP -j DNAT --to-destination 10.0.0.2 iptables -t nat -A PREROUTING -d 88.88.88.88 -p UDP -m UDP -j DNAT --to-destination 10.0.0.2 |
至此,GRE隧道全部搭建完毕。此时,如果你再使用SSH登录IP为88.88.88.88的服务器,你应该能登录到服务器B上。后续在服务器B上,就可以使用这个新的IP地址建立网站、建立虚拟机了。需要注意的是,从第2节开始的上述网络设置在重启之后会失效,因此需要将这些命令放进系统的启动文件中,跟随系统的启动自动运行。
综上,在这篇文章中我们在两台服务器间搭建了GRE隧道,并且通过路由表设置了数据与端口的转发,实现了将IPv4从一台服务器上映射到另一台服务器上。如果您有任何疑问,欢迎在这里留言,我将尽力解答。本文作者为香菇肥牛,原文链接为https://qing.su/article/create-gre-tunnel-for-ipv4-mapping.html,转载需注明原文链接。谢谢大家的支持!
参考文献:
- https://www.karlrupp.net/en/computer/nat_tutorial
- https://www.xmodulo.com/create-gre-tunnel-linux.html
- https://community.hetzner.com/tutorials/linux-setup-gre-tunnel
好教程
大佬了不起,存一下以后或许会用到
感觉还是wg配置起来比gre好使些。
惊现K总 (抱大腿)
留个记号 以后说不定用得着