Linux的gre隧道

gre隧道是啥我就不解释了, 懂的人自然懂..不懂的谷歌一下吧

我比较偏向用Centos来做服务器, 至于Ubuntu什么的都差不多.

假设有两台Server

Server A:
公网IP: 1.1.1.1

Server B:
公网IP: 2.2.2.2

现在需要在A和B之间建立gre隧道. 方法很简单.

在Server A上编辑

/etc/sysconfig/network-scripts/ifcfg-gre1

DEVICE=gre1
ONBOOT=yes
TYPE=GRE
BOOTPROTO=none
PEER_OUTER_IPADDR=2.2.2.2
PEER_INNER_IPADDR=10.0.0.2
MY_OUTER_IPADDR=1.1.1.1
MY_INNER_IPADDR=10.0.0.1

其中ifcfg-gre1本质上名字是不受限制的
DEVICE则指定这个设备的名字
PEER_OUTER_IPADDR指定了Server B的IP
而PEER_INNER_IPADDR则指定了Server B在这个隧道中的内部IP.
同理MY_也是一样的.
MY_OUTER_IPADDR不写也可以, 不过最好写上, 如果写上无法建立的话, 就去掉吧.

同理在Server B上也编辑

/etc/sysconfig/network-scripts/ifcfg-gre1

DEVICE=gre1
ONBOOT=yes
TYPE=GRE
BOOTPROTO=none
PEER_OUTER_IPADDR=1.1.1.1
PEER_INNER_IPADDR=10.0.0.1
MY_OUTER_IPADDR=2.2.2.2
MY_INNER_IPADDR=10.0.0.2

区别在于PEER_和MY_的对调

在两个Server上都编辑好之后, 在两个Server上都运行

ifup gre1

然后在任意Server上执行

ip addr

来查看一下, 当你看到类似如下内容的时候, 说明已经成功一半了

6: gre2@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN qlen 1
 link/gre 1.1.1.1 peer 2.2.2.2
 inet 10.0.0.1 peer 10.0.0.2/32 scope global gre2
 valid_lft forever preferred_lft forever

此时在Server A上尝试ping Server B的INNER地址

ping 10.0.0.2

同时也可以在Server B上ping 10.0.0.1

能ping通说明gre隧道建立成功了.

如果ping不通首先检查防火墙是否开启, 用firewall-cmd的执行

firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p gre -j ACCEPT
firewall-cmd --reload

或者用iptables的执行

iptables -I INPUT -p gre -j ACCEPT

应用

隧道建立起来了, 但是有啥用呢?

假设这里有一台Server C, 出于种种原因, C只能由B访问, A是访问不到C的, 但是A确实有访问C的需求.

那么在Server B上编辑

/etc/sysctl.conf

net.ipv4.ip_forward = 1

然后sysctl -p

之后用firewall-cmd的执行

firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -o enp0s3 -j MASQUERADE
firewall-cmd --reload

用iptables的执行

iptables -t nat -I POSTROUTING -o enp0s3 -j MASQUERADE

其中enp0s3换成自己B服务器公网IP的网卡名称

接下来添加路由表, 让A访问C的数据包由gre隧道出去, 假设C的IP是3.3.3.3

ip route add 3.3.3.3 dev gre1

在A上尝试ping 3.3.3.3成功就可以了.

关于 “Linux的gre隧道” 的 1 个意见

发表评论

电子邮件地址不会被公开。 必填项已用*标注