容器流量重定向(2025版)

两年前写过一篇关于容器流量重定向的文章, 当时对网络了解还不是非常深刻, 加上当时podman使用的是cni插件式网络堆栈, 配置起来似乎较为复杂, Podman 4.0后已经使用netavark显得之前的配置已经有一些过时了.

Podman版本: 4.9.3

整体的目标还是一致的, 需要创建一个单独的Podman network, 挂在这个网络下的容器的出网流量默认都走到一个GRE隧道里.

先创建GRE隧道

1
2
3
4
sudo ip link add dev gre12 mtu 1380 type gre local <本地网卡地址> remote <远端网卡地址>
sudo ip addr add 10.66.4.2/30 dev gre12
sudo ip link set dev gre12 up
sudo iptables -t nat -A POSTROUTING -o gre12 -j MASQUERADE

在对端也要创建GRE隧道

1
2
3
4
5
6
7
sudo ip link add dev gre12 mtu 1380 type gre local <对端网卡地址> remote <本地网卡地址>
sudo ip addr add 10.66.4.1/30 dev gre12
sudo ip link set dev gre12 up

# 注意这里 eth0 要根据对端机器上出网网卡来决定
sudo iptables -t nat -A POSTROUTING -i gre12 -o eth0 -j MASQUERADE
sudo sysctl -w net.ipv4.ip_forward=1

然后创建容器网络

1
2
sudo podman network create --ip-range=10.89.0.0/24 overseas
sudo podman network update overseas --dns-add <目标网络DNS服务器>

配置网络转发规则

1
2
3
4
5
6
# 不是发往本地网络的, 一律添加fwmark并转发
sudo iptables -t mangle -A PREROUTING -s 10.89.0.0/24 ! -d 192.168.0.0/16 -j MARK --set-mark 0x2

# 添加标记的流量, 通过GRE隧道转发
sudo ip rule add fwmark 2 lookup 55
sudo ip route add default via 10.66.4.1 table 55