前言
眾所周知當服務器擁有多個IP,如果請求第三方API有限制IP(嚕羊毛),又希望每個容器能指定不同出口IP,這時候可以透過iptables將Docker橋接網路進行轉發。
設置
1. 新增docker network
經過這個步驟就能分配172.18.0.*網段給Docker使用
docker network create --subnet=172.18.0.0/24 --opt "com.docker.network.bridge.name"="docker1" docker1
2. 新增iptables規則轉發
透過將172.18.0.*轉發到公網IP,172.18.0.*就是後續設置容器IP。
iptables -t nat -I POSTROUTING -p all -s 172.18.0.10 -j SNAT --to-source 公網IP
3.測試容器
需要在原本docker run 指令中添加–network docker1 –ip=172.18.0.*,下面有使用範例,可以修改在自己應用。
docker run --rm --network docker1 --ip=172.18.0.10 curlimages/curl:7.83.1 -L -v https://www.cip.cc/
保存
由於重啟後iptables設置會重置,因此需要安裝iptables-persistent套件實現iptables持久化。
# 安裝iptables-persistent套件
sudo apt install iptables-persistent
iptables-persistent
套件在安裝跳出是否要儲存目前iptables和ipv6tables的畫面,選擇Yes才會執行保存動作。
安裝iptables-persistent,如果修改iptables或ipv6tables規則後想保存設置,這時候就需要下指令,讓iptables-persistent進行保存。
# 重新保存iptables規則
# sudo dpkg-reconfigure iptables-persistent
sudo iptables-save | sudo tee /etc/iptables/rules.v4
sudo ip6tables-save | sudo tee /etc/iptables/rules.v6