同一LAN内に二つのルータをもつ場合におけるデフォゲ以外からのsshアクセス・ポリシーベースルーティング(PBR)
背景
大学院に進学したため,現状未だ親元を離れずにいる.家の回線速度に文句は無いが,回線の管理は親が行っているためポート開放が出来ない.また固定IPにもできないため,まず親の管理するLANの下に自分で管理するLANを作った.さらに外部からのアクセスを可能にするために一つ回線を契約した.親の家であり,新しく有線を引くことは不可能であったため,グローバルIPが割り振られるSIMカードを契約,それをSIMカード対応のルータに入れて自分のLANに接続した.
ポートフォワードできる自分の回線はモバイル回線であり大容量は使えないため,ssh鯖への外部(WAN)からのアクセス以外は実家の回線を使いたい.故にssh鯖のデフォゲはMyRouterの192.168.10.1/24となっている.しかしこのままでは外部からLTE Routerを経由してアクセスした際にその応答がMyRouterに流れてしまい,非対称ルーティングとなってしまう.クライアント側で対処する方法として非対称ルーティングを許可することも出来る(はず)だが,セキュリティ的に望ましくないので鯖側でPort由来のPolicy Based Routing(PBR)を設定する.
LTE Routerでのポートフォワーディングは設定済み,ssh鯖のPortは22.鯖の設定は全てrootユーザで行う.
参考にしたページ
https://qiita.com/MT-07/items/fa7f34a5dec34b6a0757
作業
iptablesで特定ポートのパケットに印1をつける
# iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 1
sportとdportを間違えて2日ほど悩んだ.素人かよ
https://oshiete.goo.ne.jp/qa/7126780.html
iproute2で印のついたパケットに適用するルーティングテーブルを設定する.
# ip rule add fwmark 1 table 10
iproute2でtable10のルーティング設定を行う.
# ip route add default dev eth0 via 192.168.10.100 table 10
このままだとLAN内からアクセスする際に応答が帰ってこなくなるので
LAN内に関するルーティングを追記する.
まず ip routeを実行し
# ip route
default via 192.168.10.1 dev eth0
192.168.10.0/24 dev eth0 proto kernel scope link src 192.168.10.22
上記の様に出力されたら
# ip route add table 10 192.168.10.0/24 dev eth0 proto kernel scope link src 192.168.10.22
複数行であったらdefault以外全てについて同様に行う.
自動化
iptablesについては
# iptables-save > /etc/iptables/iptables.rules
# systemctl enable iptables
iproute2については
# cat /root/Shells/pbr.sh
#!/bin/bash
ip rule add fwmark 1 table 10
ip route add default dev eth0 via 192.168.10.100 table 10
ip route add table 10 192.168.10.0/24 dev eth0 proto kernel scope link src 192.168.10.22
# cat /etc/systemd/system/pbr.service
[Unit]
Description=start PBR
After=netctl@eth0.service
[Service]
ExecStart=/root/Shells/pbr.sh
Type=idle
[Install]
WantedBy=multi-user.target
# systemctl enable pbr.service
以上