Cấu hình GRE và IPIP Tunnel trên Linux: Kết nối Site-to-Site gọn nhẹ không cần VPN

Network tutorial - IT technology blog
Network tutorial - IT technology blog

Kết nối Site-to-Site nhanh mà không cần VPN phức tạp

Bạn cần kết nối server tại datacenter với máy chủ ở văn phòng để đồng bộ database hoặc truyền file nội bộ? Thay vì cài đặt những hệ thống nặng nề như OpenVPN, GRE (Generic Routing Encapsulation) và IPIP (IP-over-IP) là những phương án “nhanh-gọn-nhẹ” hơn nhiều.

Cả hai giao thức này đều hoạt động trực tiếp ở mức kernel Linux. Nhờ đó, tốc độ xử lý gói tin rất nhanh và ít tiêu tốn tài nguyên CPU. Mình thường ví chúng như những đường ống dẫn dữ liệu riêng (private pipe) xuyên qua môi trường Internet công cộng.

Thiết lập GRE Tunnel trong 5 phút

Hãy bắt đầu với một ví dụ thực tế. Giả sử bạn có hai node cần thông nhau:

  • Server A (Hà Nội): IP Public 1.1.1.1, IP Tunnel sẽ đặt là 10.0.0.1
  • Server B (Sài Gòn): IP Public 2.2.2.2, IP Tunnel sẽ đặt là 10.0.0.2

Cấu hình trên Server A:

# Tạo interface tunnel đặt tên là gre0
sudo ip tunnel add gre0 mode gre remote 2.2.2.2 local 1.1.1.1 ttl 255
# Gán IP nội bộ
sudo ip addr add 10.0.0.1/30 dev gre0
# Bật interface
sudo ip link set gre0 up

Cấu hình trên Server B:

sudo ip tunnel add gre0 mode gre remote 1.1.1.1 local 2.2.2.2 ttl 255
sudo ip addr add 10.0.0.2/30 dev gre0
sudo ip link set gre0 up

Sau khi chạy xong, hãy thử ping 10.0.0.2 từ Server A. Nếu độ trễ ổn định và không rớt gói, đường ống của bạn đã sẵn sàng.

GRE hay IPIP: Đâu là lựa chọn tối ưu?

Điểm khác biệt giữa hai giao thức này nằm ở khả năng đóng gói và hiệu suất:

  • GRE: Linh hoạt hơn hẳn. Nó đóng gói được hầu hết các giao thức lớp 3, kể cả IPv6 hay Multicast. Nếu bạn định chạy OSPF để tự động cập nhật route giữa hai đầu, GRE là lựa chọn bắt buộc.
  • IPIP: Tối giản và nhẹ đầu. Nó chỉ bọc IPv4 trong IPv4. Lợi thế lớn nhất là overhead thấp. IPIP chỉ tốn 20 bytes cho header, trong khi GRE tốn 24 bytes. Với những kết nối thuần IPv4 và cần vắt kiệt băng thông, IPIP sẽ nhỉnh hơn một chút.

Để đổi sang IPIP, bạn chỉ cần thay mode gre thành mode ipip trong các lệnh trên.

Định tuyến để thông hai dải mạng LAN

Mục tiêu cuối cùng là để máy trạm ở LAN A (192.168.1.0/24) thấy máy trạm ở LAN B (192.168.2.0/24).

Tại Server A: sudo ip route add 192.168.2.0/24 dev gre0

Tại Server B: sudo ip route add 192.168.1.0/24 dev gre0

Đặc biệt lưu ý, bạn phải bật IP Forwarding. Nếu không, server sẽ nhận gói tin nhưng không chuyển tiếp đi đâu cả:

sudo sysctl -w net.ipv4.ip_forward=1

Kinh nghiệm thực chiến: Bài toán MTU gây đau đầu

Có lần mình setup tunnel xong, ping rất mượt, SSH vào gõ lệnh vẫn ổn. Tuy nhiên, cứ hễ tải file nặng hoặc mở trang web quản trị là kết nối bị treo cứng.

Sau khi dùng tcpdump kiểm tra, mình phát hiện ra gói tin bị drop do quá kích thước. Gói tin chuẩn là 1500 bytes. Khi cộng thêm 24 bytes header của GRE, nó trở thành 1524 bytes và bị các router trung gian trên Internet từ chối.

Cách khắc phục triệt để: Hạ MTU xuống 1400 và dùng MSS Clamping.

# Hạ MTU để chừa chỗ cho header
sudo ip link set dev gre0 mtu 1400

# Ép các kết nối TCP tự điều chỉnh kích thước (MSS Clamping)
sudo iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Lệnh TCPMSS phía trên cực kỳ quan trọng. Nó giúp tránh tình trạng phân mảnh gói tin (fragmentation), vốn là nguyên nhân chính gây lag và giảm tốc độ truyền tải.

Lưu cấu hình vĩnh viễn với Netplan

Các lệnh ip tunnel sẽ biến mất khi bạn reboot. Trên Ubuntu/Debian, hãy khai báo vào file /etc/netplan/01-netcfg.yaml để hệ thống tự nhận khi khởi động:

tunnels:
  gre0:
    mode: gre
    local: 1.1.1.1
    remote: 2.2.2.2
    addresses:
      - 10.0.0.1/30
    routes:
      - to: 192.168.2.0/24
        via: 10.0.0.2

Lưu ý về bảo mật

GRE và IPIP mặc định không mã hóa. Dữ liệu của bạn đi trên Internet dưới dạng plain text. Nếu truyền thông tin nhạy cảm, bạn nên bọc Tunnel này bên trong IPsec.

Ít nhất, hãy dùng iptables để chặn các IP lạ cố tình kết nối vào cổng GRE của bạn:

sudo iptables -A INPUT -p gre -s 2.2.2.2 -j ACCEPT
sudo iptables -A INPUT -p gre -j DROP

Tóm tắt nhanh

  1. Dùng GRE cho mạng có định tuyến động, IPIP nếu muốn tiết kiệm băng thông.
  2. Luôn set MTU 1400 để đảm bảo gói tin không bị drop dọc đường.
  3. TCP MSS Clamping là cứu cánh cho các ứng dụng Web/Database chạy qua tunnel.
  4. Nhớ giới hạn Firewall để tránh bị tấn công từ bên ngoài.

Việc dựng tunnel chỉ mất vài phút, nhưng tối ưu nó để chạy ổn định dưới tải cao mới là thử thách. Hy vọng những chia sẻ này giúp bạn tránh được những lỗi “ngớ ngẩn” về MTU mà mình từng gặp phải.

Share: