포트를 기반으로 특정 인터페이스에서 라우팅

포트를 기반으로 특정 인터페이스에서 라우팅

예를 들어 아웃바운드 웹 서버 123.123.123.123:80에 연결된 1개의 물리적 인터페이스가 있는 Linux 시스템에 php/bash 애플리케이션이 있습니다. 저는 여러 openvpn 제공업체를 통해 이 작업을 수행합니다. tun 및 tap 공급자가 있지만 내가 가장 좋아하는 공급자는 tun을 사용합니다.

사실 나는 다음과 같은 일을 완벽하게 할 수 있습니다.

  1. VPN 열기
  2. sudo route add 123.123.123.123 tun0
  3. 123.123.123.123:80으로 트래픽 보내기
  4. VPN 끄기
  5. sudo route del 123.123.123.123

.ovpn 구성 파일에서 "route-nopull" 옵션을 사용하여 Linux 시스템에 대한 액세스를 유지하고 동시 openvpn 연결을 허용합니다.

이제 항상 아웃바운드 웹 서버 123.123.123.123:80에 대해 여러 개의 독립적인 요청을 열어야 합니다. 하지만 실제 프로세스는 직렬이므로 두 번째 연결을 시도하기 전에 첫 번째 연결이 닫히고 자체적으로 지워질 때까지 기다려야 합니다.

나는 "가짜 포트"를 통해 그것을 달성할 수 있다고 확신합니다. 예를 들어:

  • 인터페이스 tun0, tun1, tun2
  • 가짜 포트 9000, 9001, 9002
  • 다중 라우팅 테이블 rt0, rt1, rt2

따라서 개념적으로는 다음과 같습니다.

  • 123.123.123.123:9000 -> rt0으로 표시(tun0이 기본 게이트웨이) -> 123.123.123.123:80으로 다시 작성 -> rt0
  • 123.123.123.123:9001 -> rt1로 표시(tun1이 기본 게이트웨이) -> 123.123.123.123:80으로 다시 작성 -> rt1
  • 123.123.123.123:9002 -> rt2로 표시(tun2가 기본 게이트웨이) -> 123.123.123.123:80으로 다시 작성 -> rt2

저는 iptables에 대한 기술이 거의 없기 때문에 개념에 대해서만 말할 수 있습니다. 결과를 달성하기 위한 다른 접근 방식이 있다면 환영합니다. 읽고 도와주셔서 감사합니다.

답변1

나는 그것을 여기에서 해결하고 문서화했습니다. http://aftermanict.blogspot.it/2015/11/bash-iptables-iproute2-and-multiple.html

이렇게 하면 커널 경로 패킷이 영구적으로 생성되어 머신에서 시연되지 않은 네트워크에 대해서도 여러 경로가 가능해집니다.

nano /etc/sysctl.conf

net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
net.ipv4.ip_forward = 1

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 >| $f ; done

그러면 트래픽을 표시하는 데 필요한 iptables, 특히 mangle 및 nat가 초기화됩니다.

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

대체 경로 편집 추가:

nano /etc/iproute2/rt_tables

추가(이름은 참조):

1 tunnel0
2 tunnel1

경로와 규칙을 추가하기 위해 보다 직접적인 이름 대신 테이블 ID를 사용합니다. 아시다시피 게이트웨이는 특히 동적 게이트웨이가 있을 수 있는 터널의 경우 관련이 없습니다.

ip route add 0.0.0.0/0 dev tun0 table 1
ip route add 0.0.0.0/0 dev tun1 table 2

트래픽을 표시하고 해당 테이블에 바인딩하는 규칙을 추가합니다.

ip rule add from all fwmark 1 table 1
ip rule add from all fwmark 2 table 2
ip route flush cache

마음에 드는지 확인하세요.

ip route show table 1
ip route show table 2
ip rule show

놓친 내용이 있는 경우 다음 방법으로 삭제할 수 있습니다.

ip rule del table 1
ip route flush table 1

이제 누락된 부분이 있습니다. 작동하지 않습니다.

iptables -A PREROUTING -t mangle -p tcp --dport 80 -j MARK --set-mark 1

이는 다음을 수행합니다.

iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables-save

트래픽을 선택하고 동시에 장치/터널에 푸시해야 합니까? 문제 없습니다. 이 문제도 해결했습니다.

iptables -A OUTPUT -t mangle -p tcp --dport 10001 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -p tcp --dport 10002 -j MARK --set-mark 2
iptables -t nat -A OUTPUT -p tcp --dport 10001 -j DNAT --to :80
iptables -t nat -A OUTPUT -p tcp --dport 10002 -j DNAT --to :80

응답할 때 NAT를 사용해야 합니다.

iptables -t nat -A POSTROUTING -o $DEV1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $DEV2 -j MASQUERADE

iptables-save

관련 정보