
내부 네트워크와의 트래픽을 허용/거부하기 위해 iptables를 사용하는 네트워크 게이트웨이 시스템이 있습니다. iptables
트래픽 NAT를 포함하여 내부 네트워크에 있는 엔터티의 요구 사항에 따라 규칙을 수동으로 추가하고 제거해야 합니다 . 내부 네트워크의 신뢰할 수 있는 엔터티는 필요에 따라 규칙을 추가하고 제거하도록 요청할 수 있습니다. 최종 결과는 대상이 있는 규칙 nat
, filter
소스 IP를 게이트웨이 시스템의 IP로 설정하는 POSTROUTING
규칙 SNAT
, 게이트웨이 외부 IP 주소가 dst
.
게이트웨이 시스템의 IP를 즉시 설정할 수 있기를 원합니다.. 물론 이는 TCP 세션 등에 지장을 주는 결과를 가져오지만, 이 문제는 다루지 않겠습니다. 시스템은 다른 메커니즘을 사용하여 이러한 문제를 처리합니다.
문제는 방화벽 테이블의 알 수 없는 수의 규칙이 여전히 이 이전 소스 IP 주소를 참조한다는 것입니다.
이전 IP 주소 대신 새 IP 주소를 사용하도록 이러한 모든 규칙을 쉽게 변경할 수 있는 방법이 있습니까?물론 당신이 나보다 bash 마법사에 더 가깝다면 sed/awk 또는 이와 유사한 멋진 스크립트를 사용할 수도 있습니다.
답변1
SNAT 처리되는 트래픽이 항상 아웃바운드 인터페이스의 IP 주소를 사용하는 경우 -j SNAT
를 로 바꿉니다 -j MASQUERADE
. 이는 동일한 conntrack 기반 SNAT를 사용하지만 대체 소스 주소를 자동으로 선택합니다.
iptables-save
및 다음을 사용하여 iptables 규칙을 대량 편집할 수 있습니다 iptables-restore
.
예를 들어, 규칙 세트를 대화식으로 편집하려면(특히 편집기에 검색 및 바꾸기 기능이 좋은 경우) 다음을 수행하십시오.
iptables-save > /tmp/rules vim /tmp/rules iptables-restore < /tmp/rules
moreutils의 'vipe' 사용:
iptables-save | vipe | iptables-restore
.
하나의 정확한 IP 주소를 다른 IP 주소로 대량 대체하려면( 정규 표현식의 와일드카드 문자임을 명심하고\b
"12.34"가 실수로 "112.34"와 일치하지 않도록 사용):iptables-save | sed 's/\b12\.34\.56\.78\b/12.34.56.99/g' | iptables-restore
하지만 내 생각에는,어느iptables 규칙 편집(스크립트 기반 "iptables -A" 설정 포함)은 나쁜 접근 방식입니다. 대신에iptables.rules
파일(iptables-save 형식)을 "소스"로 지정하고 항상 해당 파일에서 규칙 세트를 로드합니다. 그런 다음 특정 형태의 매크로/템플릿 언어를 사용하여 IP 주소를 한 번 정의하고 어디에서나 참조할 수 있습니다. 이는 Salt/Ansible을 통해 구성 파일을 배포할 때 수행되는 방식과 유사합니다(아직도 이를 사용하는 경우).
예를 들어(실제로 이렇게 하지 마십시오. 너무 빨리 관리할 수 없는 일이 발생하게 됩니다):
cat /etc/iptables.rules | sed 's/%CUST_IP%/12.34.56.78/g' | iptables-restore
또한 iptables 규칙에 대한 대체 구문을 구현하는 Ferm을 살펴볼 것을 제안합니다. 이는 일반적으로 좀 더 읽기 쉬우면서도 매크로가 내장되어 있어
@def $cust_ip
한 번만 사용하면 어디에서나 참조할 수 있습니다.domain (ip ip6) { @def dns_host4 = 10.10.0.53; @def ntp_host4 = 10.10.0.123; table filter { chain FORWARD { daddr ($dns_host4 $ntp_host4) accept; } } table nat { chain PREROUTING { proto (tcp udp) dport 53 DNAT to-destination $dns_host4; proto udp dport 123 DNAT to-destination $ntp_host4; } } }
이는 iptables-restore와 유사하게 작동합니다. 변경 사항을 실시간으로 적용하는 대신 완료되면 전체 규칙 세트를 편집
/etc/ferm.conf
하고 다시 로드하기 위해 실행합니다 .ferm
IP 주소가 변경되면 ferm.conf에서 @def 매크로를 편집하고 다시 로드하세요.(또한 결국 nftables로 전환하게 된다면 이에 익숙해지는 것이 좋습니다. Ferm과 거의 동일하게 작동하기 때문입니다. 물론 구문은 약간 다르지만 $macros도 있고 /etc/를 편집합니다. nftables.conf를 열고 모든 것을 한 번에 다시 로드하세요.)
답변2
ipset과 함께 iptables를 제안하고 싶습니다.
iptables에는 규칙이 있지만 --match-set setname src를 추가합니다.
iptables -I PREROUTING -s whatever ... --match-set setname src
iptables -I PREROUTING -s whatever ... --match-set setname dst
그런 다음 규칙을 비활성화하려면 "setname"이라는 집합에서 IP 주소를 제거합니다. 이를 활성화하려면 setname에 IP 주소를 추가하기만 하면 됩니다.
그런 다음 iptables는 동일하게 유지되며 setname에서 항목을 추가하고 빼기만 하면 됩니다.
각 규칙은 필요에 따라 다른 이름을 갖습니다.