답변:
어떤 패킷이 어디로 갈지 결정하려는 방법에 따라 몇 가지 가능성이 있습니다. 그들 대부분은 리눅스에서 TCP / IP 네트워킹이 어떻게 작동하는지 이해해야합니다. 복잡한 작업을 수행하기 위해 알아야 할 주요 도구는 iptables
(Ubuntu : iptables ) 및 iproute2 ( ip
명령) (Ubuntu : iproute , iproute-doc )입니다.
대상 IP 주소로 완전히 식별 할 수 있으면 간단합니다. 원하는대로 IP 주소를 라우팅하십시오. 예를 들어 다음 명령은 1.2.3의 모든 패킷을 발생시킵니다. x 와 1.2.4.2는 통과 ppp0
하고 다른 패킷은 통과 eth0
합니다.
route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0
보다 복잡한 요구 사항을 위해서는 iptables
and 를 사용해야합니다 ip route
. 예를 들어, 다음 명령은 1로 표시된 모든 패킷이 통과 eth0
하고 2로 표시된 모든 패킷이 통과하도록 특수 라우팅 테이블을 설정합니다 ppp0
( localhost
루프백 인터페이스 에 고정 된 패킷 제외 ).
ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0
이제 iptables
발신 패킷을 "혼합"하여 사용할 경로를 결정하는 마크를 추가 할 수 있습니다. 예를 들어,를 통해 모든 발신 SMTP 트래픽 (포트 25)을 보내는 방법 eth0
과 proxy
를 통해 사용자로 실행되는 응용 프로그램에서 발생한 모든 트래픽 을 보내는 방법은 다음 과 같습니다 ppp0
.
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2
인터넷에 연결된 2 개의 네트워크 인터페이스를 참조하십시오 . 도메인 이름에 따라 사용할 수있는 하나를 선택 하고 다른 네트워크 인터페이스에 바인드 소프트웨어를 .
두 인터페이스가 모두 연결될 때 이러한 명령이 실행되도록 정렬해야합니다. /etc/network/if-up.d/0justin-routes
원하는 명령을 실행 하는 스크립트를 작성하는 것이 좋습니다 . 이 스크립트는 네트워크 인터페이스가 나타날 때마다 실행됩니다. 이름이로 시작하면 0
해당 프로세스의 초기 단계에서 경로가 설정 될 것으로 예상되는 응용 프로그램 별 설정 전에 실행됩니다. /etc/network/if-down.d/
인터페이스 중 하나가 다운 될 때 작업을 수행하려는 경우에도 대칭 이 있습니다. (관련된 모든 경로는 자동으로 지워 지므로 다른 인터페이스로 되돌아 가기를 원할 때 일부 패킷이 꼬일 수 있습니다.)
ifup 스크립트는에 설명되어 있습니다 interfaces(5) man page
. 알아야 할 주요 사항은 가져 오거나 내린 인터페이스의 이름이 환경 변수에 있다는 것 IFACE
입니다. 다른 인터페이스가 이미 사용 중인지 확인할 수 있습니다 if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then …
.
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_ip
여기서 ppp_ip
해당 어댑터의 IP 주소입니다. 둘째, 당신은 엄격한 해제해야합니다 rp_filter
에서 /proc/sys/net/ipv4/config/ppp0/rp_filter
. 이완 모드 (2)로 설정하면 작동합니다.