kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

VyOSでネットワークのおべんきょうをしてみる②

f:id:kun432:20201104114004p:plain

前回の続きです。

目次

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を追加して、よくある内部の公開をやってみたいと思います。こういう感じ。

f:id:kun432:20201104131941p:plain

これまでとは逆に、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で気楽に試せると勉強しやすくていいですね。

参考

以下のサイトを参考にさせてもらいました。ありがとうございました。