前回の続きです。
目次
conntrack-syncを使ったクラスタ間のconntrackテーブルの同期
conntrack-syncを使うと、Activeに障害がおきてStandbyに切り替わった場合でもセッションを引き継ぐことができます(ステートフルフェイルオーバー)。
1系2系の両方に設定を入れていきます。configモードに移って以下を実行します。
vagrant@vyos-1:~$ config vagrant@vyos-1# set service conntrack-sync accept-protocol 'tcp,udp,icmp' vagrant@vyos-1# set service conntrack-sync failover-mechanism cluster group VyOS-Cluster vagrant@vyos-1# set service conntrack-sync interface 'eth2' vagrant@vyos-1# set service conntrack-sync mcast-group '239.0.2.1' vagrant@vyos-1# set service conntrack-sync event-listen-queue-size '8' vagrant@vyos-1# set service conntrack-sync sync-queue-size '8'
- accept-protocolで同期するプロトコルを設定します。tcp/udp/icmpを指定します。
- failover-mechanismでfailoverするメカニズムを指定します。前回やったclusterを指定します。
- interfaceで同期に使用するインタフェースを指定します。ここでは内側のIFを指定しました。
- mcast-groupで同期情報をやりとりするマルチキャストグループを指定します。
- event-listen-queue-size/sync-queue-sizeで送信・受信のキューサイズを指定します(MB)。
commit/saveします。
vagrant@vyos-1# commit [ service conntrack-sync ] Stopping clustering...save Done Starting clustering... Done [edit] vagrant@vyos-1# save Saving configuration to '/config/config.boot'... Done [edit]
では動いているかを見ていきましょう。まずクラスタの状態は1系がActive、2系がStandbyになっています。
vagrant@vyos-1:~$ show cluster status === Status report on primary node vyos-1 === Primary vyos-1 (this node): Active Secondary vyos-2: Active (standby) Resources [172.16.0.10/24/eth1 192.168.0.10/24/eth2]: Active on primary vyos-1 (this node)
show conntrack-sync statusで状態を確認します。設定後にクラスタ切替を一度もやっていないので"no transition yet"になっているのかな。ExpectationSyncはFTPのようなマルチフローなプロトコルの同期を有効化すると出てくるみたいです。
vagrant@vyos-1:~$ show conntrack-sync status sync-interface : eth2 failover-mechanism : cluster [group VyOS-Cluster] last state transition : no transition yet! ExpectationSync : disabled
vagrant@vyos-2:~$ show conntrack-sync status sync-interface : eth2 failover-mechanism : cluster [group VyOS-Cluster] last state transition : no transition yet! ExpectationSync : disabled
show conntrack-sync statisticsで同期の統計情報を確認します。warning出てますね。バグかな?
vagrant@vyos-1:~$ show conntrack-sync statistics Main Table Statistics: [Wed Nov 4 03:39:46 2020] (pid=6993) [warning] deprecated nice configuration, ignoring. The nice value can be set externally with nice(1) and renice(1). [Wed Nov 4 03:39:46 2020] (pid=6993) [warning] deprecated unix backlog configuration, ignoring. cache internal: current active connections: 40 connections created: 151 failed: 0 connections updated: 165 failed: 0 connections destroyed: 111 failed: 0 cache external: current active connections: 4 connections created: 94 failed: 0 connections updated: 0 failed: 0 connections destroyed: 90 failed: 0 traffic processed: 0 Bytes 0 Pckts multicast traffic (active device=eth2): 41288 Bytes sent 26588 Bytes recv 1656 Pckts sent 1459 Pckts recv 0 Error send 0 Error recv message tracking: 0 Malformed msgs 0 Lost msgs
vagrant@vyos-2:~$ show conntrack-sync statistics Main Table Statistics: [Wed Nov 4 03:39:17 2020] (pid=5663) [warning] deprecated nice configuration, ignoring. The nice value can be set externally with nice(1) and renice(1). [Wed Nov 4 03:39:17 2020] (pid=5663) [warning] deprecated unix backlog configuration, ignoring. cache internal: current active connections: 9 connections created: 101 failed: 0 connections updated: 0 failed: 0 connections destroyed: 92 failed: 0 cache external: current active connections: 34 connections created: 139 failed: 0 connections updated: 165 failed: 0 connections destroyed: 105 failed: 0 traffic processed: 0 Bytes 0 Pckts multicast traffic (active device=eth2): 26020 Bytes sent 40580 Bytes recv 1428 Pckts sent 1623 Pckts recv 0 Error send 0 Error recv message tracking: 0 Malformed msgs 0 Lost msgs
Acive側でcache internal、Standby側でcache externalが多いのがわかりますね。違いが見えない場合はclient側から何度か通信を行ってあげるとわかりやすくなると思います。
DNAT+ファイアウォールルールで外部→内部へのアクセス
ここまででファイアウォール的な設定はぜんぜんやっていませんでした。ファイアウォールで通信を制限しつつDNATを追加して、よくある内部の公開をやってみたいと思います。こういう感じ。
これまでとは逆に、webserverをクライアント想定にして、中のclient-2でapacheを立ててアクセスします。yvosではTCP80だけを通す設定にしましょう。
client-2でapacheを上げて適当なコンテンツを用意しておきます。
[vagrant@client-2 ~]$ sudo systemctl start httpd [vagrant@client-2 ~]$ echo "client-2" | sudo tee /var/www/html/index.html [vagrant@client-2 ~]$ curl localhost client-2
まず、DNATの設定を行います。
vagrant@vyos-1:~$ configure vagrant@vyos-1# set nat destination rule 10 destination address 172.16.0.10 vagrant@vyos-1# set nat destination rule 10 destination port 80 vagrant@vyos-1# set nat destination rule 10 translation address 192.168.0.22 vagrant@vyos-1# set nat destination rule 10 translation port 80 vagrant@vyos-1# set nat destination rule 10 protocol tcp vagrant@vyos-1# set nat destination rule 10 inbound-interface eth1 vagrant@vyos-1# commit vagrant@vyos-1# save
webserver側からアクセスしてみましょう。
[vagrant@webserver ~]$ curl http://172.16.0.10 client-2
ちゃんと応答が返ってきていますね。ではファイアウォールの設定です。最初にルールを作成します。
vagrant@vyos-1:~$ config vagrant@vyos-1# set firewall name EX-IN default-action reject vagrant@vyos-1# set firewall name EX-IN rule 10 action accept vagrant@vyos-1# set firewall name EX-IN rule 10 state established enable vagrant@vyos-1# set firewall name EX-IN rule 10 state related enable vagrant@vyos-1# set firewall name EX-IN rule 20 action accept vagrant@vyos-1# set firewall name EX-IN rule 20 destination address 192.168.0.22 vagrant@vyos-1# set firewall name EX-IN rule 20 destination port 80 vagrant@vyos-1# set firewall name EX-IN rule 20 protocol tcp
EX-INという名前でルールを作成し、その中に2つのルールを設定しました。
- established/relatedなパケットは許可(ステートフルファイアウォール)
- client-2(192.168.0.22)宛のTCP80番ポートへの通信を許可
ルールをインタフェースに紐付けます。このとき、"in"を指定すると、eth1に入ってくるトラフィック、つまりDNATさせるトラフィックに対して制限がかかります。ルータ宛の場合は"local"になります。
vagrant@vyos-1# set interfaces ethernet eth1 firewall in name EX-IN
commit/saveします。ここで有効になります。
vagrant@vyos-1# commit vagrant@vyos-1# save
一度クラスタを切り替えます。切り替えないとwebserverからvyosのVIPのARPが取得できず、通信ができませんでした。ここはちょっとよくわかっていません。
vagrant@vyos-2:~$ force cluster active
では確認してみましょう。webserverから通信してみます。
[vagrant@webserver ~]$ curl http://172.16.0.10 client-2
できてますね。
さきほどファイアウォールを設定したのは"in"、DNATさせるトラフィックに対してだけでした。なので、直接vyosルータ宛へのトラフィックには制限がかかっていません。localに対してもルールを追加しましょう。
vagrant@vyos-1:~$ config vagrant@vyos-1# set firewall name EX-LOCAL default-action reject vagrant@vyos-1# set firewall name EX-LOCAL rule 10 action accept vagrant@vyos-1# set firewall name EX-LOCAL rule 10 state established enable vagrant@vyos-1# set firewall name EX-LOCAL rule 10 state related enable vagrant@vyos-1# set firewall name EX-LOCAL rule 20 action accept vagrant@vyos-1# set firewall name EX-LOCAL rule 20 protocol icmp vagrant@vyos-1# set interfaces ethernet eth1 firewall local name EX-LOCAL vagrant@vyos-1# commit vagrant@vyos-1# save
反映したあとはclusterを切り替えましょう。
vagrant@vyos-2:~$ force cluster active
確認します。
icmpはOKですね。
[vagrant@webserver ~]$ ping -c 3 172.16.0.10 PING 172.16.0.10 (172.16.0.10) 56(84) bytes of data. 64 bytes from 172.16.0.10: icmp_seq=1 ttl=64 time=0.502 ms 64 bytes from 172.16.0.10: icmp_seq=2 ttl=64 time=0.579 ms 64 bytes from 172.16.0.10: icmp_seq=3 ttl=64 time=0.700 ms --- 172.16.0.10 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 0.502/0.593/0.700/0.086 ms [vagrant@webserver ~]$ ping -c 3 172.16.0.11 PING 172.16.0.11 (172.16.0.11) 56(84) bytes of data. 64 bytes from 172.16.0.11: icmp_seq=1 ttl=64 time=0.475 ms 64 bytes from 172.16.0.11: icmp_seq=2 ttl=64 time=0.489 ms 64 bytes from 172.16.0.11: icmp_seq=3 ttl=64 time=0.666 ms --- 172.16.0.11 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 0.475/0.543/0.666/0.088 ms [vagrant@webserver ~]$ ping -c 3 172.16.0.12 PING 172.16.0.12 (172.16.0.12) 56(84) bytes of data. 64 bytes from 172.16.0.12: icmp_seq=1 ttl=64 time=0.501 ms 64 bytes from 172.16.0.12: icmp_seq=2 ttl=64 time=0.670 ms 64 bytes from 172.16.0.12: icmp_seq=3 ttl=64 time=0.669 ms --- 172.16.0.12 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2004ms rtt min/avg/max/mdev = 0.501/0.613/0.670/0.081 ms
sshはすべて拒否してますね。
[vagrant@webserver ~]$ ssh 172.16.0.10 ssh: connect to host 172.16.0.10 port 22: Connection refused [vagrant@webserver ~]$ ssh 172.16.0.11 ssh: connect to host 172.16.0.11 port 22: Connection refused [vagrant@webserver ~]$ ssh 172.16.0.12 ssh: connect to host 172.16.0.12 port 22: Connection refused
HTTPはNATに使用しているVIPだけ許可されます。
[vagrant@webserver ~]$ curl http://172.16.0.10 client-2 [vagrant@webserver ~]$ curl http://172.16.0.11 curl: (7) Failed connect to 172.16.0.11:80; 接続を拒否されました [vagrant@webserver ~]$ curl http://172.16.0.12 curl: (7) Failed connect to 172.16.0.12:80; 接続を拒否されました
これで完了です。
まとめ
VyOSのvagrant boxを使って色々検証してみました。インフラエンジニアのくせに、ネットワークはあまり自信がなくて(過去の職場ではサーバとネットワークが別部門に別れていたのです)、ちょっと手探りなところもありますが、vagrantで気楽に試せると勉強しやすくていいですね。
参考
以下のサイトを参考にさせてもらいました。ありがとうございました。