나는 작은 네트워크를 가지고 있습니다.
인터넷(WAN)에 연결된 방화벽이 있고 실제 IP와 DNS 이름이 있으며 내부 네트워크(LAN)에 대한 DHCP 서버 역할도 합니다. 방화벽 컴퓨터에서 LAN에 있는 사이트 서버에 대한 포트 전달을 설정했습니다. 이 내 꺼야 nftables.conf
:
#!/usr/sbin/nft -f
flush ruleset
define lan = eth0
define wan = eth1
define lan_addresses = 192.168.100.0/24
define server_address = 192.168.100.2
define server_http_port = 80
define server_https_port = 443
table firewall {
map hosts {
type ipv4_addr . ether_addr : verdict
elements = {
192.168.100.2 . 30:01:ED:BD:6B:CB : accept , # SERVER
192.168.100.3 . 30:01:ED:BD:6B:C1 : accept , # CLIENT
}
}
set remote_allowed {
type ipv4_addr
elements = { 91.198.174.192 , 209.51.188.148 }
}
chain prerouting {
type nat hook prerouting priority 0; policy accept;
# server
iifname $wan ip protocol tcp tcp dport $server_http_port log prefix "Server HTTP Prerouted " dnat $server_address:$server_http_port
iifname $wan ip protocol tcp tcp dport $server_https_port log prefix "Server HTTPS Prerouted " dnat $server_address:$server_https_port
}
chain postrouting {
type nat hook postrouting priority 100; policy accept;
ip saddr $lan_addresses oifname $wan masquerade
# server
iifname $wan ip protocol tcp ip saddr $server_address tcp sport $server_http_port log prefix "Server HTTP Postrouted " masquerade
iifname $wan ip protocol tcp ip saddr $server_address tcp sport $server_https_port log prefix "Server HTTPS Postrouted " masquerade
}
chain input {
type filter hook input priority 0; policy drop;
# drop invalid, allow established
ct state vmap {invalid : drop, established : accept, related : accept}
# allow loopback
iifname "lo" accept
# allow ping from LAN
iifname $lan ip saddr $lan_addresses ip protocol icmp icmp type echo-request accept
# allow SSH from LAN
iifname != $wan ip protocol tcp tcp dport 22 accept
# allow SSH from allowed remotes
iifname $wan ip protocol tcp ip saddr @remote_allowed tcp dport 22 accept
# open SQUID, DHCP port for lan
iifname $lan ip protocol tcp ip saddr $lan_addresses tcp dport {3128, 67} accept
# LAN nice reject
iifname != $wan ip saddr $lan_addresses reject with icmp type host-prohibited
}
chain forward {
type filter hook forward priority 0; policy drop;
ct state {established,related} accept
# server
iifname $wan ip protocol tcp ip daddr $server_address tcp dport $server_http_port log prefix "Server HTTP Forwarded To " accept
iifname $lan ip protocol tcp ip saddr $server_address tcp sport $server_http_port log prefix "Server HTTP Forwarded From " accept
iifname $wan ip protocol tcp ip daddr $server_address tcp dport $server_https_port log prefix "Server HTTPS Forwarded To " accept
iifname $lan ip protocol tcp ip saddr $server_address tcp sport $server_https_port log prefix "Server HTTPS Forwarded From " accept
# only allow selected machines to access internet
iifname $lan oifname $wan ip saddr . ether saddr vmap @hosts
iifname $lan oifname $wan reject
}
chain output {
type filter hook output priority 0; policy accept;
}
}
이 설정은 LAN에서 서버에 액세스하려고 시도하지 않는 한 잘 작동합니다. 이 경우
No route to host
오류가 발생합니다.
> ping 192.168.100.1 # OK
> ping example.com # OK
> curl http://192.168.100.2 # OK
> curl http://192.168.100.1 # `No route to host`
> curl http://93.184.216.34 # `No route to host`
> curl http://example.com # `No route to host`
방화벽 IP 또는 DNS 이름을 사용하여 LAN 서버에 액세스할 수 있도록 넷필터 구성을 어떻게 수정합니까?
PS 올바르게 구성하려면 이것이 필요합니다.기즈를 만나다 회의 녹화가 통과되었습니다.지가시, 사이트 URL을 사용하여 회의에 연결합니다.
PPS 이 구성은 지정된 클라이언트에 대해서만 인터넷에 대한 무제한 액세스를 허용합니다.
답변1
방화벽 구성을 건드리지 않고도 이 문제를 극복할 수 있었습니다. 로컬 서버 주소와 DNS 이름이 포함된 항목을 클라이언트 파일에 추가했습니다 /etc/hosts
.
192.168.100.3 example.com
DHCP 서버를 통해서도 브로드캐스트할 수 있다고 생각합니다.