mirror of
https://github.com/jung-geun/policy-routing.git
synced 2025-12-20 02:34:39 +09:00
자동 NIC 감지 스크립트 및 udev 규칙 설치 기능 추가
This commit is contained in:
93
AUTO_NIC_SETUP_README.md
Normal file
93
AUTO_NIC_SETUP_README.md
Normal file
@@ -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` - 로그 파일
|
||||||
@@ -986,6 +986,91 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
self.logger.info("설정 제거 완료")
|
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():
|
def main():
|
||||||
import argparse
|
import argparse
|
||||||
@@ -995,7 +1080,7 @@ def main():
|
|||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"action",
|
"action",
|
||||||
choices=["setup", "remove", "verify", "detect", "apply_changes"],
|
choices=["setup", "remove", "verify", "detect", "apply_changes", "install"],
|
||||||
help="수행할 작업",
|
help="수행할 작업",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
@@ -1023,6 +1108,8 @@ def main():
|
|||||||
manager.print_detected_config()
|
manager.print_detected_config()
|
||||||
elif args.action == "apply_changes":
|
elif args.action == "apply_changes":
|
||||||
manager.apply_dynamic_rules()
|
manager.apply_dynamic_rules()
|
||||||
|
elif args.action == "install":
|
||||||
|
manager.install_auto_nic_setup()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user