conntrack 태그를 사용하여 Iptable을 Nftables 방화벽으로 포팅

conntrack 태그를 사용하여 Iptable을 Nftables 방화벽으로 포팅

안녕하세요, 존경하는 커뮤니티 여러분,

강력한 iptables 방화벽을 nftables로 이식하는 데 문제가 있습니다. 콘텐츠의 입력/출력/전달(주로 conntrack 태그)에는 문제가 없습니다. 현재 제가 하는 일은 다음과 같습니다.

ip1/ 이 명령을 사용하여 규칙 및 conntrack 태그와 함께 세 개의 라우팅 테이블을 만듭니다 . 각각에는 FDDI, VPN 또는 4G 연결인 기본 경로가 있습니다.

ip route add table maincnx default dev $WAN via 192.168.1.2
ip route add table maincnx 192.168.0.0/24 dev $LAN src 192.168.0.1
ip route add table maincnx 192.168.1.0/24 dev $WAN src 192.168.1.1
ip rule add from 192.168.1.2 table maincnx

[[ $VPN ]] && ip route add table vpnclient default dev $VPNIF via $VPNCLIENTIP
[[ $VPN ]] && ip route add table vpnclient $VPNCLIENTROUTE dev $VPNIF src $VPNCLIENTIP
[[ $VPN ]] && ip route add table vpnclient 192.168.0.0/24 dev $LAN src 192.168.0.1
[[ $VPN ]] && ip route add table vpnclient 192.168.1.0/24 dev $WAN src 192.168.1.1
ip rule add from $VPNCLIENTIP table vpnclient

ip route add table altcnx default dev $WAN2 via 192.168.2.2
ip route add table altcnx 192.168.0.0/24 dev $LAN src 192.168.0.1
ip route add table altcnx 192.168.1.0/24 dev $WAN src 192.168.1.1
ip route add table altcnx 192.168.2.0/24 dev $WAN2 src 192.168.2.1
ip rule add from 192.168.2.2 table altcnx

ip rule add from all fwmark 1 table maincnx
[[ $VPN ]] && ip rule add from all fwmark 2 table vpnclient
ip rule add from all fwmark 3 table altcnx
ip route flush cache

2/ 그런 다음 몇 가지 iptables 규칙을 정리했습니다. (이미 IPtables 버전을 사용하는 데 어려움을 겪고 있는 사람이 있으면 댓글을 남길 것입니다.)

$IPTABLES -t mangle -A PREROUTING -j CONNMARK --restore-mark # Restore mark previously set
$IPTABLES -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT # If a mark exists: skip
$IPTABLES -t mangle -A PREROUTING -s 192.168.0.5 -p tcp --sport 50001  -j MARK --set-mark 2 # route through VPN
$IPTABLES -t mangle -A PREROUTING -s 192.168.0.3 -j MARK --set-mark 2
$IPTABLES -t mangle -A PREROUTING -s 192.168.0.4 -j MARK --set-mark 3 # route through 4G
$IPTABLES -t mangle -A POSTROUTING -j CONNMARK --save-mark # save marks to avoid retagging

3/ 관련 후면 배선:

$IPTABLES -t nat -A POSTROUTING -o $WAN -j SNAT --to-source 192.168.1.1
$IPTABLES -t nat -A POSTROUTING -o $WAN2 -j SNAT --to-source 192.168.2.1
[[ $VPN ]] && $IPTABLES -t nat -A POSTROUTING -o $VPNIF -j SNAT --to-source $VPNCLIENTIP

ps: 스크립트가 시작될 때 VPN이 실행 중이면 $VPN은 분명히 1로 설정된 변수입니다. IP 규칙 정리 및 일부 사전 라우팅/전달과 같이 이 작업을 수행하기 위해 수행해야 할 몇 가지 다른 작업이 있지만 그게 요점이 아닙니다. 관심이 있으시면 댓글을 남겨주시면 전체 내용을 게시하겠습니다.

유형: 게이트웨이에는 ips 192.168.1.1(FDDI), 192.168.0.1(LAN), 192.168.2.1(4G)을 사용하는 0/1/2의 3가지 eth가 있으며 게이트웨이는 FDDI의 192.168.1.2 및 192.168.2.2 게이트웨이 4G입니다. , VPN은 TUN0 장치에 있고 IP는 약 10.8.0.x입니다.

따라서 기본적으로 192.168.0.5가 포트 50001:tcp에 대한 연결을 시작하면 VPN을 통해 라우팅됩니다. 192.168.0.3은 연결을 시도하는 것과 상관없이 항상 VPN을 사용하고, 192.168.0.4는 4G를 통해 연결하며, 다른 모든 장치는 기본적으로 경로 테이블 1에 연결되고 FDDI를 통해 연결됩니다.

질문: 작업의 IP 부분은 nftables와 동일하게 유지되는 것 같은데, iptables처럼 재구성 및 사후 라우팅을 수행할 수 있는 nftables의 해당 명령은 무엇입니까?

답변1

iptables-translate최신 설치와 함께 제공됩니다 iptables(또는 별도로 포장되어 있을 수도 있으므로 검색해 보세요). 그것은 (시도해) 번역할 것이다iptables규칙은 다음과 같습니다nftables규칙. 모든 내용을 읽고 싶지 않다면 여기 쉬운 방법이 있습니다.문서(포함하다이 도구의 경우) 그리고매뉴얼 페이지.

사용하는 데 루트가 필요하지 않습니다. 이 경우(OP가 규칙을 생성한 방식에 대처하기 위해 더미 정보가 포함된 일부 변수로 완성):

$ export IPTABLES=/usr/sbin/iptables-translate
$ $IPTABLES -V
iptables-translate v1.8.7 (nf_tables)

$ export WAN=wan WAN2=wan2 VPNIF=vpnif VPNCLIENTIP=192.0.2.2 VPN=1
$ cat > /tmp/rules.bash <<'EOF'
$IPTABLES -t mangle -A PREROUTING -j CONNMARK --restore-mark # Restore mark previously set
$IPTABLES -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT # If a mark exists: skip
$IPTABLES -t mangle -A PREROUTING -s 192.168.0.5 -p tcp --sport 50001  -j MARK --set-mark 2 # route through VPN
$IPTABLES -t mangle -A PREROUTING -s 192.168.0.3 -j MARK --set-mark 2
$IPTABLES -t mangle -A PREROUTING -s 192.168.0.4 -j MARK --set-mark 3 # route through 4G
$IPTABLES -t mangle -A POSTROUTING -j CONNMARK --save-mark # save marks to avoid retagging

$IPTABLES -t nat -A POSTROUTING -o $WAN -j SNAT --to-source 192.168.1.1
$IPTABLES -t nat -A POSTROUTING -o $WAN2 -j SNAT --to-source 192.168.2.1
[[ $VPN ]] && $IPTABLES -t nat -A POSTROUTING -o $VPNIF -j SNAT --to-source $VPNCLIENTIP
EOF

결과:

$ bash /tmp/rules.bash
nft add rule ip mangle PREROUTING counter meta mark set ct mark
nft add rule ip mangle PREROUTING mark != 0x0 counter accept
nft add rule ip mangle PREROUTING ip saddr 192.168.0.5 tcp sport 50001 counter meta mark set 0x2 
nft add rule ip mangle PREROUTING ip saddr 192.168.0.3 counter meta mark set 0x2 
nft add rule ip mangle PREROUTING ip saddr 192.168.0.4 counter meta mark set 0x3 
nft add rule ip mangle POSTROUTING counter ct mark set mark
nft add rule ip nat POSTROUTING oifname "wan" counter snat to 192.168.1.1
nft add rule ip nat POSTROUTING oifname "wan2" counter snat to 192.168.2.1
nft add rule ip nat POSTROUTING oifname "vpnif" counter snat to 192.0.2.2

번역가가 일부 부분을 알지 못하거나 번역하지 못할 수도 있으며, 이런 일이 발생하면 해당 줄은 주석 처리됩니다. 예를 들면 다음과 같습니다.

$ /usr/sbin/iptables-translate -A INPUT -s 192.0.2.2 -j LED --led-trigger-id test
nft # -A INPUT -s 192.0.2.2 -j LED --led-trigger-id test 

이번 덤프의 번역에는 어떠한 코멘트도 포함되어 있지 않으므로, 번역이 양호하다고 짐작할 수 있습니다. 테이블 이름을 바꾸고, 올바르게 연결하고(그리고 내용을 변수에 다시 넣기) 선택 항목과 호환되도록 하십시오.nftables규칙 세트를 다시 사용하세요. 필요한 경우 개선하거나 단순화합니다(예: counter표현식은 디버깅이나 통계에만 사용되며 실제 작업에는 사용되지 않음).

다음에서 제공하는 새로운 기능으로 개선될 수 있습니다.nftables(예: 사용더 나은 분해된 매핑) 필요한 경우, 이는 이 답변의 범위를 벗어납니다.


참고: 번역을 맹목적으로 신뢰하지 마십시오.nftables그 속성을 여전히 이해해야 합니다.

번역 도구는 사용 맥락을 알지 못하므로 번역에서 발견된 표현과 문장을 확인한 후에도 OP는 여전히 이해해야 합니다. 나는 단지 OP가 필요하지 않은 예를 제시할 뿐입니다. 재라우팅이라는 특정 목적을 위해 OUTPUT 후크에 (conn) 플래그를 설정할 때(라우팅 전에 완료되었으므로 PREROUTING에 설정된 플래그에 대해 특별한 것은 없습니다. FORWARD에서는 작동하지 않습니다. 이를 수행하는 올바른 방법은 다음과 같습니다.nftables에 표시를 두는 것입니다.체인은type route hook output재라우팅을 트리거 하지 않고 type filter hook output:

지원되는 체인 유형

[...]

유형 가족 연결하다 설명하다
[...]
노선 아이피, 아이피6 산출 패킷이 이러한 유형의 체인을 통과하여 수락되려고 하는 경우 IP 헤더의 관련 부분이 변경되면 새로운 경로 조회가 수행됩니다. 이를 통해 nftables에서 정책 경로 선택기를 구현할 수 있습니다.

...진로를 바꾸려고요. 여기서는 nft add rule ip mangle OUTPUT자세히 다루지 않겠습니다 . 일반적으로으깨다방금 변신한필터그것을 사용할 때nftables. 사람들은 그것이 어떻게 작동하는지 이해해야 합니다. 번역이 모든 것을 해결하는 것은 아닙니다.

관련 정보