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を跨った通信はデフォルトでは許可されない。

NATするか、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する箇所はおおまかに4通り

  • 双方向通信が必要なNATはNAT List
  • 特定のhost(s)だけSNATするときはSNAT List
  • subnetをまとめてSNATするときはForwarding Virtualserverで、
  • subnetをまとめてSNATするけど、特定のhostだけ個別のIPでSNATさせたい場合はiRuleっていう感じ?


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

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

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

http://hogem.hatenablog.com/entry/2015/11/07/233000

Address Translation : NAT List

1:1 NAT 双方向

NAT Address: 172.16.0.1
Origin Address: 10.0.0.1
とすると、10.0.0.1 がbig-ipを抜けて外へ通信する際に172.16.0.1になり、
外のサーバから172.16.0.1へアクセスすると10.0.0.1宛にパケットが届く。

172.16.0.1のアドレスでpingが応答したので双方向NATだと思い込んでたけど
pingはSNATを定義したらbig-ipが応答するようになるだけなので、双方向NATではなかった。

NAT Listで1:1 NATする場合は、forwarding virtual serverの設定しなくても
vlanを跨いで通信は可能になる。

あと、NAT Listで定義してもforwarding virtual server でNAT設定があったら、そちらが有効になるぽい。
(なんしか、big-ipはvirtual serverが最優先されると思っていたらいい?)

Address Translation : SNAT List

N:1 NAT 片方向
複数のprivate IP を特定のgloabal IPにNATする場合など。
Forwarding VirtualServerでまとめてNATするのではなくて
特定のaddress(s)を個別にNATするときに使う。

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

Origin IPを指定する時点で不要な気もするが、送信元をvlanを限定したい場合は
VLAN / Tunnel Traffic をEnabled onにしてVLANを選択する

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で指定するほうが安全?
その分iruleが複雑になっていくのでどっち選ぶかは運用次第。