VPN을 통해 두 개의 서버를 연결했습니다. 서버 A는 모든 컨테이너를 호스팅하고 서버 B는 단순한 라우터입니다. SSH를 통해 두 서버에 연결해야 하므로 서버 A가 호스팅하는 컨테이너에서 내보낸 패키지를 제외하고 ppp0(서버 A) 및 eth0(서버 B)에 대한 기본 경로를 변경하면 안 됩니다. 이러한 컨테이너는 모든 트래픽을 서버 B로 보내야 합니다.
Server A Server B
------------------------------------------------------------------------------------------- ---------------------------------------------
internet ---- ppp0 (a.b.c.d/32) eth0 (e.f.g.h/32) ---- internet
vpn (172.16.0.1/16) ----------------------------------------------- vpn (172.16.0.2/16)
+---- vswitch (172.17.0.1/16)
|
| Container yp
+---- yp (slave of vswitch) ---- eth0 (172.17.0.3/16)
|
| Container boot
+---- boot (slave of vswitch) ---- eth0 (172.17.0.4/16)
ppp0은 VPN 연결이 아니라 로컬 ADSL 링크입니다. ppp0의 MTU는 1480입니다.
두 VPN 링크 모두 Wireshark를 기반으로 구축되었습니다. 둘 다의 MTU는 1420입니다.
서버 A 컨테이너의 트래픽에 태그를 지정하고 해당 트래픽을 서버 B/인터넷으로 라우팅하려고 합니다. 또한 서버 B의 향후 컨테이너가 존재할 것이기 때문에 양방향으로 만들려고 했습니다.
# iptables -t mangle -A PREROUTING -j MARK --set-mark 85 -i vswitch
# iptables -t mangle -A PREROUTING -j MARK --set-mark 95 -i vpn
# ip rule add fwmark 85 lookup 185
# ip rule add fwmark 95 lookup 195
# ip route add table 185 default via 172.16.0.1 dev vpn
# ip route add table 185 default via 172.16.0.1 dev vswitch
컨테이너 yp에 로그인하면 서버 B에 대해 ping을 시도합니다.
[root@yp ~]# ping 172.16.0.2
PING 172.16.0.2 (172.16.0.2) 56(84) bytes of data.
^C
--- 172.16.0.2 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1004ms
서버 A의 라우팅 테이블입니다.
# ip r show table all
default via 172.16.0.1 dev vpn table 185
default via 172.17.0.1 dev vswitch table 195
default dev ppp0 scope link
a.b.c.n dev ppp0 proto kernel scope link src a.b.c.d
local a.b.c.d dev ppp0 table local proto kernel scope host src a.b.c.d
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
broadcast 172.16.0.0 dev vpn table local proto kernel scope link src 172.16.0.1
local 172.16.0.1 dev vpn table local proto kernel scope host src 172.16.0.1
broadcast 172.16.255.255 dev vpn table local proto kernel scope link src 172.16.0.1
broadcast 172.17.0.0 dev vswitch table local proto kernel scope link src 172.17.0.1
local 172.17.0.1 dev vswitch table local proto kernel scope host src 172.17.0.1
broadcast 172.17.255.255 dev vswitch table local proto kernel scope link src 172.17.0.1
라우팅/마킹을 올바르게 하려면 무엇을 놓치고 있습니까?
답변1
귀하의 다이어그램을 올바르게 이해했는지 잘 모르겠습니다. 귀하가 원하는 것은 두 컨테이너의 패킷이 서버 B로 라우팅되도록 서버 A에 경로를 설정하는 것뿐입니다. 그렇죠?
어쨌든 일반적으로 iptables
라우팅을 사용하지 마십시오. (이것은 사람들이 항상 라우팅을 사용하려고 시도하는 이유 때문에 사소한 불만입니다 iptables
.) 정책 라우팅과 같은 다른 옵션이 있습니다.
따라서 귀하의 경우에는 다음과 같습니다.
ip route add table 250 172.16.0.1/16 dev vpn scope link
ip route add table 250 default via 172.16.0.2
ip rule add from 172.16.0.3 table 250
ip rule add from 172.16.0.4 table 250
(테스트되지 않음) 트릭을 수행해야 합니다. 정책 라우팅에 대한 온라인 자습서가 많이 있습니다.