package flow

netfilter filter 5 hook points
- NF_INET_PRE_ROUTING
- NF_INET_LOCAL_IN
- NF_INET_FORWARD
- NF_INET_LOCAL_OUT
- NF_INET_POST_ROUTING

怎么实现一个VPN程序
- 调用tun API,创建一个tun设备,设置IP、mask、MTU;
- 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` 相同的逻辑进行处理
- 其他实现细节
- packet传输,为了安全期间需要进行加解密;
- conn协议、UDP/TCP效果较好,websocket协议实践下来,延迟抖动很明显。
- VPN节点,需要实现路由管理
- 若节点由多个连接,需要parse packet,确定source、destination,然后根据路由表,选择不同的connection进行转发。
References