우선 이전의 모든 답변에 감사드립니다. 나는 그들 없이는 거기에 갈 수 없었습니다. Stackexchange 커뮤니티(iptables 등 포함)에서 많은 것을 배웠습니다.
그럼에도 불구하고. 제가 작업하는 설정은 다음과 같습니다:
- Kubernetes를 실행하는 노트북(Calico CNI 사용)(안타깝게도 비공개 IP 뒤에 있음)(노트북)
- 클러스터(VM)의 TCP 프록시 역할을 하는 Digital Ocean에서 실행되는 VM
공용 IP 부족을 해결하기 위해 사용자 지정 라우팅/iptables 설정과 함께 OpenVPN을 사용하여 라우팅을 시도했습니다.
- 포트 443, 6443 및 80에서만 OpenVPN을 통해 LAPTOP(tun0을 통해)로 인터넷에서 VM(enp8s0을 통해)으로의 트래픽
- 가상 머신을 통해 노트북에서 인터넷으로의 트래픽은 포트 443 및 80에서만 발생합니다.
첫 번째 부분은 서버 시작 시 실행되는 다음 스크립트와 완벽하게 작동합니다.
#!/bin/bash
set -e
sysctl -w net.ipv4.conf.tun0.rp_filter=2;
ip rule add fwmark 2 table 3
ip route add default via 10.8.0.2 table 3
ip route flush cache
iptables -t mangle -A OUTPUT -p tcp -s 10.8.0.1 -m multiport --dports 6443,443,80 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source 10.8.0.2
10.8.0.1
6443,443,80개 이상의 모든 트래픽은 태그가 지정되고 기본 규칙 10.8.0.2를 통해 테이블 2
로 이동됩니다 .3
두 번째 요점은 나에게 문제가 됩니다. 아무리 노력해도(자세한 내용은 아래 참조) 제대로 작동하지 않습니다.
방법:
- PREROUTING을 사용하여 인터페이스를 통해 트래픽을 추출하도록 확장 스크립트를 구성합니다.
#!/bin/bash
set -e
sleep 20
sysctl -w net.ipv4.conf.tun0.rp_filter=2;
ip rule add fwmark 2 table 3
ip route add default via 10.8.0.2 table 3
ip rule add fwmark 4 table 5 # adding rule/route association
ip route add default via 10.8.0.1 table 5 # adding default via for table
ip route flush cache
iptables -t mangle -A OUTPUT -p tcp -s 10.8.0.1 -m multiport --dports 6443,443,80 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source 10.8.0.2
iptables -A PREROUTING -i enp8s0 -t mangle -p tcp -m multiport --dports 443,80 -j MARK --set-mark 4 # mark ports during PREROUTING
나는 이것이 약간 순진한 접근 방식일 수 있다는 것을 읽었습니다(일부 시스템은 첫 번째 부분이 작동하지 않고 양방향 통신을 놓칠 수 있기 때문에). 그러나 이것이 내 특정 시나리오에 작동한다면 괜찮습니다.
- 연결 마커를 사용하여 스크립트를 확장합니다. 따라서 통신이 역전되더라도 다른 인터페이스를 거치지 않습니다.
#!/bin/bash
set -e
sleep 20
sysctl -w net.ipv4.conf.tun0.rp_filter=2;
ip rule add fwmark 2 table 3
ip route add default via 10.8.0.2 table 3
ip rule add fwmark 4 table 5 # adding rule/route association
ip route add default via 10.8.0.1 table 5 # adding default via for table
ip route flush cache
iptables -t mangle -A OUTPUT -p tcp -s 10.8.0.1 -m multiport --dports 6443,443,80 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source 10.8.0.2
# adding whole connection marking below
iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 443,80 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -m connmark --mark 4 -j CONNMARK --restore-mark
iptables -t mangle -A POSTROUTING -m mark --mark 4 -j CONNMARK --save-mark
문제는 여기에 예상되는 두 번째 메커니즘을 추가하려고 할 때마다 여전히 curl https://ifconfig.me
잘못된 공용 IP(enp8s0과 연결된 IP)가 반환된다는 것입니다.
이 문제를 해결하기 위한 몇 가지 제안을 해주실 수 있나요? 내가 거기에서 무엇을 놓치고 있습니까?
명심해야 할 또 다른 점은 CALICO도 iptables를 사용하여 mambo-jambo를 수행하고 있다는 것입니다. 포트 80 및 443에서 내부 클러스터 내 통신을 방해하고 싶지 않습니다. 예를 들어 cert-manager
CRD를 확인하는 데 사용되는 승인 컨트롤러는 포트 443에서 수신 대기하고 조사 중에(첫 번째 지점에 대해) 첫 번째 지점에서 통신을 중단했습니다.