Вот то, что я придумал. Это работает, хотя я не уверен, оптимально ли это. Приветствующиеся предложения!
interface IncomingTunnel0
ipv6 traffic-filter exterior-in6 in
ipv6 traffic-filter exterior-out6 out
interface LocalLan0
ipv6 traffic-filter interior-in6 in
ipv6 traffic-filter interior-out6 out
ipv6 access-list exterior-in6
evaluate exterior-reflect sequence 1
permit ipv6 any host EXTERNAL_ROUTER_ADDRESS sequence 10
permit tcp any host INTERNAL_ROUTER_ADDRESS eq 22 sequence 11
permit tcp any host INTERNAL_SERVER_ADDRESS eq 22 sequence 100
permit icmp any any sequence 800
deny ipv6 any any sequence 1000
ipv6 access-list exterior-out6
sequence 10 permit ipv6 MY_ASSIGNED_SUBNET::/48 any reflect exterior-reflect
ipv6 access-list interior-in6
permit ipv6 fe80::/10 any
permit ipv6 INTERNAL_LAN_SUBNET::/64 any
ipv6 access-list interior-out6
permit ipv6 any any
Для тех из Вас не знакомый с рефлексивными списками доступа, это - как Вы делаете отслеживание соединения с сохранением информации. Другими словами, это - то, что позволяет ответам на те исходящие соединения возвращаться Вам.
I'd really recommend using inspection instead of reflexive access lists - e.g:
ipv6 inspect name IPV6FIREWALLINSPECT tcp
ipv6 inspect name IPV6FIREWALLINSPECT udp
ipv6 inspect name IPV6FIREWALLINSPECT icmp
int IncomingTunnel0
ipv6 inspect IPV6FIREWALLINSPECT out
ipv6 traffic-filter IPV6FIREWALL in
ipv6 access-list IPV6FIREWALL
sequence 10 permit (explicit inbound traffic)
sequence 20 deny ipv6 any any
Much cleaner config. sho ipv6 inspect session will show you all the outbound sessions for which return traffic is permitted.