본문 바로가기

Tech/Trouble Shooting

OVS와 UNIX 도메인 소켓 연결 삽질기

얼마 전, Open vSwitch(이하 OVS)를 UNIX 도메인 소켓으로 OpenFlow 컨트롤러에 붙이려다 꽤 고생을 했습니다.
어디서부터 잘못된 걸까, 로그도 안 나오고, is_connected: false만 덜렁… 결국 원인을 파헤치고 나니 해결책은 의외로 단순했는데요. 저처럼 같은 문제로 헤매시는 분들을 위해 과정을 그대로 공유합니다.

🚀 문제 상황

  1. 자체 epoll 기반 컨트롤러를 UNIX 소켓(/var/run/openflow_controller.sock)으로 리슨
  2. OVS 브리지(br0, br1) 설정도 똑같이
  3. ovs-vsctl set-controller br0 unix:/var/run/openflow_controller.sock ovs-vsctl set-controller br1 unix:/var/run/openflow_controller.sock
  4. 연결 상태 확인해 보면
  5. $ ovs-vsctl get Controller br0 is_connected false
  6. journalctl -fu ovs-vswitchd에도 아무런 connect 로그가 없고, strace로 살펴봐도 connect() 호출이 전혀 찍히지 않음.

“아예 시도조차 안 하는 건가?”
“아무리 해도 이유를 알 수가 없네…”

이런 의문만 쌓이는 상황이었습니다.

🔍 원인 분석

조금 더 찾아보니, OVS는 보안을 위해 런디렉토리(기본 /var/run/openvswitch) 외부에 있는 UNIX 소켓 파일에 대해
connect() 호출을 스킵 할 수 있다는 사실을 알게 됐습니다.
즉, /var/run/openflow_controller.sock 같은 경로에 소켓을 두면, OVS가 “내 영역이 아니야!” 하고는
아예 시도조차 안 한 거죠.

🛠️ 간단한 해결 방법

  1. 소켓 위치를 OVS 런디렉토리 하위로 옮기기
  2. // 기존 #define UNIX_SOCKET_PATH "/var/run/openflow_controller.sock" // 수정 #define UNIX_SOCKET_PATH "/var/run/openvswitch/openflow_controller.sock"
  3. OVS 설정에도 경로 반영
  4. sudo ovs-vsctl set-controller br0 \ unix:/var/run/openvswitch/openflow_controller.sock sudo ovs-vsctl set-controller br1 \ unix:/var/run/openvswitch/openflow_controller.sock
  5. 퍼미션·소유권 확인
  6. sudo chown root:root /var/run/openvswitch/openflow_controller.sock sudo chmod 0666 /var/run/openvswitch/openflow_controller.sock
  7. OVS 데몬 재시작 or 강제 재연결
  8. # systemd 환경 sudo systemctl restart ovs-vswitchd # 또는 브리지별로 sudo ovs-appctl -t ovs-vswitchd bridge/reconnect br0

이제 다시 확인해 보면…

$ ovs-vsctl get Controller br0 is_connected
true

아울러 로그에도 깔끔하게 connect 성공 메시지가 뜹니다.

🎉 마무리

  • 교훈: UNIX 도메인 소켓 연결 시, 경로 정책부터 먼저 의심하자!
  • OVS는 반드시 /var/run/openvswitch 하위에서만 unix: 스킴을 통해 connect()를 시도합니다.
  • 삽질을 줄이고 싶다면, 초기 설계 단계에서 경로 룰을 확실히 이해하세요.

이 포스트가 같은 문제로 고민하는 분들께 도움이 되길 바랍니다!
궁금한 점이나 다른 해결법이 있으면 댓글로 알려주세요.