2018年6月24日日曜日

firewalld and ipset on CentOS7

CentOS 7でipsetを利用してみました。
firewalldが標準になり、ipsetはどうやって使うんだろうと思っていましたが、firewalldの設定でOKのようです。
先日設定したVPN接続を国内からのみ許可するように設定しました。

IPアドレスのリストは、http://nami.jp/ipv4bycc/で配布されているものを利用させてもらうのが簡単かと思います。
私は、IPv6のリストも欲しかったので、RIRが提供してるリストを加工して利用することにしました。
  • ftp://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest
  • ftp://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-extended-latest
  • ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-extended-latest
  • ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-extended-latest
  • ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-extended-latest
設定するにあたり、IPアドレスのリストをCIDRの形式でx.x.x.x/nやx::/nの形式で用意しておきます。

以下の環境で設定しています。
$ cat /etc/centos-release
CentOS Linux release 7.5.1804 (Core) 
$ uname -rv
3.10.0-862.3.2.el7.x86_64 #1 SMP Mon May 21 23:36:36 UTC 2018
$

まず、国内からのアクセスを扱うように新しいゾーンを作成します。
# firewall-cmd --permanent --new=zone=domestic
次に、IPv4、IPv6用のipsetを作成します。
# firewall-cmd --permanent --new-ipset=DOMESTICv4 --type=hash:net
# firewall-cmd --permanent --new-ipset=DOMESTICv6 --type=hash:net --family=inet6
リロードして確認すると次のようになります。
# firewall-cmd --reload
# firewall-cmd --get-ipsets
DOMESTICv4 DOMESTICv6
#
作成したipsetへのエントリ追加は、次のようにファイル指定で行うことができます。
# firewall-cmd --permanent --ipset=DOMESTICv4 --add-entries-from-file=./ipv4_list
# firewall-cmd --permanent --ipset=DOMESTICv6 --add-entries-from-file=./ipv6_list
追加したエントリは、次のように確認できます。
$ firewall-cmd --ipset=DOMESTICv4 --get-entries |head
1.0.16.0/20
1.0.64.0/18
1.1.64.0/18
1.5.0.0/16
1.21.0.0/16
1.33.0.0/16
1.66.0.0/15
1.72.0.0/13
1.112.0.0/14
14.0.8.0/22
ここまででipsetの設定ができましたので、firewalldのゾーンとipsetを関連づけます。
# firewall-cmd --permanent --zone=domestic --add-source=ipset:DOMESTICv4
# firewall-cmd --permanent --zone=domestic --add-source=ipset:DOMESTICv6
これで、DOMESTICv4, DOMESTICv6に定義したIPアドレスからのアクセスは、domesticゾーンが適用されるようになりました。

あとは、domesticゾーンに必要なサービスを追加して、デフォルトゾーン(ここではpublic)から不要なサービスを削除すればOKです。
# firewall-cmd --permanent --zone=domestic --add-service=ssh
# firewall-cmd --permanent --zone=domestic --add-service=ipsec
# firewall-cmd --permanent --zone=domestic --add-port=5555/tcp
#
# firewall-cmd --permanent --zone=public --remove-service=ssh
# firewall-cmd --permanent --zone=public --remove-service=ipsec
# firewall-cmd --permanent --zone=public --remove-port=5555/tcp
#
# firewall-cmd --reload
# firewall-cmd --info-zone=domestic
domestic (active)
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: ipset:DOMESTICv4 ipset:DOMESTICv6
  services: ssh ipsec
  ports: 5555/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

permanent指定なので、適宜リロードが必要です。

2018年6月8日金曜日

SoftEther on CentOS7

L2TP/IPsecを利用するため、SoftEtherをインストールします。
前準備として、次のポートを利用できるようにします。
  • 500/udp
  • 4500/udp
  • 5555/tcp
  • 443/tcp
/usr/lib/firewalld/services/ipsec.xmlをみると、500/udp, 4500/udpはipsecサービスを利用すれば良さそうです。 443はSoftEtherの管理ツール用に利用します。

次のように設定します。
# firewall-cmd --permanent --zone=public --add-service=ipsec
# firewall-cmd --permanent --zone=public --add-port=5555/tcp
# firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=192.168.0.0/23 service name=https accept"
# firewall-cmd --reload
...
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: br0 enp4s0 enp0s31f6 enp5s0
  sources: 
  services: ssh dhcpv6-client ipsec
  ports: 5555/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
 rule family="ipv4" source address="192.168.0.0/23" service name="https" accept
...
あとは、公式サイトにある手順に従いSoftEtherをインストールすればOKです。
ただ、CentOS7では、initではなくsystemdを利用するようになっているため、起動用のunitファイルを作成する必要がありました。

公式サイトに記載されているinit用の起動スクリプトを参考に下記のunitファイルを作成しました。
# cat /etc/systemd/system/vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
Restart=on-abort
RestartSec=3

[Install]
WantedBy=multi-user.target
次のように有効化して起動します。
# systemctl enable vpnserver
# systemctl start vpnserver
iPhoneで接続確認してみたところ、移行前と同じように利用できました。

Policy based routing on CentOS 7

v6プラスの導入以降、ネットワーク環境はIPoE接続とPPPoE接続を併用しています。
実際のアドレスとは違いますが、次のような構成になっています。
  • PPPoE BBルータ (192.168.0.1/23)
  • IPoE BBルータ (192.168.1.1/23)
192.168.0.0/24で利用していたものに、192.169.1.0を追加し、同セグメントにするためサブネットマスクを/23に変更した形になります。
IPoEの経路は速くて良いのですが、外部から接続できるようにNATも利用するためPPPoEの経路もなくせません。

ということで、新PCでは、デフォルトゲートウェイはIPoEのBBルータを利用し、NAT通信はPPPoEのルータを経由するようポリシーベースルーティングの設定をすることにしました。

ネットワック環境は次のようになります。
# nmcli con show
NAME                    UUID                                  TYPE      DEVICE
bridge-br0              4a45b8de-49cc-4c50-8b8d-eeeeeeeeeeee  bridge    br0
bridge-slave-enp0s31f6  417d8d8a-31d3-4f91-b64e-ffffffffffff  ethernet  enp0s31f6
enp4s0                  b91dc271-b52b-4363-a74d-bbbbbbbbbbbb  ethernet  enp4s0
enp5s0                  0584bdaf-5f78-44f1-a941-cccccccccccc  ethernet  enp5s0
....
# ip route
default via 192.168.1.1 dev enp5s0 proto static metric 102
192.168.0.0/23 dev enp5s0 proto kernel scope link src 192.168.0.100 metric 102
192.168.0.0/23 dev br0 proto kernel scope link src 192.168.0.101 metric 425
....
#
enp5s0に192.168.0.100/23、br0に192.168.0.101/23、デフォルトゲートウェイに192.168.1.1が設定してあります。
この環境で192.168.0.101で受けた接続は、192.168.0.1を経由するルートとなるように設定します。

まず、NetworkManagerでルーティングルールが扱えるように次のパッケージをインストールして有効化します。
# yum install NetworkManager-dispatcher-routing-rules
....
# systemctl enable NetworkManager-dispatcher
これで、/etc/sysconfig/network-scripts/rule-NAMEファイルが使えるようになったので設定ファイルを作成していきます。
まずは、ルーティングテーブルIDと名前を/etc/iproute2/rt_tablesに追加します。
# cat /etc/iproute2/rt_tables
#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep
100     pppoe-rt
末尾の100 pppoe-rtを追加しています。
次にbr0に割り当てている192.168.0.101からの通信が上記で設定したルーティングテーブルを参照してルーティングするように設定します。
/etc/sysconfig/network-scripts/route-bridge-br0を次のように作成します。
# cat /etc/sysconfig/network-scripts/route-bridge-br0
default via 192.168.0.1 dev br0 table pppoe-rt
192.168.0.0/23 dev br0 table pppoe-rt
ルーティングポリシーのルールを/etc/sysconfig/network-scripts/rule-bridge-br0に作成します。
# cat /etc/sysconfig/network-scripts/rule-bridge-br0
from 192.168.0.101/32 table pppoe-rt priority 100

念のため、リブート後に自動設定されることを確認します。
# ip route
default via 192.168.1.1 dev enp5s0 proto static metric 102
192.168.0.0/23 dev enp5s0 proto kernel scope link src 192.168.0.100 metric 102
192.168.0.0/23 dev br0 proto kernel scope link src 192.168.0.101 metric 425
.....
# ip rule show
0:      from all lookup local
100:    from 192.168.0.101 lookup pppoe-rt
32766:  from all lookup main
32767:  from all lookup default
#
# ip route show table pppoe-rt
default via 192.168.0.1 dev br0
192.168.0.0/23 dev br0 scope link

以上

2018年6月3日日曜日

CentOS6からCentOS7へKVM環境移行

KVM環境をCentOS6からCentOS7に移行します。
作業内容は次のようになります。
  • ブリッジデバイスの準備
  • KVMゲストの移行
まずは、ネットワーク環境から。
# nmcli con show
NAME       UUID                                  TYPE      DEVICE
enp0s31f6  03b67f02-f8a7-4893-aa4e-aaaaaaaaaaaa  ethernet  enp0s31f6
enp4s0     b91dc271-b52b-4363-a74d-bbbbbbbbbbbb  ethernet  enp4s0
enp5s0     0584bdaf-5f78-44f1-a941-cccccccccccc  ethernet  enp5s0
virbr0     f0764441-0948-4d0d-830d-dddddddddddd  bridge    virbr0
#
enp0s31f6, enp4s0がLOMの1Gbps、enp5s0がXG-C100Cの10Gbpsです。
enp5s0をシステムのデフォルト、enp0s31f6をKVMの仮想ブリッジ用、enp4s0をSoftEtherのブリッジ用に使用 します。

ブリッジデバイスbr0を作成します。
# nmcli con add type bridge ifname br0
Connection 'bridge-br0' (4a45b8de-49cc-4c50-8b8d-eeeeeeeeeeee) successfully added.
#
# nmcli con show
NAME        UUID                                  TYPE      DEVICE
bridge-br0  4a45b8de-49cc-4c50-8b8d-eeeeeeeeeeee  bridge    br0
enp0s31f6   03b67f02-f8a7-4893-aa4e-aaaaaaaaaaaa  ethernet  enp0s31f6
enp4s0      b91dc271-b52b-4363-a74d-bbbbbbbbbbbb  ethernet  enp4s0
enp5s0      0584bdaf-5f78-44f1-a941-cccccccccccc  ethernet  enp5s0
virbr0      f0764441-0948-4d0d-830d-dddddddddddd  bridge    virbr0

次に、br0と物理NIC(enp0s31f6)の関連付けを行います。
# nmcli con add type bridge-slave ifname enp0s31f6 master bridge-br0
Connection 'bridge-slave-enp0s31f6' (417d8d8a-31d3-4f91-b64e-ffffffffffff) successfully added.
#
# nmcli con show
NAME                    UUID                                  TYPE      DEVICE
bridge-br0              4a45b8de-49cc-4c50-8b8d-eeeeeeeeeeee  bridge    br0
enp0s31f6               03b67f02-f8a7-4893-aa4e-aaaaaaaaaaaa  ethernet  enp0s31f6
enp4s0                  b91dc271-b52b-4363-a74d-bbbbbbbbbbbb  ethernet  enp4s0
enp5s0                  0584bdaf-5f78-44f1-a941-cccccccccccc  ethernet  enp5s0
virbr0                  f0764441-0948-4d0d-830d-dddddddddddd  bridge    virbr0
bridge-slave-enp0s31f6  417d8d8a-31d3-4f91-b64e-ffffffffffff  ethernet  --

ブリッジデバイスのスレーブとなったenp0s31f6を削除します。
# nmcli con delete enp0s31f6
Connection 'enp0s31f6' (03b67f02-f8a7-4893-aa4e-aaaaaaaaaaaa) successfully deleted.
#
# nmcli con show
NAME                    UUID                                  TYPE      DEVICE
bridge-br0              4a45b8de-49cc-4c50-8b8d-eeeeeeeeeeee  bridge    br0
bridge-slave-enp0s31f6  417d8d8a-31d3-4f91-b64e-ffffffffffff  ethernet  enp0s31f6
enp4s0                  b91dc271-b52b-4363-a74d-bbbbbbbbbbbb  ethernet  enp4s0
enp5s0                  0584bdaf-5f78-44f1-a941-cccccccccccc  ethernet  enp5s0
virbr0                  f0764441-0948-4d0d-830d-dddddddddddd  bridge    virbr0

ブリッジデバイスにIPアドレスを設定します。
# nmcli con mod bridge-br0 ipv4.method manual ipv4.addresses "192.168.0.101/23"
#
# ip route
default via 192.168.1.1 dev enp5s0 proto static metric 102
192.168.0.0/23 dev enp5s0 proto kernel scope link src 192.168.0.100 metric 102
192.168.0.0/23 dev br0 proto kernel scope link src 192.168.0.101 metric 425
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1

KVMゲストの移行
旧PCでKVMゲストをシャットダウンして、下記コマンドで設定ファイルをエクスポートします。
GUEST-NAMEは、virsh list -allなどで表示される名前に置き換えてください。
# virsh dumpxml GUEST-NAME > GUEST-NAME.xml

次に旧PCからエクスポートした設定ファイルと、ゲストのイメージファイルを新PCにコピーします。 標準では、/var/lib/libvirt/images 配下にイメージファイルがあります。
コピー後、新PCで次のコマンドを実行して設定をインポートします。
# virsh define GUEST-NAME.xml

あとは、virt-managerを起動してメモリサイズ等を微調整後、ゲストを起動すれば移行完了。
のはずでしたが、ゲスト起動時に下記メッセージが表示され起動しませんでした。
Error Starting domain: unsupported
configuration: host doesn't support invariant TSC

結局、/etc/libvirt/qemu/GUEST-NAME.xmlから次の記述を削除したら起動しました。
<feature policy='require' name='invtsc'/>

PT3関連インストール

旧PCからPT3を移設したのでドライバと録画ツールを設定しました。
OS情報は、次になります。
$ cat /etc/centos-release
CentOS Linux release 7.5.1804 (Core)
$ uname -mvr
3.10.0-862.3.2.el7.x86_64 #1 SMP Mon May 21 23:36:36 UTC 2018 x86_64

PT3ドライバのインストール
$ git clone https://github.com/m-tsudo/pt3.git
$ cd pt3
# make install

カードリーダ関連のインストール
# yum install pcsc-lite*
# systemctl enable pcscd
# systemctl start pcscd

録画ツールのインストール
まずは、libarib25のインストール。
$ hg clone http://hg.honeyplanet.jp/pt1 -r b25 b25
$ cd b25/arib25
$ make
# make install
logを見るとrecpt1は、最近の衛星放送再編の修正が入っているようです。
$ hg clone http://hg.honeyplanet.jp/pt1
$ cd pt1/recpt1
$ ./autogen.sh
$ ./configure --enable-b25
$ make
# make install
動作確認できたので、pt1_dev.hで定義されているデバイスファイル名をpt3用に編集して再度make installしました。
特に問題なく完了。

2018年6月2日土曜日

新PC

サーバ利用しているPCの利用期間がそろそろ5年になるので、下記構成で新PCを作りました。
  • ASRock C236M WS
  • Intel Xeon E3-1245v6
  • DDR4-2400 8GB x2
  • Seagate ST4000-DM004 x8
  • HGST HDT725032VLA360 x1
  • AREA SD-PE4SA3ES4L
  • ASUS XG-C100C
骨董品のHDT725032VLA360ですが、S.M.A.R.T.のPower_On_Hoursが151のものがあったので、システム領域用に使いました。 そのうち新しいHDDに変えよう。

CentOS7, ZFS on Linuxをインストールして数日動かしていましたが安定しているようなので、ぼちぼちメイン環境を旧PCから移行しようと思います。
とりあえず、作業予定は以下です。
  • PT3の移設
  • KVM環境の移行
  • SoftEther VPN移行
実は、去年暮れにamazon.comでGS100MX−100NASとXG-C100C 2つを購入して年初に完成予定でした。 しかし、ケースの納期が遅れ届いたのが3月になり、さっそく組み立てるも不幸なことにマザーボードの初期不良、購入から時間が経っていたので修理対応となりました。

先日ようやく戻ってきて完成となったのですが、HDDが安くなってたり、XG-C100Cが日本で普通に買えるようになっていたりで微妙な気分です…。