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にデフォルトゲートウェイを設定します。
動作確認 (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:~$