我目前有 2 台服务器:
服务器A:2.2.2.2
服务器 B:3.3.3.3
我想从服务器 A 到服务器 B 创建 GRE 隧道。
我在服务器 A 上启用了 ipforwarding:
cat /proc/sys/net/ipv4/ip_forward
1
在服务器 AI 上使用以下方法设置隧道:
sudo iptunnel add gre2 mode gre local 2.2.2.2 remote 3.3.3.3 ttl 255
sudo ip addr add 192.168.168.1/30 dev gre2
sudo ip link set gre2 up
在服务器上 BI 使用了以下命令:
sudo iptunnel add gre2 mode gre local 3.3.3.3 remote 2.2.2.2 ttl 255
sudo ip addr add 192.168.168.2/30 dev gre2
sudo ip link set gre2 up
sudo echo '200 GRE2' >> /etc/iproute2/rt_tables
sudo ip rule add from 192.168.168.0/30 table GRE2
sudo ip route add default via 192.168.168.1 table GRE2
我能够使用 GRE 隧道从两台服务器进行 ping 操作
ping 192.168.168.2 (on server A)
ping 192.168.168.1 (on server B)
在服务器 AI 上添加以下 ip-table 规则
sudo iptables -t nat -A POSTROUTING -s 192.168.168.0/30 ! -o gre+ -j SNAT --to-source 2.2.2.2
sudo iptables -t nat -A PREROUTING -d 2.2.2.2 -j DNAT --to-destination 192.168.168.2
sudo iptables -A FORWARD -d 192.168.168.2 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
此时我无法从本地计算机 ping 服务器 A (2.2.2.2),如果我删除以下 3 条 iptable 规则,我便能够再次 ping 服务器 A。尽管如果我连接到服务器 AI,仍然可以 ping 192.168.168.2。
我曾尝试使用 ipip 代替 gre,实际上是用 ipip 替换 gre 模式,但我遇到了与 iptable 规则相同的问题。
我已经与服务器 B(3.3.3.3)建立了 GRE 隧道,使用子网 10.0.0.0,rt 表值为 100 而不是 200。我不认为这会导致问题,因为我使用的是不同的子网和 gre 名称。
服务器 B 上的两个隧道的反向路径过滤也已禁用
cat /proc/sys/net/ipv4/conf/gre2/rp_filter
0
cat /proc/sys/net/ipv4/conf/gre1/rp_filter
0
这里是否有我遗漏的配置步骤?我不确定为什么这些 iptable 规则会导致外部数据包丢失,因为我已经在之前的隧道设置中使用了这些规则。