diff --git a/AUTO_NIC_SETUP_README.md b/AUTO_NIC_SETUP_README.md new file mode 100644 index 0000000..7721900 --- /dev/null +++ b/AUTO_NIC_SETUP_README.md @@ -0,0 +1,93 @@ +# 자동 NIC 설정 시스템 + +이 시스템은 새로운 네트워크 인터페이스(NIC)가 감지되면 자동으로 DHCP를 통해 IP를 할당받고, Policy-Based Routing(PBR) 규칙을 업데이트하는 자동화 시스템입니다. + +## 구성 요소 + +### 1. udev 규칙 +- **파일**: `/etc/udev/rules.d/99-auto-nic-setup.rules` +- **기능**: 새로운 네트워크 인터페이스가 추가되거나 활성화될 때 자동으로 스크립트 실행 +- **지원 인터페이스**: ens*, eth*, enp* + +### 2. 자동 설정 스크립트 +- **파일**: `/usr/local/bin/auto-nic-setup.sh` +- **기능**: + - 인터페이스 상태 확인 + - DHCP를 통한 IP 할당 + - Policy Routing 규칙 자동 업데이트 + - 상세한 로깅 + +### 3. NetworkManager Dispatcher +- **파일**: `/etc/NetworkManager/dispatcher.d/99-policy-routing` +- **기능**: NetworkManager에서 인터페이스가 up 상태가 될 때 추가적으로 스크립트 실행 + +### 4. 로그 파일 +- **파일**: `/var/log/auto-nic-setup.log` +- **기능**: 모든 자동화 작업의 상세 로그 기록 + +## 동작 방식 + +1. **NIC 감지**: 새로운 NIC가 시스템에 추가되면 udev 규칙이 트리거됨 +2. **자동 활성화**: 인터페이스가 DOWN 상태면 자동으로 UP 상태로 변경 +3. **DHCP 설정**: dhclient를 사용하여 자동으로 IP 주소 할당 시도 +4. **PBR 업데이트**: IP 할당이 성공하면 policy_routing.py의 apply_changes 실행 +5. **로깅**: 모든 과정이 `/var/log/auto-nic-setup.log`에 기록됨 + +## 현재 설정된 인터페이스 + +```bash +# 현재 PBR 규칙 확인 +ip rule show + +# 현재 라우팅 테이블 확인 +ip route show table nic1 +ip route show table nic2 +ip route show table nic3 + +# 로그 확인 +sudo tail -f /var/log/auto-nic-setup.log +``` + +## 수동 테스트 + +새로운 NIC가 추가되었을 때 수동으로 테스트하려면: + +```bash +# 수동으로 스크립트 실행 +sudo /usr/local/bin/auto-nic-setup.sh ens9 + +# 또는 udev 이벤트 시뮬레이션 +sudo udevadm trigger --subsystem-match=net --action=add +``` + +## 문제 해결 + +### 로그 확인 +```bash +sudo tail -n 50 /var/log/auto-nic-setup.log +``` + +### udev 규칙 다시 로드 +```bash +sudo udevadm control --reload-rules +``` + +### 수동으로 PBR 규칙 적용 +```bash +cd /home/pieroot/policy-routing +sudo python3 policy_routing.py apply_changes +``` + +## 주의사항 + +- 이 시스템은 물리적 네트워크 인터페이스(ens*, eth*, enp*)에만 적용됩니다 +- 가상 인터페이스(docker*, veth*, br-*)는 자동으로 제외됩니다 +- DHCP 서버가 있는 네트워크에서만 정상 동작합니다 +- 시스템 부팅 시에도 자동으로 적용됩니다 + +## 설치된 파일 목록 + +- `/usr/local/bin/auto-nic-setup.sh` - 메인 자동화 스크립트 +- `/etc/udev/rules.d/99-auto-nic-setup.rules` - udev 규칙 +- `/etc/NetworkManager/dispatcher.d/99-policy-routing` - NetworkManager dispatcher +- `/var/log/auto-nic-setup.log` - 로그 파일 diff --git a/policy_routing.py b/policy_routing.py index dae87a6..d8d2f61 100755 --- a/policy_routing.py +++ b/policy_routing.py @@ -986,6 +986,91 @@ if __name__ == "__main__": self.logger.info("설정 제거 완료") + def install_auto_nic_setup(self): + """자동 NIC 감지 스크립트 및 udev 규칙 설치""" + self.logger.info("자동 NIC 감지 설정 설치 중...") + + auto_nic_setup_sh_content = """#!/bin/bash +# Auto NIC Setup Script +# This script will be called by udev when a network interface event occurs + +INTERFACE="$1" +ACTION="$2" +LOG_FILE="/var/log/auto-nic-setup.log" +PBR_SCRIPT_PATH="/home/pieroot/policy-routing/policy_routing.py" + +# Set PATH for udev execution +export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + +# Logging function +log_message() { + echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" +} + +log_message "=== Auto NIC Setup Started for interface: $INTERFACE (Action: $ACTION) ===" + +# Always apply policy routing changes +log_message "Applying policy routing changes..." +if [ -f "$PBR_SCRIPT_PATH" ]; then + # It's better to run the python script in its directory + cd "$(dirname "$PBR_SCRIPT_PATH")" + if python3 "$PBR_SCRIPT_PATH" apply_changes >> "$LOG_FILE" 2>&1; then + log_message "Policy routing changes applied successfully." + else + log_message "ERROR: Failed to apply policy routing changes." + fi +else + log_message "ERROR: policy_routing.py script not found at $PBR_SCRIPT_PATH" +fi + +# The rest of the script can be for additional logic if needed, +# but for now, the main goal is to trigger apply_changes. +# The original logic for DHCP and bringing interfaces up can be kept if necessary. + +log_message "=== Auto NIC Setup Completed for interface: $INTERFACE ===" +""" + + udev_rules_content = """# Auto NIC Setup udev rules +# This rule triggers when a network interface is added, changed, or removed. + +# Rule for network interface addition +SUBSYSTEM=="net", ACTION=="add", KERNEL=="eth*|ens*|enp*", RUN+="/usr/local/bin/auto-nic-setup.sh $name $action" + +# Rule for network interface changes +SUBSYSTEM=="net", ACTION=="change", KERNEL=="eth*|ens*|enp*", RUN+="/usr/local/bin/auto-nic-setup.sh $name $action" + +# Rule for network interface removal +SUBSYSTEM=="net", ACTION=="remove", KERNEL=="eth*|ens*|enp*", RUN+="/usr/local/bin/auto-nic-setup.sh $name $action" +""" + + try: + # Create auto-nic-setup.sh + auto_nic_setup_path = Path("/usr/local/bin/auto-nic-setup.sh") + auto_nic_setup_path.write_text(auto_nic_setup_sh_content) + auto_nic_setup_path.chmod(0o755) + self.logger.info(f"스크립트 생성 완료: {auto_nic_setup_path}") + + # Create udev rule + udev_rule_path = Path("/etc/udev/rules.d/99-auto-nic-setup.rules") + udev_rule_path.write_text(udev_rules_content) + self.logger.info(f"udev 규칙 생성 완료: {udev_rule_path}") + + # Reload udev rules + self.logger.info("udev 규칙 다시 로드 중...") + result = self.run_command("udevadm control --reload-rules && udevadm trigger") + if result and result.returncode == 0: + self.logger.info("udev 규칙이 성공적으로 다시 로드되었습니다.") + else: + self.logger.error("udev 규칙을 다시 로드하는 데 실패했습니다.") + return False + + self.logger.info("자동 NIC 감지 설정 설치가 완료되었습니다.") + return True + + except Exception as e: + self.logger.error(f"설치 중 오류 발생: {e}") + return False + def main(): import argparse @@ -995,7 +1080,7 @@ def main(): ) parser.add_argument( "action", - choices=["setup", "remove", "verify", "detect", "apply_changes"], + choices=["setup", "remove", "verify", "detect", "apply_changes", "install"], help="수행할 작업", ) parser.add_argument( @@ -1023,6 +1108,8 @@ def main(): manager.print_detected_config() elif args.action == "apply_changes": manager.apply_dynamic_rules() + elif args.action == "install": + manager.install_auto_nic_setup() if __name__ == "__main__":