うまいぼうぶろぐ

linuxとhttpdとperlのメモ

big-ip source nat part2

hogem.hatenablog.com
追記で書いたけど↑は任意のsourceからとあるStandardなVirtualServerへアクセスしたときのsource nat
とはいえ結局はnatなので半分ぐらいかぶってる。


今回は宛先がVirtualServerではなくて、
特定のserverからbig-ipをdefault gatewayとして抜けていって、他のnetworkへアクセスするときの話。

具体的に言うとdmz(or trustでもいいけど)から
internet(untrust)や違うvlan dmz2 などへアクセスする場合

前提

big-ipがルータとなる場合、networkを跨った通信はデフォルトでは許可されない。

typeをForwarding としたVirtualServerの作成が必要。

type: Forwarding (IP)
Source: 通信を許可するsource IP anyの場合は0.0.0.0/0
Destination: 通信を許可するdestination IP
Service Port: 0 (* All Ports)
  (特定portのみに制限することも可能だけど、通常forwardingの場合はall)
VLAN and Tunnel Traffic: 通常は特定の通信だけを設定すると思うのでALL Vlansではなく
   Enabled Onにしてsourceで通すvlan を選択
Source Address Translation: 後述


NATする箇所はおおまかに3通り

  • 特定のhostだけSNATするときはSNAT Listが、
  • subnetをまとめてSNATするときはForwarding Virtualserverで、
  • subnetをまとめてSNATするけど、特定のhostだけ個別のIPでSNATさせたい場合はiRuleっていう感じ?


おまけ:
VirtualServerの適用はlonguest matchで適用されるので

  • 特定IP/Portの場合は
  • 特定のtcp profileを適用して (ex: timeoutを伸ばす)
  • NATするIPを変える

というようなことも可能
おまけここまで


Address Translation : SNAT List

Forwarding VirtualServerでまとめてNATするのではなくて
特定のaddress(s)を個別にNATするときに使う。

SNAT Listを設定していてもForwarding VirtualServerでSNATが設定されていた場合、
そちらのでSNATが優先される。

Forwading VirtualServer 単位でNAT

Source Address TranslationでNoneではなく次の2つのどちらかを選ぶ。
通常はauto mapで良いはず。

  • Auto Map: destinationに適したegressなinterfaceのfloating ipが自動的に選ばれる
  • SNAT: あらかじめ設定しておいたSNAT Poolから選択

例えばdmz の任意のserverがuntrustへ抜けていくときに
まとめてとあるグローバルIPでNATさせたい場合に。

SNAT ListよりもこちらのSNATが優先される。

iRule でNAT

http://hogem.hatenablog.com/entry/20150110/1420894082
これと同じ内容。
条件がマッチした場合はVirtualServerのSNATよりもさらに優先される。

個人的には誤操作による削除防止の観点からも、SNAT Poolを作っておいて
irule内でsnatpool snatpool-hogehoge などとするほうが良い気がする。

# list ltm snatpool snatpool1 one-line
ltm snatpool snatpool1 { members { 192.0.2.11 } }
# list ltm snatpool snatpool2 one-line
ltm snatpool snatpool2 { members { 192.0.2.12 } }
	
### forwarding virtual serverに適用するirule
when CLIENT_ACCEPTED {
  if { [IP::addr [IP::client_addr] equals 10.0.0.11/32] } {
    snatpool snatpool1
  }
  elseif { [IP::addr [IP::client_addr] equals 10.0.0.12/32] } {
    snatpool snatpool2
  }
  else {
    snat automap
  }
}

まとめ

big-ipは仕様上、他で適用されている設定は削除できない。
(virtualhost適用済みのpool/irule、iruleに適用しているsnat poolなど)
ただSNAT Listだけはそうじゃないみたいなので、
特定のhostだけSNATをする場合でも、snat poolを作ってそれをiruleで指定するほうが安全?