ラズパイでiptablesを使って有線LANを中継するスイッチングハブ的なNATコンバータを作る
※ 当ページには【広告/PR】を含む場合があります。
2022/04/21
ラズパイのインターネット中継機かの種類
参考サイト
ラズパイをルーター化する
192.168.0.0/24
192.168.21.0/24
192.168.21.0/24
192.168.0.0/24
192.168.21.0/24
wlan0とeth0
wlan0 (WiFi):
192.168.0.2
eth0 (有線LANアダプタ):
192.168.21.1
wlan0
eth0
192.168.21.0/24
ラズパイのwlan0(WiFi)をIP固定する
wlan0
192.168.0.2
/etc/dhcpcd.conf
#...中略
interface wlan0
static ip_address=192.168.0.2/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
$ sudo systemctl restart dhcpcd
ラズパイのeth0をIP固定する
eth0
192.168.21.0
192.168.21.1
/etc/dhcpcd.conf
#...中略
denyinterfaces eth0
interface eth0
static ip_address=192.168.21.1/24
static routers=0.0.0.0
static domain_name_servers=0.0.0.0
ラズパイにDHCP・DNSサーバーを導入する
$ sudo apt install -y isc-dhcp-server dnsmasq
isc-dhcp-server
dnsmasq
192.168.21.2 ~ 192.168.21.99
/etc/dhcp/dhcpd.conf
#...中略
#👇コメントアウト
#option domain-name "example.org";
#👇コメントアウト
#option domain-name-servers ns1.example.org, ns2.example.org;
#👇#を外して有効化
authoritative;
#👇追記
subnet 192.168.21.0 netmask 255.255.255.0 {
range 192.168.21.2 192.168.21.99;
option routers 192.168.21.1;
option domain-name-servers 192.168.21.1;
option broadcast-address 192.168.21.255;
ignore declines;
}
#...中略
#👇ターゲットインターフェイスを指定
INTERFACESv4="eth0"
#...略
/etc/dnsmasq.conf
#...中略
server=8.8.8.8
interface=eth0
$ sudo systemctl start isc-dhcp-server
$ sudo systemctl enable isc-dhcp-server
$ sudo systemctl start dnsmasq
$ sudo systemctl enable dnsmasq
$ sudo systemctl status isc-dhcp-server
$ sudo systemctl status dnsmasq
iptables
ここまでの参考サイト
iptablesコマンドでwlan0とeth0を正しくポートフォワードさせる
iptablesコマンドのインストール
$ sudo apt install iptables
iptablesのテーブルモデル
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING
FORWARDチェイン
FORWARD
-i <インターフェイスやIPアドレス>
-o <インターフェイスやIPアドレス>
ACCEPT/DROP
eth0
$ iptables -A FORWARD -i eth0 -j ACCEPT
$ iptables -A FORWARD -o eth0 -j ACCEPT
-j DROP
#👇外部(0.0.0.0/0)に出ようとする1335~1359番のTCPパケットを棄却
$ iptables -A FORWARD -j DROP -d 0.0.0.0/0 -p tcp --dport 1335:1359
#👇外部(0.0.0.0/0)に出ようとする4465番のUDPパケットを棄却
$ iptables -A FORWARD -j DROP -d 0.0.0.0/0 -p udp --dport 4465
-m state --state
-m state --state NEW:
新規に開始するパケットに適用
-m state --state ESTABLISHED:
確立済みパケットに適用
-m state --state RELATED:
既存の接続に対するパケットに適用
-m state --state INVALID:
不当なパケット
POSTROUTING(SNAT)の設定作法
192.168.1.123
eth0
$ iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.123/24 -j MASQUERADE
-j MASQUERADE
-j SNAT
-t nat:
NATテーブルを使用
-A POSTROUTING:
POSTROUTINGチェインを追加。
ネットワーク内部から外部へ出ていくパケットのソース側のIPのを書き換え
-s <発信元のIPアドレス>:
ソース側のアドレス
-j MASQUERADE/SNAT:
マスカレードor特定のIPでの書換え方法の指定
-o <出力先インターフェイス>:
パケットが出ていくインターフェイスを限定する際にインターフェイス名で指定。
今回はインターフェイスの対応が一対一で明らかであるので省略
Chain POSTROUTING
$ sudo iptables -t nat -n -L
#...中略
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
#👇この行が追加されている
MASQUERADE all -- 192.168.1.0/24 0.0.0.0/0
#...以下略
192.168.1.0/24
PREROUTING(DNAT)の設定作法
PREROUTING
192.168.1.2
192.168.1.123
$ sudo iptables -t nat -A PREROUTING -d 192.168.1.2 -i wlan0 -j DNAT --to 192.168.1.123
-t nat:
NATテーブルを使用
-A PREROUTING:
PREROUTINGチェインを追加。
ネットワーク外部から内部へ入ってくるパケットのディスティネーション側のIPのを書き換え
-d <送信先のIPアドレス>:
ディスティネーション側のアドレス
-j DNAT:
DNATの使用
-i <入力先インターフェイス>:
パケットが入ってくるインターフェイスを限定する際にインターフェイス名で指定。
今回はインターフェイスの対応が一対一で明らかであるので省略
$ sudo iptables -t nat -n -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
#👇この行が追加されている
DNAT all -- 0.0.0.0/0 192.168.1.1 to:192.168.1.123
#...省略
iptablesコマンドからポートフォワーディング
eth0
eth0
192.168.21.1
192.168.21.0
192.168.0.0
192.168.0.2
192.168.21.0
ポートフォワード
192.168.21.0
/etc/sysctl.conf
net.ipv4.ip_forward=1
#...中略
net.ipv4.ip_forward=1
#...以下略
/etc/sysctl.conf
$ sudo sysctl -p
rc.localにiptablesコマンドを書き込む
/etc/rc.local
#...中略
#👇exit0の手前に追記
iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT
iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
exit0
FORWARD
「eth0から入ってきたパケットをwlan0へ転送する」
「wlan0から入ってきたパケットをeth0へ転送する」
POSTROUTING
「ラズパイから送られる全てのパケットの送信元をwlan0として扱う」
192.168.0.0
eth0
192.168.0.0
192.168.0.1
192.168.0.2
rc.local
192.168.21.0
余談〜rc.localにiptablesコマンドを書き込まないNAT設定の保存方法
/etc/rc.local
/etc/rc.local
iptables-save
iptables-restore
$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
/etc/rc.local
exit 0
#...中略
#👇exit0の手前に追加する
iptables-restore < /etc/iptables.ipv4.nat
exit 0
/etc/iptables.ipv4.nat
ここまでの内容で参考にさせていただいたサイト
実機でのラズパイルーター化の確認
ラズパイのeth0へ接続するパソコンのIP固定
/etc/dhcpcd.conf
interface enp3s0
static ip_address=192.168.21.2/24
static routers=192.168.21.1#👈ゲートウェイがラズパイのeth0
static domain_name_servers=192.168.21.1#👈DNSもラズパイのeth0
$ sudo systemctl restart dhcpcd
enp3s0
#👇ラズパイのeth0
$ ping 192.168.21.1
#👇eth0に接続中のデスクトップ
$ ping 192.168.21.2
#👇インターネットに接続されている自宅ルーター
$ ping 192.168.0.1
#👇外部のインターネット
$ ping google.com
#👇ラズパイのeth0
$ ping 192.168.21.1
#👇ラズパイのwlan0
$ ping 192.168.0.2
#👇インターネットに接続されている自宅ルーター
$ ping 192.168.0.1
#👇外部のインターネット
$ ping google.com
異なるネットワーク間で通信を確立してSSH接続を試みる
192.168.0.3
192.168.21.2
#👇パソコンBからパソコンAにpingしてみる
$ ping 192.168.0.3
#...通信可能
#👇パソコンAからパソコンBにpingしてみる
$ ping 192.168.21.2
#...到達しない!
192.168.0.0
192.168.21.0
192.168.0.1
192.168.0.1
192.168.21.0ネットワーク
192.168.21.2
192.168.0.2
192.168.0.2
#👇パソコンAから192.168.0.2にpingしてみる
$ ping 192.168.0.2
#...到達可能
192.168.21.2
192.168.0.2:12345
192.168.21.2:54321
$ sudo iptables -t nat -A PREROUTING -m tcp -p tcp -d 192.168.0.2 --dport 12345 -j DNAT --to 192.168.21.2:54321
192.168.21.2
192.168.0.3
192.168.21.1
192.168.0.3
$ nc -v -w 1 192.168.0.2 -z 12345
nc: connect to 192.168.0.2 port 12345 (tcp) failed: Connection refused
nc
192.168.21.2:54321
192.168.21.1
$ sudo iptables -t nat -A POSTROUTING -m tcp -p tcp -d 192.168.21.2 --dport 54321 -j SNAT --to 192.168.21.1
$ sudo iptables -A FORWARD -m tcp -p tcp -d 192.168.21.2 --dport 54321 -j ACCEPT
$ sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$ nc -v -w 1 192.168.0.2 -z 12345
Connection to 192.168.0.2 12345 port [tcp/*] succeeded!
/etc/rc.local
#...省略
#👇exit0の手前に追加
iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT
iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -A FORWARD -m tcp -p tcp -d 192.168.21.2 --dport 54321 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -m tcp -p tcp -d 192.168.0.2 --dport 12345 -j DNAT --to 192.168.21.2:54321
sudo iptables -t nat -A POSTROUTING -m tcp -p tcp -d 192.168.21.2 --dport 54321 -j SNAT --to 192.168.21.1
exit0
ここまでで参考させていただいたサイト
まとめ
記事を書いた人
ナンデモ系エンジニア
電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。
カテゴリー