Closed9
Linuxでルーターを作る
Debianでルーターを作るの公開により、このスクラップは閉じます。
NAT, DHCP機能のあるルーターを作る。iptablesを使うのが基本。
iptablesによるNATルータ。
同じくiptablesによるルーター
iptablesの用語が少し特殊なので理解をまとめておく。iptablesにおいて処理単位はパケット。
用語 | 説明 |
---|---|
ルール | パケットに対してどのような処理を行うかの規則。入出力ポートや方向、状態に応じて条件が定められ、マッチしたパケットにルールが適用される |
チェーン | 同一の大きな条件でまとめられた一連のルール。パケットはチェーンの中のルールにマッチするか順に調べられる |
テーブル | 用途ごとにチェーンを取りまとめたもの。filter、nat, raw, mangleがある。それぞれのテーブルにINPUT, OUTPUT……などの経路ごとのチェーンがある。 |
INPUT | ローカルシステム(そのLinuxシステム)をターゲットとして入ってくるパケットが適用されるチェーン |
OUTPUT | ローカルシステムから出ていくパケットが適用されるチェーン |
FORWARD | ローカルシステムを通過していくパケットが適用されるチェーン |
ルーティング | パケットのメタデータから送信元と宛先を決定する事 |
PREROUTING | 送信元と宛先が決定される前に適用されるチェーン |
POSTROUTING | 送信元と宛先が決定される前に適用されるチェーン |
MASQUERADE | 送信元アドレスをはぎ取る処理 |
iptablesで行う場合は、
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
eth0(内部)とeth1(外部)の間のNAT。
# eth1から出ていくすべてのパケットの送信元にマスカレードをかける。ポートマッピングはランダムにする。
sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE --random
# 内部から外部へフォワードされるトラフィックは無条件に許す。
sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
# 出て行ったトラフィックへの返信については外部から内部へのフォワードを許す。
sudo iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate RELATED, ESTABLISHED -j ACCEPT
# その他のフォワードは許さない
sudo iptables -A FORWARD -j DROP
ufwで行う場合は、
sudo ufw allow ssh
/etc/default/ufw
'DEFAULT_FORWARD_POLICY="ACCEPT"'
/etc/ufw/sysctl.conf
net/ipv4/ip_forward=1
eth0(内部)とeth1(外部)の間のNAT。
/etc/ufw/before.rules
*filter
# drop the forward packet from ens18 to ens19
-A ufw-before-forward -i ens18 -o ens19 -j DROP
COMMIT
*nat
-F
:POSTROUTING ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]
# apply masquerade to all forward packet to port ens18. The port number is randomized.
-A POSTROUTING -o ens18 -j MASQUERADE --random
# apply above rules.
COMMIT
sudo ufw enable
br1にアドレスを振る。br1のMACアドレスは bc:24:11:d5:85:20。
IPアドレスの確認。
ip address
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 noprefixroute
valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether bc:24:11:e7:6e:99 brd ff:ff:ff:ff:ff:ff
altname enp0s18
inet 192.168.0.49/24 brd 192.168.0.255 scope global dynamic ens18
valid_lft 3571sec preferred_lft 3571sec
inet6 fe80::be24:11ff:fee7:6e99/64 scope link
valid_lft forever preferred_lft forever
3: ens19: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether bc:24:11:d5:85:20 brd ff:ff:ff:ff:ff:ff
altname enp0s19
4: tailscale0: <POINTOPOINT,MULTICAST,N
この時点では bc:24:11:d5:85:20に紐付けられたens19にはIPアドレスはない。
/etc/network/interfacesを変更して、ens19にIPアドレスを割り当てる。
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface (br2)
allow-hotplug ens18
iface ens18 inet dhcp
# The secondary network interface (br1)
allow-hotplug ens19
iface ends19 inet static
address 192.168.100.1/24
ネットワークマネージャの再起動
sudo systemctl restart networking.service
ip address
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 noprefixroute
valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether bc:24:11:e7:6e:99 brd ff:ff:ff:ff:ff:ff
altname enp0s18
inet 192.168.0.49/24 brd 192.168.0.255 scope global dynamic ens18
valid_lft 3583sec preferred_lft 3583sec
inet6 fe80::be24:11ff:fee7:6e99/64 scope link
valid_lft forever preferred_lft forever
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether bc:24:11:d5:85:20 brd ff:ff:ff:ff:ff:ff
altname enp0s19
inet 192.168.100.1/24 brd 192.168.100.255 scope global ens19
valid_lft forever preferred_lft forever
inet6 fe80::be24:11ff:fed5:8520/64 scope link
valid_lft forever preferred_lft forever
DHCP Serverを建てる。
sudo apt install isc-dhcp-server
この状態ではコンフィギュレーションファイルを設定していないので、デーモン起動で失敗する。
isc-dhcp-serverは、/etc/default/isc-dhcp-server
を読み込むので、このファイルを最初に設定する。
4行目のコメントアウトを解除して/etc/dhcp/dhcpd.conf/
を読み込ませる。また、17行目にDHCPサーバーを適用させる通信ポートを指定する。
/etc/default/isc-dhcp-server
@@ -2,5 +2,5 @@
# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
-#DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
+DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
#DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf
@@ -15,4 +15,4 @@
# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. "eth0 eth1".
-INTERFACESv4=""
+INTERFACESv4="ens19"
INTERFACESv6=""
次に/etc/dhcp/dchpd.conf
を編集して、DHCPで払い出すアドレスの範囲やDNSサーバーのIPアドレスを設定する。option domain-name-servers
はコンマ区切りであることに注意。
/etc/dhcp/dchpd.conf
@@ -105,3 +105,13 @@
# range 10.0.29.10 10.0.29.230;
# }
#}
+
+# DHCP service for proxmox ve internal router
+subnet 192.168.100.0 netmask 255.255.255.0 {
+ range 192.168.100.100 192.168.100.200;
+ option domain-name-servers 219.110.4.80,219.110.5.7,8.8.8.8,8.8.8.4;
+ option routers 192.168.100.1;
+ option broadcast-address 192.168.100.255;
+ default-lease-time 3600;
+ max-lease-time 86400;
+}
DHCPサーバーを再起動する。
sudo systemctl restart isc-dhcp-server.service
kea
sudo apt install kea
/etc/kea/kea-dhcp4.conf
{
"Dhcp4": {
"interfaces-config": {
"interfaces": [ "ens19" ]
},
"control-socket": {
"socket-type": "unix",
"socket-name": "/run/kea/kea4-ctrl-socket"
},
"lease-database": {
"type": "memfile",
"lfc-interval": 3600
},
"valid-lifetime": 600,
"max-valid-lifetime": 7200,
"subnet4": [
{
"id": 1,
"subnet": "192.168.100.0/24",
"pools": [
{
"pool": "192.168.100.150 - 192.168.100.200"
}
],
"option-data": [
{
"name": "routers",
"data": "192.168.100.1"
},
{
"name": "domain-name-servers",
"data": "219.110.4.80, 219.110.5.7, 8.8.8.8, 8.8.8.4"
}
]
}
]
}
}
このスクラップは2025/03/04にクローズされました