세션이 시작되는 네트워크 인터페이스로 모든 TCP 트래픽을 제한하는 방법은 무엇입니까?

세션이 시작되는 네트워크 인터페이스로 모든 TCP 트래픽을 제한하는 방법은 무엇입니까?

동일한 서브넷에 대해 구성된 두 개의 네트워크 인터페이스(lan0, wlan0)가 있는 임베디드 Linux 시스템이 있습니다. 이 시스템의 서버는 두 인터페이스 모두에서 TCP 연결을 허용합니다.

요청을 수신한 동일한 인터페이스에서 세션에 대한 모든 응답이 전송되도록 하려면 어떻게 해야 합니까? 즉, TCP 세션의 모든 트래픽을 특정 네트워크 인터페이스로 제한하는 방법은 무엇입니까?

Listen() 소켓과 승인된 소켓은 setockopt(fd, BIND_TO_DEVICE)를 사용하여 인터페이스/장치에 바인딩될 수 있습니다. 서버는 두 인터페이스 모두에 대해 이 작업을 수행합니다. 이를 통해 세션이 생성된 인터페이스를 감지하고 아웃바운드 트래픽을 동일한 인터페이스로 제한하는 데 도움이 됩니다.

그러나 accept()가 발생하면 SYN-ACK가 클라이언트로 다시 전송되고 문제는 ARP 조회로 인해 이 초기 패킷이 다른 (잘못된) 인터페이스를 통해 전송될 수 있다는 것입니다. arp는 클라이언트가 다른/"잘못된" 인터페이스에서도 표시되기 때문에 클라이언트의 IP 주소를 다른/"잘못된" 인터페이스에서 찾을 수 있습니다.

답변1

iptables를 사용하여 인터페이스에 대한 TCP 연결을 제한할 수 있습니다.

#iptables -A INPUT -p tcp -i eth0 --syn -m limit --limit 1/s --limit-burst 3 -j RETURN

--limit 1/s: Maximum average matching rate in seconds
--limit-burst 3: Maximum initial number of packets to match

관련 정보