Vyatta(VyOS) NAT設定

スポンサーリンク

Vyatta(VyOS)で、NATを設定する方法をまとめます。留意点は、単純なNAT機能しか備えてない事です。ファイアウォール機器が備えるような、NAT ALG(Application Level Gateway)相当の機能は備えていません。また、6to4 NATも未実装です。

設定まとめ

Source NATの設定

Source NATをする時のパケットが出力されるインターフェースを指定します。LAN内の端末がインターネットに接続できるような要件を想定するならば、インターフェースはWAN側を指定します。

set nat source rule <ルール番号> outbound-interface <インターフェース>

以下のコマンドでNAT変換前のIPアドレスを指定します。192.168.10.0/24のように特定のセグメントのみを指定すれば、LAN内の一部端末がインターネットへの接続が可能になります。他方、0.0.0.0/0のように指定すれば、全ての端末がインターネットへの接続が可能です。

set nat source rule <ルール番号> source address <プライベートアドレス>

以下のコマンドでNAT変換後のIPアドレスを指定します。

set nat source rule <ルール番号> translation address <グローバルアドレス>

Destination NATの設定

Destination NATをする時のパケットが入力されるインターフェースを指定します。LAN内のサーバがインターネットに公開する要件を想定するならば、インターフェースはWAN側を指定します。

set nat destination rule <ルール番号> inbound-interface <インターフェース>

以下のコマンドでNAT変換前のIPアドレスを指定します。

set nat destination rule <ルール番号> destination address <グローバルアドレス>

以下のコマンドでNAT変換後のIPアドレスを指定します。

set nat destination rule <ルール番号> translation address <プライベートアドレス>

全ての通信ではなく、特定のプロトコルのみをNATさせる場合は以下のような指定をします。

set nat destination rule <ルール番号> protocol <プロトコル名>

以下のコマンドで特定のポート番号のみをNATさせる事ができます。このコマンドを使用できるのは、protocolでTCPまたはUDPを指定した場合のみです。

set nat destination rule <ルール番号> destination port <ポート番号>

動作確認

動作確認の構成

以下の環境で動作確認を行います。vy001とvy002はLAN内のサーバを想定し、vy003はNAT境界です。vy004とvy005はインターネット内の端末を想定しています。

NATによって疎通を担保しますので、デフォルトゲートウェイを設定するのはvy001とvy002のみとします。

+-------------------+   +-------------------+
|       vy001       |   |       vy002       |
|                   |   |                   |
+---------+---------+   +---------+---------+
     eth0 | .1               eth0 | .2
          |                       |
          +-----------+-----------+
                      | 192.168.123.0/24
                      | 
                 eth0 | .3
            +---------+---------+
            |       vy003       |
            |                   |
            +---------+---------+
                 eth1 | .3
                      | 
                      | 200.0.0.0/24
          +-----------+-----------+
          |                       |
     eth0 | .4               eth0 | .5
+---------+---------+   +---------+---------+
|       vy004       |   |       vy005       |
|                   |   |                   |
+-------------------+   +-------------------+

初期設定

IPv4アドレスは付与済とします。vy001とvy002にデフォルトゲートウェイを設定します。

vy001 : VyOS 1.4
set interfaces ethernet eth0 address '192.168.123.1/24'
set interfaces ethernet eth0 hw-id '00:50:56:8e:74:ec'
set interfaces loopback lo
set protocols static route 0.0.0.0/0 next-hop 192.168.123.3
set service ssh
set system config-management commit-revisions '100'
set system console device ttyS0 speed '115200'
set system host-name 'vy001'
set system login user vyos authentication encrypted-password '$6$zYTPVWgiXCYwqR4k$VP3ph1IH9VU6eJdSfnfWzKtfobXlS2qXd4YNgYWPKvWoDPdxlgEqP78IvHixH52X7DAtt5blGjTX97eXxVZYb0'
set system ntp server time1.vyos.net
set system ntp server time2.vyos.net
set system ntp server time3.vyos.net
set system syslog global facility all level 'info'
set system syslog global facility protocols level 'debug'
vy002 : VyOS 1.4
set interfaces ethernet eth0 address '192.168.123.2/24'
set interfaces ethernet eth0 hw-id '00:50:56:8e:45:5e'
set interfaces loopback lo
set protocols static route 0.0.0.0/0 next-hop 192.168.123.3
set service ssh
set system config-management commit-revisions '100'
set system console device ttyS0 speed '115200'
set system host-name 'vy002'
set system login user vyos authentication encrypted-password '$6$/asgxjH0KMjOXjpU$KW3GLcvtbyNl8o7/KNAvp0XFLq4OQtICnptLCfaDSlaWPbdGwjYvnb8qlYuOm6qNymwh7OApA2ew48v8F3wJp/'
set system ntp server time1.vyos.net
set system ntp server time2.vyos.net
set system ntp server time3.vyos.net
set system syslog global facility all level 'info'
set system syslog global facility protocols level 'debug'
vy003 : VyOS 1.4
set interfaces ethernet eth0 address '192.168.123.3/24'
set interfaces ethernet eth0 hw-id '00:50:56:8e:01:93'
set interfaces ethernet eth1 address '200.0.0.3/24'
set interfaces ethernet eth1 hw-id '00:50:56:8e:fd:95'
set interfaces loopback lo
set service ssh
set system config-management commit-revisions '100'
set system console device ttyS0 speed '115200'
set system host-name 'vy003'
set system login user vyos authentication encrypted-password '$6$ugz/GDjnJVFW/ilJ$XWE2zvCLEcqro/uP9c/3ir28Gnl0N24svZh/z7thcw8loPyr2AZllbrBsgpp5a.HWIzK.SDW9Kehbl0yL75A40'
set system ntp server time1.vyos.net
set system ntp server time2.vyos.net
set system ntp server time3.vyos.net
set system syslog global facility all level 'info'
set system syslog global facility protocols level 'debug'
vy004 : VyOS 1.4
set interfaces ethernet eth0 address '192.168.1.196/24'
set interfaces ethernet eth0 address '200.0.0.4/24'
set interfaces ethernet eth0 hw-id '00:50:56:90:d3:1c'
set interfaces loopback lo
set service ssh
set system config-management commit-revisions '100'
set system console device ttyS0 speed '115200'
set system host-name 'vy004'
set system login user vyos authentication encrypted-password '$6$tMjC07ln2rEuCnYQ$NrbFEUQTzGprNHwkxo5skkG5h4rX1G6RQxdpo61p3MF77PluwdJgfP9UlYT7f1Nr.gIFKoQdAsKRBykNU24.I/'
set system login user vyos authentication plaintext-password ''
set system ntp server time1.vyos.net
set system ntp server time2.vyos.net
set system ntp server time3.vyos.net
set system syslog global facility all level 'info'
set system syslog global facility protocols level 'debug'
vy005 : VyOS 1.4
set interfaces ethernet eth0 address '192.168.1.196/24'
set interfaces ethernet eth0 address '200.0.0.5/24'
set interfaces ethernet eth0 hw-id '00:50:56:90:76:19'
set interfaces loopback lo
set service ssh
set system config-management commit-revisions '100'
set system console device ttyS0 speed '115200'
set system host-name 'vy005'
set system login user vyos authentication encrypted-password '$6$tMjC07ln2rEuCnYQ$NrbFEUQTzGprNHwkxo5skkG5h4rX1G6RQxdpo61p3MF77PluwdJgfP9UlYT7f1Nr.gIFKoQdAsKRBykNU24.I/'
set system login user vyos authentication plaintext-password ''
set system ntp server time1.vyos.net
set system ntp server time2.vyos.net
set system ntp server time3.vyos.net
set system syslog global facility all level 'info'
set system syslog global facility protocols level 'debug'

動作確認 (1) Source NAT – インターネットへの接続

vy003にSource NATを設定し、LAN(vy001, vy002)がWAN(vy004, vyoo5)へ接続可能になるようにします。設定例は以下の通りです。

[vy003:VyOS1.4]
set nat source rule 100 outbound-interface 'eth1'
set nat source rule 100 source address '0.0.0.0/0'
set nat source rule 100 translation address '200.0.0.3'

以下のshowコマンドで変換ルールを確認します。

[vy003:VyOS1.4]
vyos@vy003:~$ show nat source rules 
Rule       Source                                             Translation                                        Outbound Interface
----       ------                                             -----------                                        ------------------
100                                                           200.0.0.3                                          eth1      
vyos@vy003:~$ 

vy001(LAN)からvy004(WAN)へのpingを実行します。

[vy001:VyOS1.4]
vyos@vy001:~$ ping 200.0.0.4
PING 200.0.0.4 (200.0.0.4) 56(84) bytes of data.
64 bytes from 200.0.0.4: icmp_seq=1 ttl=63 time=1.23 ms
64 bytes from 200.0.0.4: icmp_seq=2 ttl=63 time=0.882 ms
64 bytes from 200.0.0.4: icmp_seq=3 ttl=63 time=0.869 ms

 <omitted>

念の為、tcpdumpで想定通りのアドレス変換がなされている事を確認します。送信元IPアドレスが192.168.123.1から200.0.0.3へ変換されている事が分かります。

[vy004:VyOS1.4]
root@vy004:~# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
02:54:50.058530 IP 200.0.0.3 > 200.0.0.4: ICMP echo request, id 55445, seq 24, length 64
02:54:50.058579 IP 200.0.0.4 > 200.0.0.3: ICMP echo reply, id 55445, seq 24, length 64
02:54:51.105362 IP 200.0.0.3 > 200.0.0.4: ICMP echo request, id 55445, seq 25, length 64
02:54:51.105432 IP 200.0.0.4 > 200.0.0.3: ICMP echo reply, id 55445, seq 25, length 64
^C
4 packets captured
4 packets received by filter
0 packets dropped by kernel
root@vy004:~# 

動作確認 (1) Source NAT – インターネットへの接続

vy003にSource NATを設定し、LAN(vy001, vy002)がWAN(vy004, vyoo5)へ接続可能になるようにします。設定例は以下の通りです。

[vy003:VyOS1.4]
set nat source rule 100 outbound-interface 'eth1'
set nat source rule 100 source address '0.0.0.0/0'
set nat source rule 100 translation address '200.0.0.3'

以下のshowコマンドで変換ルールを確認します。

[vy003:VyOS1.4]
vyos@vy003:~$ show nat source rules 
Rule       Source                                             Translation                                        Outbound Interface
----       ------                                             -----------                                        ------------------
100                                                           200.0.0.3                                          eth1      
vyos@vy003:~$ 

vy001(LAN)からvy004(WAN)へのpingを実行します。

[vy001:VyOS1.4]
vyos@vy001:~$ ping 200.0.0.4
PING 200.0.0.4 (200.0.0.4) 56(84) bytes of data.
64 bytes from 200.0.0.4: icmp_seq=1 ttl=63 time=1.23 ms
64 bytes from 200.0.0.4: icmp_seq=2 ttl=63 time=0.882 ms
64 bytes from 200.0.0.4: icmp_seq=3 ttl=63 time=0.869 ms

 <omitted>

念の為、tcpdumpで想定通りのアドレス変換がなされている事を確認します。送信元IPアドレスが192.168.123.1から200.0.0.3へ変換されている事が分かります。

[vy004:VyOS1.4]
root@vy004:~# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
02:54:50.058530 IP 200.0.0.3 > 200.0.0.4: ICMP echo request, id 55445, seq 24, length 64
02:54:50.058579 IP 200.0.0.4 > 200.0.0.3: ICMP echo reply, id 55445, seq 24, length 64
02:54:51.105362 IP 200.0.0.3 > 200.0.0.4: ICMP echo request, id 55445, seq 25, length 64
02:54:51.105432 IP 200.0.0.4 > 200.0.0.3: ICMP echo reply, id 55445, seq 25, length 64
^C
4 packets captured
4 packets received by filter
0 packets dropped by kernel
root@vy004:~# 

動作確認 (1) Source NAT – インターネットへの接続

vy003にSource NATを設定し、LAN(vy001, vy002)がWAN(vy004, vyoo5)へ接続可能になるようにします。設定例は以下の通りです。

[vy003:VyOS1.4]
set nat source rule 100 outbound-interface 'eth1'
set nat source rule 100 source address '0.0.0.0/0'
set nat source rule 100 translation address '200.0.0.3'

以下のshowコマンドで変換ルールを確認します。

[vy003:VyOS1.4]
vyos@vy003:~$ show nat source rules 
Rule       Source                                             Translation                                        Outbound Interface
----       ------                                             -----------                                        ------------------
100                                                           200.0.0.3                                          eth1      
vyos@vy003:~$ 

vy001(LAN)からvy004(WAN)へのpingを実行します。

[vy001:VyOS1.4]
vyos@vy001:~$ ping 200.0.0.4
PING 200.0.0.4 (200.0.0.4) 56(84) bytes of data.
64 bytes from 200.0.0.4: icmp_seq=1 ttl=63 time=1.23 ms
64 bytes from 200.0.0.4: icmp_seq=2 ttl=63 time=0.882 ms
64 bytes from 200.0.0.4: icmp_seq=3 ttl=63 time=0.869 ms

 <omitted>

念の為、tcpdumpで想定通りのアドレス変換がなされている事を確認します。送信元IPアドレスが192.168.123.1から200.0.0.3へ変換されている事が分かります。

[vy004:VyOS1.4]
root@vy004:~# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
02:54:50.058530 IP 200.0.0.3 > 200.0.0.4: ICMP echo request, id 55445, seq 24, length 64
02:54:50.058579 IP 200.0.0.4 > 200.0.0.3: ICMP echo reply, id 55445, seq 24, length 64
02:54:51.105362 IP 200.0.0.3 > 200.0.0.4: ICMP echo request, id 55445, seq 25, length 64
02:54:51.105432 IP 200.0.0.4 > 200.0.0.3: ICMP echo reply, id 55445, seq 25, length 64
^C
4 packets captured
4 packets received by filter
0 packets dropped by kernel
root@vy004:~# 

動作確認 (2) Destination NAT – サーバの公開

vy003にDestination NATを設定し、LAN(vy001)がWAN(vy004, vyoo5)からの接続が可能になるようにします。

まずはvy001でサーバを擬似します。以下のコマンドを使用する事で、vy001にhttpsサーバを起動させる事ができます。

[vy001:VyOS1.4]
set service https 

前述のSource NATで使用した200.0.0.3以外のIPアドレスを使用したいならば、以下のようなコマンドでvy003に複数のIPアドレスを付与することもできます。VyOSにはセカンダリアドレスの概念はなく以下のような指定になります。

[vy003:VyOS1.4]
set interfaces ethernet eth1 address 200.0.0.31/24

確かにIPアドレスが複数付与されている事を確認します。

[vy003:VyOS1.4]
vyos@vy003:~$ show interfaces 
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             192.168.123.3/24                  u/u  
eth1             200.0.0.3/24                      u/u  
                 200.0.0.31/24                          
lo               127.0.0.1/8                       u/u  
                 ::1/128                                
vyos@vy003:~$ 

tcp443のみをNATするdestination NATのルールを設定します。

[vy003:VyOS1.4]
set nat destination rule 90 destination address '200.0.0.31'
set nat destination rule 90 destination port '443'
set nat destination rule 90 inbound-interface 'eth1'
set nat destination rule 90 protocol 'tcp'
set nat destination rule 90 translation address '192.168.123.1'

以下のshowコマンドで変換ルールの確認を試みます。tcpポート単位のNATをする場合は、showコマンドで確認できません。VyOSは多少の不具合は付き物ですので、こういう物だと思って接しましょう。

[vy003:VyOS1.4]
vyos@vy003:~$ show nat destination rules 
Traceback (most recent call last):
  File "/usr/libexec/vyos/op_mode/show_nat_rules.py", line 86, in <module>
Rule       Destination                                        Translation                                        Inbound Interface
----       -----------                                        -----------                                        -----------------
    port_range = srcdest_json['set'][0]['range']
TypeError: 'int' object is not subscriptable
vyos@vy003:~$

vy004(WAN)からvy001(LAN)へのhttps接続を試みます。

[vy004:VyOS1.4]
vyos@vy004:~$ curl -I -k https://200.0.0.31/
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sat, 21 Aug 2021 03:10:03 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 21 Apr 2020 14:09:01 GMT
Connection: keep-alive
ETag: "5e9efe7d-264"
Accept-Ranges: bytes

vyos@vy004:~$ 

vy001(LAN)のアクセスログを見て、確かにvy004からのアクセスがあった事を確認します。

[vy004:VyOS1.4]
vyos@vy001:~$ tail -n1 /var/log/nginx/access.log 
200.0.0.4 - - [21/Aug/2021:03:10:03 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.74.0"
vyos@vy001:~$ 

動作確認 (3) 1 to 1 NAT

vy003に1:1 NATの設定をし、vy002がWANとの送受信が可能になるようにします。1:1 NATは前述の説明のSource NATとDestination NATの組み合わせです。

まず、動作確認しやすいようにvy002でhttpsサーバを起動します。

[vy002:VyOS1.4]
set service https 

1:1 NATの検証向けに、IPアドレスを1つ新設します。

[vy003:VyOS1.4]
set interfaces ethernet eth1 address 200.0.0.32/24

確かにIPアドレスが複数付与されている事を確認します。

[vy003:VyOS1.4]
vyos@vy003:~$ show interfaces 
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             192.168.123.3/24                  u/u  
eth1             200.0.0.3/24                      u/u  
                 200.0.0.31/24                          
                 200.0.0.32/24                          
lo               127.0.0.1/8                       u/u  
                 ::1/128                               
vyos@vy003:~$ 

vy002がWANとの送受信が可能になるような1:1 NATを設定します。なお、NATのルール番号は若番が優先されますので、今まで設定したNATルールよりも若い番号を付与して下さい。

[vy003:VyOS1.4]
set nat destination rule 80 destination address '200.0.0.32'
set nat destination rule 80 inbound-interface 'eth1'
set nat destination rule 80 translation address '192.168.123.2'
set nat source rule 80 outbound-interface 'eth1'
set nat source rule 80 source address '192.168.123.2'
set nat source rule 80 translation address '200.0.0.32'

以下のshowコマンドで変換ルールを確認します。

[vy003:VyOS1.4]
vyos@vy003:~$ show nat source rules 
Rule       Source                                             Translation                                        Outbound Interface
----       ------                                             -----------                                        ------------------
80         192.168.123.2                                      200.0.0.32                                         eth1      
100                                                           200.0.0.3                                          eth1      
vyos@vy003:~$ 
vyos@vy003:~$ 
vyos@vy003:~$ show nat destination rules 
Traceback (most recent call last):
  File "/usr/libexec/vyos/op_mode/show_nat_rules.py", line 86, in <module>
Rule       Destination                                        Translation                                        Inbound Interface
----       -----------                                        -----------                                        -----------------
80         200.0.0.32                                         192.168.123.2                                      eth1      
    port_range = srcdest_json['set'][0]['range']
TypeError: 'int' object is not subscriptable
vyos@vy003:~$ 

vy005(WAN)からvy002(LAN)へのhttps接続を試みます。想定通りvy005からの接続かどうかをアクセスログより判断します。

[vy005:VyOS1.4]
vyos@vy005:~$ curl -I -k https://200.0.0.32/
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sat, 21 Aug 2021 03:24:51 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 21 Apr 2020 14:09:01 GMT
Connection: keep-alive
ETag: "5e9efe7d-264"
Accept-Ranges: bytes

vyos@vy005:~$ 

[vy002:VyOS1.4]
vyos@vy002:~$ tail -n1 /var/log/nginx/access.log 
200.0.0.5 - - [21/Aug/2021:03:24:51 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.74.0"
vyos@vy002:~$ 

vy002(LAN)からvy005(WAN)へのssh接続を試みます。ssコマンド(netstatコマンド相当)により確かに想定通りのアドレス変換がなされた事を確認します。

[vy002:VyOS1.4]
vyos@vy002:~$ ssh 200.0.0.5
The authenticity of host '200.0.0.5 (200.0.0.5)' can't be established.
ECDSA key fingerprint is SHA256:KKUC/o2gw/40+vMa2ZFHivI8qhFJb+IWQe40LaUf1Qo.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '200.0.0.5' (ECDSA) to the list of known hosts.
Welcome to VyOS
vyos@200.0.0.5's password: 
Linux vy005 5.10.57-amd64-vyos #1 SMP Mon Aug 9 06:21:32 UTC 2021 x86_64

The programs included with the Debian/VyOS GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian/VyOS GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

Last login: Sat Aug 21 03:24:31 2021 from 192.168.10.100
vyos@vy005:~$ 
vyos@vy005:~$
vyos@vy005:~$ ss -ano | grep :22 | grep ESTAB
tcp   ESTAB  0      0                                       200.0.0.5:22            200.0.0.32:37422 timer:(keepalive,118min,0)
vyos@vy005:~$  
タイトルとURLをコピーしました