技術者になりたい何か

技術者になりたい何かの覚書的な何かです

Linuxのサーバ機をルータとして動かす

iptablesdhcpサーバでブロードバンドルータと同機能を揃える。

■方針
Linuxサーバ(Debian)にNIC増設
 →片方をWAN側、片方をLAN側にしてルータとして機能させる。
DHCPサーバ立ててIP割り振りも管理。
今まで使ってたルータ(baffalo)は無線アクセスポイントとして使用。

■今まで

baffalo(192.168.11.1)-サーバ
           -デスクトップPC数台
           -無線接続のあれこれ

■構想
Debianサーバ(192.168.11.1) -ハブ-有線接続のPC数台
                -baffalo(192.168.11.100)-無線接続のあれこれ


1.NICの設定


設定ファイルは/etc/network/interfaces
enp2s0をWAN、enp3s0をLANに設定する。
ちなみにうちの回線はCATVなので、WAN側は普通に局のdhcpから取得する設定。
enp3s0は固定で192.168.11.1を当てる。

# 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

#WAN
allow-hotplug enp2s0
iface enp2s0 inet dhcp

#LAN
allow-hotplug enp3s0
iface enp3s0 inet static
address 192.168.11.1
netmask 255.255.255.0
network 192.168.11.0
broadcast 192.168.11.255
gateway 192.168.11.1

 

できたらネットワーク再起動

$ sudo systemctl restart networking

反映されないこと多々あったけど、サーバ自体再起動すると反映されました。

 

2.DHCPサーバ立てる

DHCPサーバにはisc-dhcp-serverを使用。

$ sudo apt-get install isc-dhcp-server

設定ファイルは/etc/dhcp/dhcpd.conf

ネットワークは192.168.11.0
DNSはルータとして使用するサーバ自体とプロバイダ提供のもの。
割り振るレンジは192.168.11.10~192.168.11.254 にしてます。

あと常用の2台のPCは固定IPを割り振っています。

dhcpサーバ機能を提供するのはLAN側なので、インターファイスを指定します。

/etc/default/isc-dhcp-server の INTERFACESv4 でLAN側のインターファイス指定。
IPv6にも対応するならv6の方も。(今回はやりません)

$ emacs /etc/default/isc-dhcp-server

INTERFACESv4="enp3s0"

 

起動→確認→自動起動設定

$ sudo systemctl start isc-dhcp-server.service
$ sudo systemctl status isc-dhcp-server.service
● isc-dhcp-server.service - LSB: DHCP server
Loaded: loaded (/etc/init.d/isc-dhcp-server; generated; vendor preset: enabled)
Active: active (running) since Sat 2018-02-10 03:46:33 JST; 13h ago
Docs: man:systemd-sysv-generator(8)
Process: 1094 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/isc-dhcp-server.service
└─1106 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf enp3s0

2月 10 17:20:30 tminserver dhcpd[1106]: DHCPINFORM from 192.168.11.16 via enp3s0: not authoritative for subnet 192.168.1
2月 10 17:20:39 tminserver dhcpd[1106]: DHCPINFORM from 192.168.11.16 via enp3s0: not authoritative for subnet 192.168.1
2月 10 17:20:47 tminserver dhcpd[1106]: DHCPINFORM from 192.168.11.16 via enp3s0: not authoritative for subnet 192.168.1

$ sudo systemctl enable isc-dhcp-server.service

 

うまく行ってれば上記のような感じ。
起動失敗したときはsystemctl status とかjournalctl -xe でエラーログ確認しましょう。


3.IPforward有効にしてiptablesの設定

IPforward有効にするには
$ sudo echo 1 > /proc/sys/net/ipv4/ip_forward

なのですが、これだと再起動時にもとに戻ってしまうので永続化。

$ emacs /etc/sysctl.conf
net.ipv4.ip_forward=1

これで再起動時も有効のままになります。

iptablesの設定(余計なのが一部入ってるかも)
いちいち手打ちにすると大分大変なので、シェルスクリプトにしておいて実行するのが吉。
saveしといてrestoresてもいいけれども。

WANをenp2s0
LANをenp3s0
WAN側IPはプロバイダに割り振られてるので、ip a の出力からうまいことIPを切り出す。
LAN側IPは固定で192.168.11.1

初期化

デフォルトルール
・OUTPUT,INPUT,FORWARDをDROP,LAN側へのINPUTを許可。

WAN側にてプライベートIPへの通信をDROP

すでに確立してる通信を許可

LAN側のFORWARDを許可

NATでMASQUERADE

loとの通信を許可

ICMP(ping)を許可

LOGに記録する色々

多分、割と最低限でセキュリティ的にはもう少し詰めたほうがいいと思われ。
あと、もしかしたら必要な通信を拒否してるかもしれない。

状態確認。

$ sudo iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
31038 2676K ACCEPT all -- enp3s0 * 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- enp2s0 * 192.168.0.0/16 0.0.0.0/0
0 0 DROP all -- enp2s0 * 172.16.0.0/12 0.0.0.0/0
1222 404K DROP all -- enp2s0 * 10.0.0.0/8 0.0.0.0/0
26 3532 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 state NEW
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 0
9 365 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
1 60 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:20022
1462 90998 LOGGING all -- * * 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- enp2s0 * 192.168.0.0/16 0.0.0.0/0
0 0 DROP all -- enp2s0 * 172.16.0.0/12 0.0.0.0/0
0 0 DROP all -- enp2s0 * 10.0.0.0/8 0.0.0.0/0
689K 394M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
21449 10M ACCEPT all -- enp3s0 * 0.0.0.0/0 0.0.0.0/0
0 0 LOGGING all -- * * 0.0.0.0/0 0.0.0.0/0

Chain OUTPUT (policy DROP 2539 packets, 659K bytes)
pkts bytes target prot opt in out source destination
9520 1002K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0 state NEW
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 0
6 288 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8

Chain LOGGING (2 references)
pkts bytes target prot opt in out source destination
42 1708 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 3/hour burst 5 LOG flags 0 level 4 prefix "DROP:"
1462 90998 DROP all -- * * 0.0.0.0/0 0.0.0.0/0

一旦はこれでルータとして動くようになりました。


4.今まで使ってたbaffaloのルータを無線アクセスポイントとして使う

無線APとして使うには、ROUTER→BRIDGEにすればよい。
これでルータ機能、DHCP機能などなどが止まって、無線LAN中継機になります。
あと、有線のWANポートもLANポートもすべてLANポートとして動くようになります。
よって、無線の中継機能付きハブになると思って良さげ。

BRODGEモードに変更して適当なポートにルータにしたサーバからのケーブルを接続。
ROUTERモードのときは192.168.11.1だったけど、BRIDGEモードにすると192.168.11.100になるので、
ブラウザからアクセスして必要なら設定。

今回はROUTER→BRIDGEに切り替えて接続するだけで、今までの設定のまま無線APとして動くようになってくれました。


ちなみに今気づいたけど、この設定したサーバ機から名前解決ができていない。(LAN内の他の端末からはおk

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=57 time=15.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=57 time=14.0 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=57 time=15.6 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 14.078/15.003/15.600/0.678 ms

$ ping google.com
ping: google.com: 名前解決に一時的に失敗しました

 

 

うーむ。。。

 

 

2/19ついき

OUTPUTのデフォルトをDROPにしてたから、個別にport 53への通信を許可するか、

OUTPUTを許可するかどっちかしないとそりゃ通りませんよね。

 

個別許可の場合は

iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

を追記、

OUTPUT全許可の場合は

iptables -P OUTPUT DROP

iptables -P OUTPUT ACCEPT

にすればおk