Closed9

Linuxでルーターを作る

堀江誠一堀江誠一

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にクローズされました