2つのインターフェイスを持つサーバーボックスがあります。インターフェイスの1つは内部ネットワークに接続され、もう1つは外部ネットワークに接続されています。
内部インターフェース(eth0)にIP 192.168.1.200を割り当てました。このIP /インターフェイス(cups、nginx、pdns)でリッスンするローカルデーモンがいくつかあります。
外部IPは192.168.0.91(eth1)です。ここでは、NATマスカレードのみです。それ自体からサーバーボックスにアクセスしようとすると、いつも奇妙なことが起こります。
192.168.1.200にあるWebページを開こうとすると、サーバーは192.168.0.91アドレスを使用し、アクセスが拒否されます(内部ネットワークでのみコンテンツを提供するように保護されたWebサーバー)。
Eth1を停止した場合、サーバーは正常に動作し、内部IPを使用します。しかし、すぐにeth1を起動するとすぐに、そのIPがプライマリIPとして取得され、再度アクセス許可が拒否されます。
使用するメインIP /インターフェースを明示的に設定するにはどうすればよいですか?
Gentoo Linuxの64ビットバージョンを実行しています。 nicのドライバは両方ともモジュールとしてコンパイルされています。私は、initdシステムとしてsystemdを使用しています。
編集:
回答ありがとうございますが、最も興味深い部分がここに来ています:
atomic ~ # cat /etc/resolv.conf
domain local
search local
nameserver 192.168.1.200
atomic ~ # cat /etc/hosts
...
192.168.1.200 atomic ns.atomic.local atomic.local
...
OKを解決するアドレス:
atomic ~ # Dig atomic.local 192.168.1.200
; <<>> Dig 9.9.4 <<>> atomic.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38797
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 2800
;; QUESTION SECTION:
;atomic.local. IN A
;; ANSWER SECTION:
atomic.local. 604800 IN A 192.168.1.200
;; Query time: 42 msec
;; SERVER: 192.168.1.200#53(192.168.1.200)
;; WHEN: Tue May 27 13:37:04 EEST 2014
;; MSG SIZE rcvd: 55
そしてNginxはwget経由でアクセスしたログを記録します
atomic ~ # wget atomic.fhn
--2014-05-27 13:45:58-- http://atomic.local/
Resolving atomic.local... 192.168.1.200
Connecting to atomic.local|192.168.1.200|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’
[ <=> ] 0 --.-K/s in 0s
2014-05-27 13:45:58 (0.00 B/s) - ‘index.html’ saved [0]
atomic ~ # tail -n 1 /var/log/nginx/access_log
192.168.0.91 - - [27/May/2014:13:45:58 +0300] "GET / HTTP/1.1" 200 5 "-" "Wget/1.14 (linux-gnu)"
問題が解決されていないときにIP /ネットワークフィルタリングを無効にしたため、HTTPステータスは200/OKになりました。
ルーティングテーブル:
192.168.0.0/30 dev wan proto kernel scope link src 192.168.0.2
192.168.1.0/24 dev lan proto kernel scope link src 192.168.1.200
EDIT2:
使用されるメトリックを持つルーティングテーブル:
192.168.0.0/30 dev wan scope link metric 20
192.168.1.0/24 dev lan scope link metric 10
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope Host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope Host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
broadcast 192.168.0.0 dev wan table local proto kernel scope link src 192.168.0.2
local 192.168.0.2 dev wan table local proto kernel scope Host src 192.168.0.2
broadcast 192.168.0.3 dev wan table local proto kernel scope link src 192.168.0.2
broadcast 192.168.1.0 dev lan table local proto kernel scope link src 192.168.1.200
local 192.168.1.200 dev lan table local proto kernel scope Host src 192.168.1.200
broadcast 192.168.1.255 dev lan table local proto kernel scope link src 192.168.1.200
必要なのは、LANルートがWAN 1よりも優先されることを確認することです。問題はここにあります。
192.168.0.0/30 dev wan proto kernel scope link src 192.168.0.2
192.168.1.0/24 dev lan proto kernel scope link src 192.168.1.200
192.168.0.0/30は192.168.1.0/24もカバーします。したがって、TCP/IPスタックに該当する場合は後者を優先するように指示する必要があります。そうでない場合はランダムに選択される可能性があります(ほとんどの実装では常に最初のものを使用することを期待します)-metric
引数を使用します。例:
ip route add 192.168.1.0/24 dev lan metric 10
ip route add 192.168.0.0/30 dev wan metric 20
(明らかに、まず既存のルートを削除する必要があります)。
Jofelがすでに述べたように、Linuxの主要なインターフェースなどはありません。実際に何が起こるか:もしあなたのコンピュータがどこかにパケットを送りたければ、彼はそのターゲットIPを知っています。ただし、ソースIPもパッケージで指定する必要があります。これは、インターフェースリストおよびルーティングテーブルから入力されます。
ローカルアドレスの場合、物事は少し複雑になります(私たちが望むほど単純ではありません)。
URLで明示的な192.168.1.200アドレス(またはこのアドレスに正確に解決されるホスト名)を使用する最も簡単な方法。あなたは書きませんでしたが、実際のドキュメントを取得するためにホスト名付きのURLを使用していると思います。このホスト名は、デフォルトで外部アドレスに解決されます。