ラズパイで簡単なNATコンバータを使ってiptablesコマンドからIoTファイアウォールの理解を深める
※ 当ページには【広告/PR】を含む場合があります。
2022/12/11
おさらい〜ラズパイで簡単なNATコンバータを構成する
1. DHCPサーバー(ここではisc-dhcp-server)をセットアップする
2. ラズパイ側のIPアドレスを固定する(etc/dhcpcd.conf)
3. DNSレゾルバー(ここではdnsmasq)をセットアップする
4. IPv4のパケット転送を有効にする(/etc/sysctl.conf)
5. ファイアウォールにルールを追加する(iptables)
isc-dhcp-server(DHCPサーバー)のセットアップ
$ ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether 11:11:11:22:22:22 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 11:11:11:33:33:33 brd ff:ff:ff:ff:ff:ff
inet 192.168.x.y/24 brd 192.168.x.z scope global noprefixroute wlan0
valid_lft forever preferred_lft forever
inet6 2001:1111:1111:1111:2222:2222:2222:2222/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 296sec preferred_lft 296sec
inet6 fe80:1111:1111:1111:2222:2222/64 scope link
valid_lft forever preferred_lft forever
lo(ローカルホスト=127.0.0.1)
wlan0(WiFiネットワークデバイス)
eth0(有線LANデバイス)
$ ip route show
default via 192.168.x.1 dev wlan0 src 192.168.x.y metric 303
192.168.x.0/24 dev wlan0 proto dhcp scope link src 192.168.x.y metric 303
eth0
DHCPサーバー
isc-dhcp-server
$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt install -y isc-dhcp-server
/etc/dhcp/dhcpd.conf
x = ...
#...中略
#👇DNSレゾルバーはdnsmasqにお任せするため、以下はコメントアウト
#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;
#...中略
#👇デフォルトのDHCPサーバー以外を利用するためコメントアウト
authoritative;
#👇追記
subnet 192.168.x.0 netmask 255.255.255.0 {
range 192.168.x.11 192.168.x.20;
option routers 192.168.x.1;
option domain-name-servers 192.168.x.1;
option broadcast-address 192.168.x.255;
ignore declines;
}
eth0
#...
#👇eth0を追加
INTERFACESv4="eth0"
#👇IPv6は今回利用しない
#INTERFACESv6=""
#...
isc-dhcp-server
$ sudo systemctl enable isc-dhcp-server
isc-dhcp-server.service is not a native service, redirecting to systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable isc-dhcp-server
isc-dhcp-server
$ systemctl status isc-dhcp-server
● isc-dhcp-server.service - LSB: DHCP server
Loaded: loaded (/etc/init.d/isc-dhcp-server; generated)
Active: failed (Result: exit-code) since Thu 2022-12-08 12:00:48 JST; 35s ago
Docs: man:systemd-sysv-generator(8)
Process: 536 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=1/FAILURE)
#...
ルーター(ラズパイ)側のIPアドレスを固定する
192.168.***.1
/etc/dhcpcd.conf
#...
#👇以下を追加
interface eth0
static ip_address=192.168.x.1/24
static routers=0.0.0.0
static domain_name_servers=0.0.0.0
#...
routers
domain_name_servers
0.0.0.0
wlan0
dnsmasq(DNSレゾルバー)のセットアップ
dnsmasq
$ sudo apt install -y dnsmasq
$ systemctl status dnsmasq
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset:
#...
IPv4のパケット転送を有効にする
/etc/sysctl.conf
net.ipv4.ip_forward=1
iptablesからNATコンバーターのルールを追加する
$ systemctl status isc-dhcp-server
● isc-dhcp-server.service - LSB: DHCP server
Loaded: loaded (/etc/init.d/isc-dhcp-server; generated)
Active: active (running) since Thu 2022-12-08 14:04:28 JST; 8min ago
Docs: man:systemd-sysv-generator(8)
Process: 585 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=
Tasks: 1 (limit: 2178)
CGroup: /system.slice/isc-dhcp-server.service
└─644 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf eth0
#...
$ ip address show
#...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
#...
☆ inet 192.168.xxx.1/24 brd 192.168.xxx.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
#...
$ ip route show
default via 192.168.zzz.1 dev wlan0 src 192.168.zzz.250 metric 303
#...
192.168.xxx.0/24 dev eth0 proto dhcp scope link src 192.168.xxx.1 metric 202
eth0
192.168.xxx.0/24
$ ip address show
#...
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
#...
☆inet 192.168.xxx.11/24 brd 192.168.xxx.255 scope global dynamic noprefixroute enp0s25
valid_lft 497sec preferred_lft 497sec
#...
192.168.xxx.11
$ sudo iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
ping
$ ping -c 4 192.168.xxx.1
PING 192.168.xxx.1 (192.168.xxx.1) 56(84) bytes of data.
64 bytes from 192.168.xxx.1: icmp_seq=1 ttl=64 time=0.569 ms
64 bytes from 192.168.xxx.1: icmp_seq=2 ttl=64 time=0.414 ms
64 bytes from 192.168.xxx.1: icmp_seq=3 ttl=64 time=0.343 ms
64 bytes from 192.168.xxx.1: icmp_seq=4 ttl=64 time=0.328 ms
--- 192.168.xxx.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3061ms
rtt min/avg/max/mdev = 0.328/0.413/0.569/0.095 ms
$ sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
$ sudo iptables -t nat -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
24 2675 MASQUERADE all -- * wlan0 0.0.0.0/0 0.0.0.0/0
$ ping -c 4 www.google.com
PING www.google.com (xxx.xxx.xxx.xxx) 56(84) bytes of data.
64 bytes from n********.*****0.net (xxx.xxx.xxx.xxx): icmp_seq=1 ttl=110 time=50.8 ms
64 bytes from n********.*****0.net (xxx.xxx.xxx.xxx): icmp_seq=2 ttl=110 time=62.3 ms
64 bytes from n********.*****0.net (xxx.xxx.xxx.xxx): icmp_seq=3 ttl=110 time=60.1 ms
64 bytes from n********.*****0.net (xxx.xxx.xxx.xxx): icmp_seq=4 ttl=110 time=59.0 ms
--- www.google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 50.821/58.041/62.262/4.333 ms
rc.local
ちょっと脇道〜ラズパイ・ルーターでIPv6は取り扱えるの?
IPv6
$ ping6 -c 4 www.google.com
PING www.google.com(n*******.*******0.net (2404:xxxx:xxxx:xxxx:xxxx:xxxx)) 56 data bytes
64 bytes from n*******.*******0.net (2404:xxxx:xxxx:xxxx:xxxx:xxxx): icmp_seq=1 ttl=113 time=48.3 ms
64 bytes from n*******.*******0.net (2404:xxxx:xxxx:xxxx:xxxx:xxxx): icmp_seq=2 ttl=113 time=57.7 ms
64 bytes from n*******.*******0.net (2404:xxxx:xxxx:xxxx:xxxx:xxxx): icmp_seq=3 ttl=113 time=55.8 ms
64 bytes from n*******.*******0.net (2404:xxxx:xxxx:xxxx:xxxx:xxxx): icmp_seq=4 ttl=113 time=53.8 ms
--- www.google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 9ms
rtt min/avg/max/mdev = 48.274/53.878/57.669/3.517 ms
$ ping6 -c 4 www.google.com
ping6: connect: ネットワークに届きません
$ ip address show
...
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
#👇無効なipv6
inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link noprefixroute
ラズパイNATコンバータでiptablesコマンドを利用したファイアウォールを理解する
iptables-persistentでファイアウォールの設定を管理する
rc.local
$ sudo apt install iptables-persistent -y
$ sudo netfilter-persistent save
#👇IPv4用Netfilterルール
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
#👇IPv6用Netfilterルール
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save
iptables-persistent
netfilter-persistent
iptables-persistent
$ sudo netfilter-persistent flush
netfilter-persistent flush
$ sudo netfilter-persistent reload
netfilter-persistent save
netfilter-persistent start
$ sudo netfilter-persistent start
$ sudo netfilter-persistent stop
異なるネットワークが見えるように静的ルーティングを設定する
192.168.1.0
192.168.1.123
192.168.2.0
静的ルーティング
192.168.1.124
192.168.2.0/24
192.168.1.123
$ sudo ip route add 192.168.2.0/24 via 192.168.1.124
ip route show
netstat -nr
$ netstat -nr
カーネルIP経路テーブル
受信先サイト ゲートウェイ ネットマスク フラグ MSS Window irtt インタフェース
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 wlan0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
☆192.168.2.0 192.168.1.124 255.255.255.0 UG 0 0 0 wlan0
192.168.1.123
192.168.2.0
$ ping -c 4 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=5.04 ms
64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=3.13 ms
64 bytes from 192.168.2.1: icmp_seq=3 ttl=64 time=3.45 ms
64 bytes from 192.168.2.1: icmp_seq=4 ttl=64 time=2.97 ms
--- 192.168.2.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 7ms
rtt min/avg/max/mdev = 2.966/3.647/5.040/0.824 ms
ip-route
/etc/network/if-up.d
static-routes
#!/bin/sh
ip route add 192.168.2.0/24 via 192.168.1.124
$ sudo chmod +x /etc/network/if-up.d/static-routes
拡張ターゲット・「NETMAP」でアクセス可能なIPアドレス値で制限する
SNAT
SNAT
192.168.1.0
192.168.1.123
192.168.1.123
192.168.2.0
--to-source
192.168.2.123
$ sudo iptables -t nat -A POSTROUTING \
-o eth0 \
-s 192.168.1.123 \
-j SNAT --to-source 192.168.2.123
192.168.1.0
192.168.2.0
DNAT
$ sudo iptables -t nat -A PREROUTING \
-s 192.168.1.123 \
-j DNAT --to-destination 192.168.2.123
NETMAP
NETMAP
192.168.1.0
192.168.1.123
192.168.2.0
192.168.2.123
$ sudo iptables -t nat -A PREROUTING \
-s 192.168.1.0/24 \
-j NETMAP --to 192.168.2.0/24
拡張マッチングモジュール・macでアクセス可能なMACアドレス値を制限する
iptables
iptables-extensions
man
$ man iptables-extensions
$ iptables -A [適用チェーン] \
-m [適用モジュール] [モジュールの固有オプション] [オプションのターゲット]
mac
INPUT
link/ether
$ ip addr | grep ether
#...
link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
#...
$ sudo iptables -A INPUT \
-m mac ! --mac-source 00:11:22:33:44:55 \
-j DROP
$ sudo iptables -nvL INPUT --line-numbers
Chain INPUT (policy ACCEPT 291 packets, 34123 bytes)
num pkts bytes target prot opt in out source destination
1 5 300 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 MAC ! 00:11:22:33:44:55
00:11:22:33:44:55
まとめ
記事を書いた人
ナンデモ系エンジニア
電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。
カテゴリー