Skip to content

package flow

image-20251002164524984

netfilter filter 5 hook points

  1. NF_INET_PRE_ROUTING
  2. NF_INET_LOCAL_IN
  3. NF_INET_FORWARD
  4. NF_INET_LOCAL_OUT
  5. NF_INET_POST_ROUTING

image-20251002164910516

怎么实现一个VPN程序

  1. 调用tun API,创建一个tun设备,设置IP、mask、MTU;
  2. VPN节点之间,需要建立一个Conn对象
tun_fd: int
conn_fd: int


// thread 0 
while True:
  packet_ciphertext = read(conn_fd) // 从连接读取IP包
  packet_plaintext = decrypt(packet_ciphertext) // 解密
  wrute(tun_fd, packet_plaintext) // 转发IP包,由linux内核来处理路由

// thread 1
while True:
  packet_plaintext = read(tun_fd)
  packet_ciphertext = encrypt(packet_plaintext)
  write(conn_fd, packet_ciphertext) // 将IP包转发给peer connection,对方收到后会按以 `thread 0` 相同的逻辑进行处理



  1. 其他实现细节
  2. packet传输,为了安全期间需要进行加解密;
  3. conn协议、UDP/TCP效果较好,websocket协议实践下来,延迟抖动很明显。
  4. VPN节点,需要实现路由管理
    1. 若节点由多个连接,需要parse packet,确定source、destination,然后根据路由表,选择不同的connection进行转发。

References