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を変える
というようなことも可能
おまけここまで
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が複雑になっていくのでどっち選ぶかは運用次第。