프로세스를 기반으로 IP 트래픽을 다른 기본 경로/인터페이스로 라우팅

프로세스를 기반으로 IP 트래픽을 다른 기본 경로/인터페이스로 라우팅

다른 모든 패킷은 다른 인터페이스를 통해 라우팅되는 동안 특정 인터페이스를 통해 프로세스 또는 프로세스 그룹의 IP 패킷을 선택적으로 라우팅할 수 있는지 확인하려고 합니다. 즉, 다른 모든 패킷이 통과하는 동안 의 모든 트래픽이 /usr/bin/testapp라우팅되기를 원합니다 . 이 경우 패킷은 TCP, UDP, ICMP 등이 될 수 있으며 최종 사용자가 다양한 포트를 사용하도록 구성할 수 있습니다.eth1eth0

문제의 프로세스를 특정 인터페이스에 쉽게 바인딩할 수 없기 때문에 라우팅을 통해 동일한 결과를 얻으려고 합니다. 이것이 가능한가?

--- 편집하다 ---

여기와 다른 많은 곳에서 유용한 제안을 통해 UID를 기반으로 패킷을 표시하는 것입니다. 그것은 실제로 목표가 아닙니다. 프로세스에 따라 표시/필터링/라우팅하는 것이 목표입니다.사용자와 상관없이. 즉, if alicebob모두 charlie자체 인스턴스를 실행합니다 /usr/bin/testapp. 세 인스턴스 모두의 모든 패킷이 통과해야 eth1하고 시스템의 다른 모든 패킷도 통과해야 합니다 eth0.

소스/대상 포트, 사용자 이름/UID 등으로 표시하는 것만으로는 충분하지 않습니다. 다양한 사용자가 실행할 수 testapp있고 자체적으로 다른 포트를 설정할 수 있기 때문 ~/.config/testapp.conf입니다. 문제는 프로세스 별 필터링에 관한 것입니다.

얼마나 유용한지는 모르겠지만 사용할 수 있는 옵션 중 하나는 /bin/(ba|z)?sh네이티브 바이너리 주위에 기반 래퍼를 사용하는 것입니다.

--- 편집하다 ---

나는 최신 Linux 커널(예: 4.0 이상)을 실행하는 시스템에서의 라우팅을 언급하고 있습니다. iproute2, nftables및 유사한 도구 외에 소프트웨어 종속성이 있는 경우 conntrack오픈 소스 솔루션을 탐색할 의향이 있지만 기본 도구가 더 좋습니다.

답변1

eth1 또는 eth0을 통해 패킷을 라우팅합니다. 테이블 맹글이 이 문제를 해결해야 합니다. 그러기 위해서는 패킷을 표시하고 이를 처리하기 위한 규칙을 설정해야 했습니다. 먼저, 테이블을 통해 2로 표시된 커널 경로 패킷을 만드는 규칙을 추가합니다.

ip rule add fwmark 2 table 3

게이트웨이가 10.0.0.1이라고 가정하고 다른 인터페이스를 통해 트래픽을 리디렉션하기 위한 경로를 추가합니다.

ip route add default via 10.0.0.1 table 3

라우팅 캐시를 플러시합니다.

ip route flush cache

이제 지정된 패킷을 표시하기 위한 방화벽 규칙을 설정합니다.

iptables -t mangle -A OUTPUT -p tcp --dport 465 -j MARK --set-mark 2

마지막으로 역방향 소스 검증을 완화합니다. 일부에서는 0으로 설정하라고 제안하지만 에 따르면 2가 더 나은 선택인 것 같습니다 https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt. 이를 건너뛰면 패킷을 수신하지만( 를 사용하여 확인 가능 tcpdump -i tap0 -n) 패킷이 수신되지 않습니다. 패킷이 허용되도록 설정을 변경하는 명령은 다음과 같습니다.

sysctl -w net.ipv4.conf.tap0.rp_filter=2

참조 :http://serverfault.com/questions/345111/iptables-target-to-route-packet-to-specific-interface

답변2

특정 사용자로 프로세스를 실행하고 패킷을 iptable의 owner확장자와 일치시킬 수 있습니다. 일치하면 이를 표시하고 다른 라우팅 테이블과 함께 사용하거나 POSTROUTING원하는 솔루션을 사용할 수 있습니다.

이것게시물은 과의 패킷 일치를 더 잘 설명합니다 owner.

답변3

이는 네트워크 네임스페이스를 사용하여 프로세스를 격리하고, 가상 이더넷 연결을 사용하여 해당 네트워크 네임스페이스를 기본 네임스페이스에 연결하는 것이 가능합니다. 그런 다음 iptables를 사용하여 해당 소스를 기반으로 라우팅할 수 있습니다.

여기에 예가 있습니다. 일부 명령에 네트워크 관리자를 사용하고 있지만 원시적으로 수행할 수도 있습니다.

# Create a namespace
ip netns add ns1

# create a bridge between them
nmcli connection add type veth ifname virt0 peer virt1
ip link set virt1 netns ns1
ip addr add 192.168.69.1/24 dev virt0
ip netns exec ns1 ip addr add 192.168.69.2/24 dev virt1
ip netns exec ns1 ip link up virt1
echo 1 > sudo tee /proc/sys/net/ipv4/ip_forward

# At this point traffic from ns1 will appear in your main network namespace as coming from ip 192.168.69.2 dev virt0, so you can handle it from there.  You will need NAT to make it go somewhere useful.
# In this case I want the traffic to go out through interface vpn1, which is not a default route on my system.

# Add your process-specific routing rules in a non-default table (12345 in this case)
ip route add default dev vpn1 table 12345 proto static scope link metric 50
# Set up a rule to use that table for the traffic coming from that IP, with lower priority than the default table's rule.
ip rule add priority 30000 from 192.168.69.0/24 lookup 12345
# Add the nat, so that the traffic can actually exist on your outbound interface
iptables -t nat -A POSTROUTING -o vpn1 -j MASQUERADE

# At this point traffic from ns1 will go out through interface vpn1. Now you can run command sin that netns to utilize this.

nsenter  --net=/var/run/netns/ns1 your_program

답변4

음, 당신이 우리에게 말한 것을 고려하면:

문제의 프로세스를 특정 인터페이스에 쉽게 바인딩할 수 없기 때문에 라우팅을 통해 동일한 결과를 얻으려고 합니다. 이것이 가능한가?

우리는 바로 이 시점부터 당신을 돕기 시작할 수 있습니다. 옛날 옛적에 FreeBSD jail시스템 호출은 프로세스나 프로세스 그룹을 시스템 자원의 일부 하위 섹션으로 제한하려는 목적으로 나타났습니다. 특히, "격리된" 프로세스가 네트워크 활동에 사용할 IP 주소를 지정할 수 있습니다. 너무 편리해서 Linux에서 이 기능을 많이 놓쳤습니다. 그러나 Linux에도 비슷한 결과를 얻을 수 있는 몇 가지 방법이 있습니다.

또는 대부분의 경량은 네임스페이스를 수동으로 수정하는 것입니다.https://unix.stackexchange.com/questions/155446/linux-is-there-handy-way-to-exec-a-program-bound-it-to-ip-address-of-choice

관련 정보