'Embedded Linux/OpenWrt'에 해당되는 글 2건

Embedded Linux/OpenWrt

 

OpenWrt에서 네트워크 응용을 운영하다보면 설정에 의해 네트워크 포트 액세스를 허용/제한 설정을 해야 하는 경우가 있다.

 

firewall 에 rule 추가

SNMP 서비스 액세스를 허용/제한 하기 위해 가장 간단하다고 생각하는 방법은 아래와 같다.

root@OpenWrt:~# uci set firewall.snmp=rule 
root@OpenWrt:~# uci set firewall.snmp.name='reject snmp traffic' 
root@OpenWrt:~# uci set firewall.snmp.src='wan' 
root@OpenWrt:~# uci set firewall.snmp.dest_port='161' 
root@OpenWrt:~# uci set firewall.snmp.target='REJECT' 
root@OpenWrt:~# uci set firewall.snmp.enabled='0' 
root@OpenWrt:~# uci commit

 

위에 명령을 입력하면 firewall에 아래처럼 저장된다.

여기서 사용된 option은 아래와 같다. 특정 ip, port, 날짜 지정 등의 옵션을 사용할 수 있지만 사용 목정에 맞게 심플하게 추가했다.

  • src: "zone name"의 형태로 트래픽 소스 zone을 선택한다. zone 은 network 설정에서 선택한다.
  • dest_port: rule을 적용할 port이다. snmp 서비스 액세스를 제어할 거니까 '161'을 설정
  • target: rule 동작 방법 ("ACCEPT", "REJECT". "DROP", "MARK", NOTRACK") 중 "REJECT" 선택
  • enabled: 이 rule을 사용할지 사용 안할지 선택.

 

위 설정에 의해 enabled가 '1'인 경우 SNMP 포트(161)을 REJECT 하고, enabled가 '0' 인 경우 ACCEPT 하는 rule을 생성했다.

 

방화벽 설정
방화벽 설정 방화벽 설정은 /etc/config/firewall에 있습니다. 개요 OpenWrt는 패킷 필터링, NAT 및 mangling을 위해 netfilter를 사용합니다. UCI 방화벽은 iptables system에서 추상화 된 인터페이스를 제공하여 사용자가 필요한 경우 iptables 규칙을 스스로 제공 할 수있게하면서 가장 일반적인 목적에 맞는 단순한 설정 모델을 제공합니다
https://openwrt.org/ko/docs/guide-user/firewall_configuration#rules

 

 

테스트

먼저, enabled option이 0인 경우 (SNMP ACCEPT)시에는 SNMP 요청에 응답하는 것을 볼 수 있다.

 

root@OpenWrt:~# uci set firewall.snmp.enabled='0' 
root@OpenWrt:~# uci commit 
root@OpenWrt:~# /etc/init.d/firewall reload

 

 

 

이후 SNMP REJECT enable option을 1로 바꾸고 firewall을 reload 하면 SNMP 서비스를 제한할 수 있다.

root@OpenWrt:~# uci set firewall.snmp.enabled='1' 
root@OpenWrt:~# uci commit 
root@OpenWrt:~# /etc/init.d/firewall reload

 

  • SNMP요청에 timeout 발생

 

Embedded Linux/OpenWrt

 

OpenWrt용 python package를 설치하는 Makefile 만들기

 

  1. 참고:
https://openwrt.org/docs/guide-developer/packages
https://openwrt.org/docs/guide-developer/packages

 

 

openWrt를 빌드 할 때 python 패키지를 추가해서 빌드를 해야하는 경우가 생겼다.

이전에는 python 패키지를 추가할 때 아래처럼 makefile을 만들어서 사용했다.

include $(TOPDIR)/rules.mk


PKG_NAME:=python-flask_socketio
PKG_VERSION:=4.3.2
PKG_RELEASE:=1
PKG_LICENSE:=GPLv3

PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/miguelgrinberg/Flask-SocketIO.git
PKG_SOURCE_VERSION:=v$(PKG_VERSION)
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz

include $(INCLUDE_DIR)/package.mk
include $(TOPDIR)/feeds/packages/lang/python/python3-package.mk

define Package/python3-flask_socketio
  SUBMENU:=Python
  SECTION:=lang
  CATEGORY:=Languages
  TITLE:=Python3 flask_socketio
  DEPENDS:=+python3-light +python3-socketio +python3-engineio
  VARIANT:=python3
endef

define Package/python3-flask_socketio/description
Python3 bindings for Unified Configuration Interface.
endef

$(eval $(call Py3Package,python3-flask_socketio))
$(eval $(call BuildPackage,python3-flask_socketio))

 

이렇게 makefile을 만들어서 packages 디렉토리에 추가 해놓으면 OpenWrt 빌드 시에 git에서 코드를 다운받아서 .ipk를 만들고 image에 포함되었다.

 

만약 python 패키지에 dependancies 가 있다면 위와 같은 방식으로 makefile을 만들어 넣은 후에 위 DEPENDS: 에 python 패키지 이름을 추가하는 방식으로 진행했다.

 

이번에도 python 패키지를 추가할 일이 있어서 위와 동일한 방식으로 진행하려다가 에러가 발생했다.

💡
../staging_dir/hostpkg/bin/python3.7: can't open file './setup.py': [Errno 2] No such file or directory

 

위 에러로 검색을 해보니 "setup.py" 는 프로젝트의 빌드, 테스트. 배포에 필요한 정보를 담고 있고 setuptools로 테스트, 빌드, 배포하는 것을 확인했다.

 

그리고 내가 빌드하려던 python 패키지에는 setup.py 파일이 없는 것을 확인했다.

github를 commit log를 보니 특정 commit에는 setup.py 가 있는데 master 에는 없었다.

 

그래서 setup.py를 빌드 디렉토리에 넣고 makefile에 setup.py를 추가하는 내용을 추가했다.

  • 위에서 언급한 commit log에 있던 setup.py는 예전 버전의 문법으로 작성되었는지.. 에러가 발생해서 새로 작성해서 추가했다.

setup.py

import re
import sys
from setuptools import setup


with open('aiosmtplib/__init__.py', 'r') as f:
    version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]',
                        f.read(), re.MULTILINE).group(1)

setup(
    name='python-aiosmtplib',
    version=version,
    url='http://github.com/cole/aiosmtplib/',
    license='MIT',
    author='Cole Maclean',
    author_email='hi@colemaclean.dev',
    description='asyncio SMTP Client',
    packages=['aiosmtplib'],
    zip_safe=False,
    include_package_data=True,
    platforms='any',
    install_requires=[],
    tests_require=[],
    test_suite='tests',
    classifiers=[
        'Environment :: Web Environment',
        'Intended Audience :: Developers',
        'License :: OSI Approved :: MIT License',
        'Operating System :: OS Independent',
        'Programming Language :: Python',
        'Programming Language :: Python :: 2',
        'Programming Language :: Python :: 3',
        'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
        'Topic :: Software Development :: Libraries :: Python Modules'
    ]
)

 

makefile

define Build/Prepare
  @echo "[APP]: Prepare Build..."
	$(CP) setup.py $(PKG_BUILD_DIR)/
endef

 

이렇게 수정하고 컴파일 해보니 정상적으로 빌드돠고 ipk 파일이 생성되었다.

$ make package/python-aiosmtplib/compile V=s -j1

 

1
블로그 이미지

IoT 개발자 블로그이고 싶다.

1byte