예를 들어 아웃바운드 웹 서버 123.123.123.123:80에 연결된 1개의 물리적 인터페이스가 있는 Linux 시스템에 php/bash 애플리케이션이 있습니다. 저는 여러 openvpn 제공업체를 통해 이 작업을 수행합니다. tun 및 tap 공급자가 있지만 내가 가장 좋아하는 공급자는 tun을 사용합니다.
사실 나는 다음과 같은 일을 완벽하게 할 수 있습니다.
- VPN 열기
sudo route add 123.123.123.123 tun0
- 123.123.123.123:80으로 트래픽 보내기
- VPN 끄기
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