質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Q&A

解決済

1回答

11458閲覧

CentOS7で複数nicがある場合のソースルーティングの設定について

mOieZne

総合スコア8

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

1グッド

2クリップ

投稿2018/05/06 04:10

編集2018/05/06 14:39

ネットワーク構成図
Server Bのeth0については使用しない予定ですので、図からは割愛しています。

やりたいこと

ServerBからServer Aのtap_dev 172.31.0.1との疎通をさせたいですが、一方方向のみ疎通が取れる状況です。

現在の状況
・ClientとServer A(eth1,tap_dev)へは双方向で疎通がとれています。
ルーティングも問題なさそうです。

・Server A(eth1,tap_dev)とServerB eth1は片方向で疎通が取れます。
Server A⇒Server B
Server A eth1 172.16.0.1⇒Server B 172.16.0.2 === ping OK
ServerA tap_dev 172.31.0.1 ⇒ Server B 172.16.0.2 === ping OK

.Server B ⇒ Server A
Server B 172.16.0.2 ⇒ ServerA eth1 172.16.0.1 === ping OK
Server B 172.16.0.2 ⇒ ServerA tap_dev 172.31.0.1 === ping NG

Server Aのroute -nの実行結果
[root@xxx-xxx-xxx-xxx ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 xxx.xxx.xxx.xxx 0.0.0.0 UG 100 0 0 eth0
xxx.xxx.xxx.0 0.0.0.0 255.255.254.0 U 100 0 0 eth0
172.16.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1
172.31.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tap_dev
192.168.0.0 172.31.0.254 255.255.255.0 UG 0 0 0 tap_dev

Server Bのroute -nの実行結果

[root@yyy-yyy-yyy-yyy network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 yyy.yyy.yyy.yyy 0.0.0.0 UG 100 0 0 eth0
yyy.yyy.yyy.0 0.0.0.0 255.255.254.0 U 100 0 0 eth0
172.16.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1
172.31.0.0 172.16.0.1 255.255.255.0 UG 0 0 0 eth1

※192.168.0.0/24へのルートはまだ追加していません。

確認してみたこと

  • Server Aでtcpdumpを実行し、Server Bから172.31.0.1へpingを実行

1. tcpdump -i eth1の実行結果
ServerA内でeth1からtap_devへリレーされています。

dumpをwiresharkで確認すると以下のようになります。
5 1.000035 172.16.0.2 172.31.0.1 ICMP 98 Echo (ping) request id=0x2992, seq=1861/17671, ttl=64 (reply in 6)

しかし、直接コンソールに表示すると以下のようになります。
11:32:14.206928 IP 172.16.0.2 > xxx-xxx-xxx-xxx: ICMP echo request, id 2506, seq 535, length 64

以上のことからServer BからServer A tap_dev 172.31.0.1へpingは送信されているものの、172.31.0.1からの戻りがeth1からではなくeth0に出てしまっているのではないかと考えました。

やってみたこと
SererAのtap_devからの戻りがeth1からではなくeth0から出てしまっているため戻れないので、eth1からServer Bへ戻れるようにServerAにソースルーティングの設定を行ってみました。

1.yum install NetworkManager-config-routing-rules -y

2./etc/iproute2/rt_tablesファイルを開き、末尾に以下を記述を追加
1 inr.ruhep
200 rule200

3./etc/sysconfig/network-scripts/ ディレクトリにrule-eth1を作成して以下を記述
from 172.16.0.1 table rule200

4./etc/sysconfig/network-scripts/ ディレクトリにroute-eth1を作成して以下を記述
172.16.0.0/24 dev eth1 table rule200
default dev eth1 table rule200

※172.16.0.0/24にデフォルトゲートウェイにできるルーターなどのゲートウェイが存在しないため、デバイス名のみ記述しました。

5.設定を反映
systemctl restart network.service

参考サイト
https://ast.qt-space.com/linux/centos7.html 『AST的電子記憶箱』 CentOS7-ネットワーク設定-マルチホーム

https://mano.xyz/2033/ 『mano.xyz』 CentOS7 policy routing する (複数のデフォルトゲートウェイを設定する)

http://blog.techlab-xe.net/archives/5264 『すらりん日記』-ポリシーベースルーティングの話

質問の要領が悪く恐縮ではございますが、識者の皆様のご教授を頂戴できませんでしょうか。
よろしくお願いいたします。

set0gut1👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TaichiYanagiya

2018/05/06 15:32

tap_dev は VPN などのトンネリングのために作成したものですか?
mOieZne

2018/05/06 15:41 編集

コメントありがとうございます。 ご指摘のとおり、tap_devはVPN用になります。最終的にはserver⇒Client方向の通信ができるようになることが目標ですが、まずは、tap_devまでの疎通ができるようにしたいと考えていました。
guest

回答1

0

ベストアンサー

tap_dev は VPN 用とのことですので、VPN 接続機器どうしの通信のカプセル化を行なうためのインターフェースであって、それ以外のホストから tap_dev を意識する必要はないと思います。

しかし、直接コンソールに表示すると以下のようになります。
11:32:14.206928 IP 172.16.0.2 > xxx-xxx-xxx-xxx: ICMP echo request, id 2506, seq 535, length 64

「xxx-xxx-xxx-xxx」は伏せ字ではなく、そのままですか?
もし、そうだとすると、tap_dev ではカプセル化されたものを期待していたけれど、Server B から送られたパケットはカプセル化されていないものだったので、
送り先がわからない、ということではないでしょうか? (自信なし)

172.31.0.1からの戻りがeth1からではなくeth0に出てしまっているのではないかと考えました。

送信元IP = 172.16.0.2 ですので、戻りは 宛先IP = 172.16.0.2 となり、eth1 から返すはずです。

投稿2018/05/06 16:09

TaichiYanagiya

総合スコア12146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mOieZne

2018/05/06 16:34

ご回答ありがとうございます。 申し訳ありません。「xxx-xxx-xxx-xxx」は伏字です(アスタリスクの方がわかりやすいでしょうか?)。xxx-xxx-xxx-xxx-xxx はeth0が持っているグローバルIPです。 (尚、vpnはsoftetherでserver側がsoftether bridge client側にサーバーを置いています。 構成図は私の前回の質問に記載させていただいています。 https://teratail.com/questions/124570) 今、書いていて言うのもおかしいのですが、172.16.0.2⇒xxx.xxx.xxx.xxx(eth0)になっていますね。 wiresharkでdaumpを見ると、tap_devから返ってきているように見えるので、戻りだけがeht1ではなく、eht0に出ていってしまっていると思っていました。 tcpdumpの結果をそのまま見る限りだと直接、172.16.0.2からeth0に出ていってしまっていますね・・・どう読み取ったらよいのか悩みます。
TaichiYanagiya

2018/05/07 14:48

tcpdump の結果はよくわかりませんね。 softether が何かしているのでしょうか? ソースルーティングは一旦忘れて、Server B - Server A 間、Server A - Client 間の通信がそれぞれできているのであれば、プロキシーやポートフォワードで代替できないか検討してみてはいかがでしょうか。
mOieZne

2018/05/16 14:08

そうですね。検討してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問