비슷한 질문이 연결되어 있습니다.서버 장애, 그러나 문제를 더 자세히 조사한 결과 문제의 범위가 Linux 라우팅 테이블 문제로 좁혀진 것 같습니다.
배경:
AWS는 GENEVE를 사용하여 패킷을 캡슐화하고 이를 지정된 대상 그룹에 전달하는 게이트웨이 로드 밸런서를 출시합니다. 내 목표는 Squid를 실행하는 EC2 인스턴스가 도메인 필터링을 위한 투명한 프록시 역할을 하도록 하는 것입니다. AWS 라우팅 및 GLB가 실행 중이고 패킷이 EC2 인스턴스로 전달되고 있지만 패킷 전달 동작이 작동하도록 할 수 없습니다.
노력:
캡슐화 해제 후 EC2 인스턴스는 라우팅 테이블을 조사하고(ipv4 전달을 활성화한 후) 기본 경로인 eth0으로 트래픽을 전달해야 하기 때문입니다.
그러나 이 트래픽을 가로채야 하기 때문에 10.0.0.0/8에서 172.17.0.2(Docker 컨테이너의 IP)로 이동하는 트래픽에 대한 다음 홉을 설정하려고 합니다. Docker 컨테이너는 tcp/80, tcp/443 및 tcp/3128뿐만 아니라 매핑 3128->3128, 80->3129 및 443->3130을 노출합니다. 통과한다고 가정하면 트래픽은 컨테이너 밖으로 흘러나와 네트워크의 기본 게이트웨이(172.17.0.1/16)에 도달합니다. 그런 다음 로컬 라우팅 테이블을 따라 EC2 인스턴스의 게이트웨이(10.160.221.97)에 도달해야 합니다.
약간...복잡하지만 아이디어는 ec2 인스턴스가 트래픽을 수신하고 필터링하는 데 자급자족하도록 만드는 것입니다. 상태 추적은 필요하지 않습니다. 단지 나쁜 곳으로부터의 아웃바운드 트래픽을 차단하고 싶을 뿐입니다(허용된 URL 목록에는 포르노가 없습니다!).
그래서 지금까지 내가 한 일은 다음과 같습니다.
GLBe의 원격 유니캐스트 주소를 사용하여 GENEVE 인터페이스를 생성합니다.
#enable geneve tunnel
sudo ip link add name geneve0 type geneve id 1000 remote 10.160.221.119
sudo ip link set geneve0 up
IP 전달 활성화:
#set forwarding
sudo sysctl -w net.ipv4.ip_forward=1
사용자 정의 라우팅 테이블을 생성합니다:
#create custom route table with ID 200
sudo echo "200 custom" >> /etc/iproute2/rt_tables
따라서 다음과 같아야 합니다.
cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
200 custom
사용자 정의 라우팅 테이블을 사용하기 위해 트래픽이 10/8에서 오는지 여부를 나타내는 규칙을 사용자 정의 라우팅 테이블에 추가했습니다.
sudo ip rule add from 10.0.0.0/8 lookup custom
내 노트북(172.16 네트워크에 있음)이 액세스 권한을 잃지 않도록 하려면:
sudo ip route add 172.16.0.0/12 dev eth0 via 10.160.221.97
(그리고 내가 이것을 게시하고 있기 때문에 그것이 작동하지 않는다는 것을 분명히 알 수 있습니다)
따라서 내 기본 라우팅 테이블은 다음과 같습니다.
ip route list
default via 10.160.221.97 dev eth0
10.160.221.96/27 dev eth0 proto kernel scope link src 10.160.221.105
169.254.169.254 dev eth0
172.16.0.0/12 via 10.160.221.97 dev eth0
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
인터페이스, GENEVE 캡슐화로 트래픽이 들어오고 모든 것이 정상입니다. 문제가 있는 부분은 EC2 인스턴스의 라우팅입니다.
사용자 정의 테이블에 대한 기본 경로를 추가하면 액세스할 수 없게 됩니다.
sudo ip route add default via 172.17.0.2 dev docker0 table custom
그렇다면 제가 놓치고 있는 부분에 대한 도움이나 통찰력이 있습니까?
편집 - 추가 업데이트:
명령을 변경하면 차이가 없습니다.
[ec2-user@proxy-10-160-221-105 ~]$ sudo ip route add default via 172.17.0.2 dev eth0 table custom
Error: Nexthop has invalid gateway.
[ec2-user@proxy-10-160-221-105 ~]$ sudo ip route add default via 172.17.0.2 table custom
답변1
나는 이것이 라우팅 문제라고 생각하지 않습니다. 추가 라우팅 문이 필요하지 않습니다. iptables를 사용하면 좋은 상태가 될 것입니다.
Docker 호스트 역할을 하는 EC2 인스턴스에서 라우팅을 활성화합니다.
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
모든 HTTP 트래픽(TCP 80)을 TCP 3129에서 수신하는 Docker 컨테이너로 리디렉션
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 172.17.0.2:3129
모든 HTTPS 트래픽(TCP 443)을 TCP 3130에서 수신 대기하는 Docker 컨테이너로 리디렉션
sudo iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination 172.17.0.2:3130
NAT 활성화(Masqurade라고도 함)
sudo iptables -t nat -A POSTROUTING -j MASQUERADE