네트워크 통신(34964)에 동일한 포트를 사용하는 두 개의 애플리케이션이 있습니다. 나는 첫 번째 애플리케이션에 대한 제어(소스 코드)를 가지고 있으며 192.168.0.4:34964를 사용합니다. 다른 애플리케이션이 모든 IP 주소(0.0.0.0:34964)를 사용/"요구"하려고 시도하지만 저는 이 주소를 제어할 수 없습니다. 각 응용 프로그램은 개별적으로 실행되지만 동시에 실행하려고 하면 주소를 바인딩할 수 없다는 오류가 발생합니다.
질문
두 번째 애플리케이션이 모든 IP 주소(0.0.0.0)를 사용/청구하는 것을 방지하고 대신 192.168.0.5를 사용할 수 있는 방법이 있습니까? 네트워크 네임스페이스에서 시작하거나 캡슐화하기 전인가요?
아무것도 시도하지 않았고 아이디어가 부족합니다 ...
더 자세한 버전: 두 애플리케이션은 두 개의 독립적인 Profinet 네트워크에서 통신합니다. 첫 번째 애플리케이션은 Profinet 장치 역할을 하며 Siemens Profinet 컨트롤러와 통신하며 이 애플리케이션의 소스 코드에 액세스할 수 있습니다. 두 번째 애플리케이션은 Profinet Siemens 장치와 통신하는 Profinet 컨트롤러 역할을 해야 합니다. 저는 현재 이 목적으로 Codesys를 사용하고 있으며 소스 코드를 변경할 수 있는 액세스 권한이 없습니다.
답변1
몇 가지 옵션이 있습니다.
LD_예압
LD_PRELOAD
라이브러리를 사용하여 시스템 호출을 가로채어 bind()
특정 주소에 강제로 바인딩할 수 있습니다. 한 가지 예는 다음과 같습니다이것, 다음과 같이 컴파일할 수 있습니다.
gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE
다음과 같이 사용하십시오 :
BIND_ADDR=127.0.0.1 LD_PRELOAD=./bind.so /path/to/myprogram
Docker의 네트워크 네임스페이스 사용
자체 네트워크 네임스페이스 내에서 프로그램을 실행하도록 선택할 수도 있습니다. 이것가장 단순한이를 수행하는 방법은 애플리케이션용 Docker 이미지를 구축한 다음 Docker에서 이를 실행하고 Docker의 포트 매핑 기능을 사용하여 선택한 호스트 IP에 서비스를 노출하는 것입니다.
여기 용이 있어요
위의 솔루션 중 하나를 적극 권장합니다. 네트워크 네임스페이스에 대해 문의하셨기 때문에 다음 내용만 포함시켰습니다.
macvlan을 사용한 네트워크 네임스페이스
Docker를 사용하지 않고 이 작업을 수행할 수 있지만 더 많은 작업이 필요합니다. 먼저 새 네트워크 네임스페이스를 만듭니다.
# ip netns add myns
macvlan
그런 다음 호스트 인터페이스 중 하나와 연결된 인터페이스를 생성 하고 이를 네임스페이스에 넣습니다.
# ip link add myiface link eth0 type macvlan mode bridge
# ip link set myiface netns myns
그리고 로컬 네트워크에 주소를 할당하세요.
# ip netns exec myns \
ip addr add 192.168.0.4/24 dev myiface
# ip netns exec myns \
ip link set myiface up
그리고 네임스페이스 내에 적절한 라우팅 규칙을 만듭니다(실제 게이트웨이 주소로 바꿈 192.168.0.1
).
# ip netns exec myns \
ip route add default via 192.168.0.1
이제 네트워크 네임스페이스 내에서 프로그램을 실행하세요.
# ip netns exec myns \
/path/to/myprogram
192.168.0.4
이제 프로그램이 실행 중이며 네임스페이스 내에서 유일하게 표시되는 주소이기 때문에 바인딩만 됩니다 . 하지만! 인터페이스의 제한 사항에 유의하십시오 mavclan
. 네트워크의 다른 호스트는 서비스에 연결할 수 있지만 서비스를 실행하는 호스트에서 해당 주소에 연결하고( macvlan
해당 호스트에서 다른 인터페이스를 만들지 않는 한) 라우팅 할 수 없습니다. 해당 인터페이스를 통한 연결 192.168.0.4
).
veth 인터페이스가 있는 네트워크 네임스페이스
macvlan
인터페이스를 사용하는 대신 veth
네트워크 네임스페이스 내 쌍의 한쪽 끝과 호스트의 다른 쪽 끝으로 쌍을 생성할 수 있습니다. IP 매스커레이딩을 사용하여 네임스페이스에서 로컬 네트워크로 패킷을 전달합니다.
네트워크 네임스페이스를 만듭니다.
# ip netns add myns
인터페이스 쌍을 생성합니다:
# ip link add myiface-in type veth peer name myiface-out
이 쌍의 한쪽 끝을 네트워크 네임스페이스에 할당합니다.
# ip link setns myiface-in myns
쌍의 각 끝에 주소를 구성하고 링크를 엽니다.
# ip addr add 192.168.99.1/24 dev myiface-out
# ip link set myiface-out up
# ip netns exec myns ip addr add 192.168.99.2/24 dev myiface-in
# ip netns exec myns ip link set myiface-in up
호스트에서 IP 매스커레이딩을 구성합니다. 그러면 수신 패킷이 192.168.0.4
네임스페이스로 리디렉션됩니다 .
# iptables -t nat -A PREROUTING -d 192.168.0.4 -p tcp --dport 34964 -j DNAT --to-destination 192.168.99.2
# iptables -t nat -A OUTPUT -d 192.168.0.4 -p tcp --dport 34964 -j DNAT --to-destination 192.168.99.2
이렇게 하면 아웃바운드 패킷이 위장됩니다.
# iptables -t nat -A POSTROUTING -s 192.168.99.2 -j MASQUERADE
호스트( sysctl -w net.ipv4.ip_forward=1
)에서 IP 전달이 활성화되어 있고 iptables FORWARD
체인이 전달 연결( )을 허용하는지 확인해야 합니다 iptables -A FORWARD -d 192.168.99.2 -j ACCEPT
. 규칙은 순서대로 처리되므로 규칙을 거부해야 합니다.앞으로이 것이 우선시됩니다).