SSH 만 사용하여 VPN을 생성 / 설정하는 방법은 무엇입니까?


9

내가 해결하려는 문제가 있습니다. 로컬 컴퓨터에서 ssh로 연결할 수있는 서버 ( "원격 시스템")가 있지만이 원격 시스템은 인터넷에 연결되어 있지 않습니다. ssh 기반 VPN을 사용하여 로컬 컴퓨터를 통해 원격 시스템에 인터넷 액세스를 제공하고 싶습니다. 어떻게하면 되나요? 나는 부분적으로 효과가있는 것으로 보이는 다음을 시도했다. '부분적으로 작동'한다는 의미는 연결 패킷 (동기화 패킷)이 로컬 컴퓨터로 전송되었지만 인터넷 연결을 설정하지 못한다는 것입니다. 로컬 컴퓨터에서 패킷을 캡처하기 위해 tcpdump를 사용하고 있습니다. 로컬 컴퓨터와 원격 시스템 모두 centos 7을 실행 중입니다.

설정 -참고 : 아래 명령은 순서대로 실행됩니다. user @ remote 명령은 원격 서버에서 실행되고 user @ local 명령은 로컬 컴퓨터에서 실행됩니다.

[user @ remote ~] $ ip addr show
1 : lo : mtu 65536 qdisc noqueue state 알 수 없음 
    링크 / 루프백 00 : 00 : 00 : 00 : 00 : 00 brd 00 : 00 : 00 : 00 : 00 : 00
    inet 127.0.0.1/8 범위 호스트 lo
       valid_lft 영원히
    inet6 :: 1/128 범위 호스트 
       valid_lft 영원히
2 : eth0 : mtu 1500 qdisc pfifo_fast 상태 UP qlen 1000
    링크 / 에테르 AA : BB : CC : DD : EE : FF brd ff : ff : ff : ff : ff : ff
    inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 범위 글로벌 동적 eth0
       valid_lft 1785 초 preferred_lft 1785 초
    inet6 EEEE : FFFF : GGGG : HHHH : IIII : JJJJ : KKKK : LLLL / 64 범위 글로벌 접두사 경로 동적 
       valid_lft 2591987 초 preferred_lft 604787 초
    inet6 ABCD :: IIII : JJJJ : KKKK : LLLL / 64 범위 링크 
       valid_lft 영원히
[user @ local ~] $ ip addr show
1 : lo : mtu 65536 qdisc noqueue state 알 수 없음 
    링크 / 루프백 00 : 00 : 00 : 00 : 00 : 00 brd 00 : 00 : 00 : 00 : 00 : 00
    inet 127.0.0.1/8 범위 호스트 lo
       valid_lft 영원히
    inet6 :: 1/128 범위 호스트 
       valid_lft 영원히
2 : eth0 : mtu 1500 qdisc pfifo_fast 상태 UP qlen 1000
    링크 / 에테르 AA : BB : CC : DD : EE : FF brd ff : ff : ff : ff : ff : ff
    inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 범위 글로벌 동적 eth0
       valid_lft 1785 초 preferred_lft 1785 초
    inet6 EEEE : FFFF : GGGG : HHHH : IIII : JJJJ : KKKK : LLLL / 64 범위 글로벌 접두사 경로 동적 
       valid_lft 2591987 초 preferred_lft 604787 초
    inet6 ABCD :: IIII : JJJJ : KKKK : LLLL / 64 범위 링크 
       valid_lft 영원히

원격 시스템 에서 tun0 인터페이스를 작성하십시오 .

[user @ remote ~] $ sudo ip tuntap 추가 tun0 모드 tun
[user @ remote ~] $ ip addr show
1 : lo : mtu 65536 qdisc noqueue state 알 수 없음 
    링크 / 루프백 00 : 00 : 00 : 00 : 00 : 00 brd 00 : 00 : 00 : 00 : 00 : 00
    inet 127.0.0.1/8 범위 호스트 lo
       valid_lft 영원히
    inet6 :: 1/128 범위 호스트 
       valid_lft 영원히
2 : eth0 : mtu 1500 qdisc pfifo_fast 상태 UP qlen 1000
    링크 / 에테르 AA : BB : CC : DD : EE : FF brd ff : ff : ff : ff : ff : ff
    inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 범위 글로벌 동적 eth0
       valid_lft 1785 초 preferred_lft 1785 초
    inet6 EEEE : FFFF : GGGG : HHHH : IIII : JJJJ : KKKK : LLLL / 64 범위 글로벌 접두사 경로 동적 
       valid_lft 2591987 초 preferred_lft 604787 초
    inet6 ABCD :: IIII : JJJJ : KKKK : LLLL / 64 범위 링크 
       valid_lft 영원히
3 : tun0 : mtu 1500 qdisc noop 상태 DOWN qlen 500
    링크 / 없음 

로컬 시스템 에서 tun0 인터페이스를 작성하십시오 .

[user @ local ~] $ sudo ip tuntap 추가 tun0 모드 tun
[user @ local ~] $ ip addr show
1 : lo : mtu 65536 qdisc noqueue state 알 수 없음 
    링크 / 루프백 00 : 00 : 00 : 00 : 00 : 00 brd 00 : 00 : 00 : 00 : 00 : 00
    inet 127.0.0.1/8 범위 호스트 lo
       valid_lft 영원히
    inet6 :: 1/128 범위 호스트 
       valid_lft 영원히
2 : eth0 : mtu 1500 qdisc pfifo_fast 상태 UP qlen 1000
    링크 / 에테르 AA : BB : CC : DD : EE : FF brd ff : ff : ff : ff : ff : ff
    inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255 범위 글로벌 동적 eth0
       valid_lft 1785 초 preferred_lft 1785 초
    inet6 EEEE : FFFF : GGGG : HHHH : IIII : JJJJ : KKKK : LLLL / 64 범위 글로벌 접두사 경로 동적 
       valid_lft 2591987 초 preferred_lft 604787 초
    inet6 ABCD :: IIII : JJJJ : KKKK : LLLL / 64 범위 링크 
       valid_lft 영원히
3 : tun0 : mtu 1500 qdisc noop 상태 DOWN qlen 500
    링크 / 없음

tun0에 IP 주소를 할당하고 불러 오십시오 :

[user @ local ~] $ sudo ip addr add 10.0.2.1/30 dev tun0
[user @ local ~] $ sudo ip 링크 설정 dev tun0 up
[user @ local ~] $ ip addr show tun0
3 : tun0 : mtu 1500 qdisc pfifo_fast 상태 DOWN qlen 500
    링크 / 없음 
    inet 10.0.2.1/30 범위 글로벌 tun0
       valid_lft 영원히
[user @ remote ~] $ sudo ip addr add 10.0.2.2/30 dev tun0
[user @ remote ~] $ sudo ip 링크 설정 dev tun0 up
[user @ remote ~] $ ip addr show tun0
3 : tun0 : mtu 1500 qdisc pfifo_fast 상태 DOWN qlen 500
    링크 / 없음 
    inet 10.0.2.2/30 범위 글로벌 tun0
       valid_lft 영원히

터널링을 활성화하려면 원격 및 로컬 시스템 모두에서 sshd_config를 수정하십시오.

[user @ remote ~] $ sudo grep PermitTunnel / etc / ssh / sshd_config 
터널 간 허용
[user @ local ~] $ sudo grep PermitTunnel / etc / ssh / sshd_config 
터널 간 허용

ssh 터널을 작성하십시오.

[user @ local ~] $ sudo ssh -f -w0 : 0 root @ remote true
root @ remote의 비밀번호 : 
[user @ local ~] $ ps aux | grep root @ remote
루트 1851 0.0 0.0 76112 1348? Ss 23:12 0:00 ssh -f -w0 : 0 root @ 원격 true

새 IP 주소를 사용하여 두 서버에서 ping을 테스트하십시오.

[user @ local ~] $ 핑 10.0.2.2 -c 2
PING 10.0.2.2 (10.0.2.2) 56 (84) 바이트의 데이터.
10.0.2.2에서 64 바이트 : icmp_seq = 1 ttl = 64 시간 = 1.68ms
10.0.2.2에서 64 바이트 : icmp_seq = 2 ttl = 64 시간 = 0.861ms

--- 10.0.2.2 핑 통계 ---
2 패킷 전송, 2 수신, 0 % 패킷 손실, 시간 1002ms
rtt min / avg / max / mdev = 0.861 / 1.274 / 1.688 / 0.415ms
[user @ remote ~] $ 핑 10.0.2.1 -c 2
PING 10.0.2.1 (10.0.2.1) 56 (84) 바이트의 데이터.
10.0.2.1에서 64 바이트 : icmp_seq = 1 ttl = 64 time = 0.589ms
10.0.2.1에서 64 바이트 : icmp_seq = 2 ttl = 64 시간 = 0.889ms

--- 10.0.2.1 핑 통계 ---
2 패킷 전송, 2 수신, 0 % 패킷 손실, 시간 1000ms
rtt min / avg / max / mdev = 0.589 / 0.739 / 0.889 / 0.150ms
[user @ remote ~] $ 경로
커널 IP 라우팅 테이블
대상 게이트웨이 Genmask 플래그 지표 참조 사용 Iface
기본 게이트웨이 0.0.0.0 UG 100 0 eth0
10.0.2.0 0.0.0.0 255.255.255.252 U 00 tun0
AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 eth0
[user @ remote ~] $ ip 라우트 쇼
AAA.BBB.CCC.1 dev eth0 프로토 정적 메트릭 100을 통한 기본값 
10.0.2.0/30 dev tun0 프로토 커널 범위 링크 src 10.0.2.2 
AAA.BBB.CCC.0 / 24 dev eth0 프로토 커널 범위 링크 src AAA.BBB.CCC.31 metric 100 

Google IP 주소 가져 오기 :

[user @ local ~] $ nslookup google.com
서버 : 서버
주소 : server # 53

신뢰할 수없는 답변 :
이름 : google.com
주소 : 173.194.219.101
이름 : google.com
주소 : 173.194.219.100
이름 : google.com
주소 : 173.194.219.113
이름 : google.com
주소 : 173.194.219.102
이름 : google.com
주소 : 173.194.219.139
이름 : google.com
주소 : 173.194.219.138

중요 : 위의 명령을 다른 시간에 실행하고 다른 결과를 얻었습니다. 귀하의 답변이 위의 nslookup에 대한 광산과 동일하다고 가정하지 마십시오.

Google의 모든 IP 주소는 173.194.219로 시작하므로 이러한 모든 IP 주소를 로컬 컴퓨터를 통해 라우팅 할 수 있습니다.

[user @ remote ~] $ sudo ip route add 173.194.219.0/24 dev tun0
[user @ remote ~] $ 경로
커널 IP 라우팅 테이블
대상 게이트웨이 Genmask 플래그 지표 참조 사용 Iface
기본 게이트웨이 0.0.0.0 UG 100 0 eth0
10.0.2.0 0.0.0.0 255.255.255.252 U 00 tun0
AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 eth0
173.194.219.0 0.0.0.0 255.255.255.0 U 0 0 tun0
[user @ remote ~] $ ip 라우트 쇼
AAA.BBB.CCC.1 dev eth0 프로토 정적 메트릭 100을 통한 기본값 
10.0.2.0/30 dev tun0 프로토 커널 범위 링크 src 10.0.2.2 
AAA.BBB.CCC.0 / 24 dev eth0 프로토 커널 범위 링크 src AAA.BBB.CCC.31 metric 100 
173.194.219.0/24 dev tun0 범위 링크 

ip_forwarding을 활성화하십시오 :

[user @ local ~] $ grep ip_forward /etc/sysctl.conf 
net.ipv4.ip_forward = 1
[user @ local ~] $ sudo 서비스 네트워크 재시작
네트워크 재시작 (systemctl을 통해) : [OK]

tcpdump를 사용하여 로컬 컴퓨터에서 패킷 캡처를 설정하십시오.

[user @ local ~] $ sudo tcpdump -nn -vv '22가 아닌 포트 '-i any
tcpdump : 링크 유형 LINUX_SLL (Linux 쿠킹)에서 수신, 캡처 크기 65535 바이트

원격 서버에서 Google에 연결을 시도하십시오.

[user @ remote ~] $ openssl s_client -connect google.com:443
소켓 : 호스트에 대한 경로 없음
connect : errno = 113

openssl 명령이 원격 서버에서 실행 되 자마자 tcpdump는 일부 패킷을 캡처합니다.

    10.0.2.2.52768> 173.194.219.102.443 : 플래그 [S], cksum 0x8702 (수정), seq 994650730, win 29200, 옵션 [mss 1460, sackOK, TS val 7701438 ecr 0, nop, wscale 7], 길이 0
00 : 49 : 33.247753 IP (tos 0x0, ttl 64, id 46037, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    10.0.2.2.48774> 173.194.219.100.443 : 플래그 [S], cksum 0x47a7 (수정), seq 2218733674, win 29200, 옵션 [mss 1460, sackOK, TS val 7701439 ecr 0, nop, wscale 7], 길이 0
00 : 49 : 33.247883 IP (tos 0xc0, ttl 64, id 9538, 오프셋 0, 플래그 [없음], 프로토 ICMP (1), 길이 88)
    10.0.2.1> 10.0.2.2 : ICMP 호스트 173.194.219.100에 연결할 수 없음-관리자 금지, 길이 68
    IP (tos 0x0, ttl 63, id 46037, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    10.0.2.2.48774> 173.194.219.100.443 : 플래그 [S], cksum 0x47a7 (수정), seq 2218733674, win 29200, 옵션 [mss 1460, sackOK, TS val 7701439 ecr 0, nop, wscale 7], 길이 0
00 : 49 : 33.253068 IP (tos 0x0, ttl 64, id 26282, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    10.0.2.2.51312> 173.194.219.101.443 : 플래그 [S], cksum 0x6ff8 (정확한), seq 2634016105, win 29200, 옵션 [mss 1460, sackOK, TS val 7701443 ecr 0, nop, wscale 7], 길이 0
00 : 49 : 33.254771 IP (tos 0xc0, ttl 64, id 9539, 오프셋 0, 플래그 [없음], 프로토 ICMP (1), 길이 88)
    10.0.2.1> 10.0.2.2 : ICMP 호스트 173.194.219.101에 연결할 수 없음-관리자 금지, 길이 68
    IP (tos 0x0, ttl 63, id 26282, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    10.0.2.2.51312> 173.194.219.101.443 : 플래그 [S], cksum 0x6ff8 (정확한), seq 2634016105, win 29200, 옵션 [mss 1460, sackOK, TS val 7701443 ecr 0, nop, wscale 7], 길이 0
00 : 49 : 33.258805 IP (tos 0x0, ttl 64, id 9293, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    10.0.2.2.33686> 173.194.219.139.443 : 플래그 [S], cksum 0x542b (수정), seq 995927943, win 29200, 옵션 [mss 1460, sackOK, TS val 7701450 ecr 0, nop, wscale 7], 길이 0
00 : 49 : 33.258845 IP (tos 0xc0, ttl 64, id 9540, 오프셋 0, 플래그 [없음], 프로토 ICMP (1), 길이 88)
    10.0.2.1> 10.0.2.2 : ICMP 호스트 173.194.219.139 연결할 수 없음-관리자 금지, 길이 68
    IP (tos 0x0, ttl 63, id 9293, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    10.0.2.2.33686> 173.194.219.139.443 : 플래그 [S], cksum 0x542b (수정), seq 995927943, win 29200, 옵션 [mss 1460, sackOK, TS val 7701450 ecr 0, nop, wscale 7], 길이 0
^ C
13 개 패킷 캡처
필터에 의해 수신 된 13 개의 패킷
커널에 의해 삭제 된 패킷 0 개

tcpdump를 사용하여 캡처 된 패킷은 연결을 설정하려고 시도했지만 (동기화 패킷이 전송 됨) 아무 것도 수신되지 않았습니다. 또한 10.0.2.1 > 10.0.2.2: ICMP host 173.194.219.139 unreachable - admin prohibited, length 68문제를 제안하는 메시지 가 있습니다.

이 문제를 해결하는 방법에 대한 제안 사항이 있습니까? 추가해야하는 iptable 규칙이 있습니까? 방화벽 문제 (방화벽 -d?)



iptables-save의 출력 # 1 참고 :

[user @ local ~] $ sudo iptables -t nat -A POSTROUTING -s 10.0.2.2/32! -d 10.0.2.1/30 -j MASQUERADE -o eth0
[user @ local ~] $ sudo iptables-save
# iptables-save v1.4.21에 의해 토요일 4 월 15 일 01:40:57에 의해 생성됨
* nat
: 행동 수락 [35 : 8926]
: 입력 수락 [1:84]
: 출력 수락 [6 : 439]
: 접수 수락 [6 : 439]
: OUTPUT_direct-[0 : 0]
: POSTROUTING_ZONES-[0 : 0]
: POSTROUTING_ZONES_SOURCE-[0 : 0]
: POSTROUTING_direct-[0 : 0]
: POST_public-[0 : 0]
: POST_public_allow-[0 : 0]
: POST_public_deny-[0 : 0]
: POST_public_log-[0 : 0]
: PREROUTING_ZONES-[0 : 0]
: PREROUTING_ZONES_SOURCE-[0 : 0]
: PREROUTING_direct-[0 : 0]
: PRE_public-[0 : 0]
: PRE_public_allow-[0 : 0]
: PRE_public_deny-[0 : 0]
: PRE_public_log-[0 : 0]
-A PREROUTING -j PREROUTING_direct
-A PREROUTING -j PREROUTING_ZONES_SOURCE
-A PREROUTING -j PREROUTING_ZONES
-A 출력 -j OUTPUT_direct
-A POSTROUTING -j POSTROUTING_direct
-A POSTROUTING -j POSTROUTING_ZONES_SOURCE
-A POSTROUTING -j POSTROUTING_ZONES
-포스트 링 -s 10.0.2.2/32! -d 10.0.2.0/30 -j MASQUERADE
-A POSTROUTING_ZONES -o eth0 -g POST_public
-A POSTROUTING_ZONES -g POST_public
-A POST_public -j POST_public_log
-A POST_public -j POST_public_deny
-A POST_public -j POST_public_allow
-A PREROUTING_ZONES -i eth0 -g PRE_public
-A PREROUTING_ZONES -g PRE_public
-A PRE_public -j PRE_public_log
-A PRE_public -j PRE_public_deny
-A PRE_public -j PRE_public_allow
범하다
# 2017 년 4 월 15 일 토요일 01:40:57에 완료
# iptables-save v1.4.21에 의해 토요일 4 월 15 일 01:40:57에 의해 생성됨
*압착 롤러
: 프린터 링 수락 [169 : 18687]
: 입력 수락 [144 : 11583]
: FOCCARD ACCEPT [0 : 0]
: 출력 수락 [80 : 8149]
: 접수 수락 [80 : 8149]
: FORWARD_direct-[0 : 0]
: INPUT_direct-[0 : 0]
: OUTPUT_direct-[0 : 0]
: POSTROUTING_direct-[0 : 0]
: PREROUTING_ZONES-[0 : 0]
: PREROUTING_ZONES_SOURCE-[0 : 0]
: PREROUTING_direct-[0 : 0]
: PRE_public-[0 : 0]
: PRE_public_allow-[0 : 0]
: PRE_public_deny-[0 : 0]
: PRE_public_log-[0 : 0]
-A PREROUTING -j PREROUTING_direct
-A PREROUTING -j PREROUTING_ZONES_SOURCE
-A PREROUTING -j PREROUTING_ZONES
-A 입력 -j INPUT_direct
-A FORWARD -j FORWARD_direct
-A 출력 -j OUTPUT_direct
-A POSTROUTING -j POSTROUTING_direct
-A PREROUTING_ZONES -i eth0 -g PRE_public
-A PREROUTING_ZONES -g PRE_public
-A PRE_public -j PRE_public_log
-A PRE_public -j PRE_public_deny
-A PRE_public -j PRE_public_allow
범하다
# 2017 년 4 월 15 일 토요일 01:40:57에 완료
# iptables-save v1.4.21에 의해 토요일 4 월 15 일 01:40:57에 의해 생성됨
*보안
: 입력 수락 [2197 : 163931]
: FOCCARD ACCEPT [0 : 0]
: 출력 수락 [1229 : 185742]
: FORWARD_direct-[0 : 0]
: INPUT_direct-[0 : 0]
: OUTPUT_direct-[0 : 0]
-A 입력 -j INPUT_direct
-A FORWARD -j FORWARD_direct
-A 출력 -j OUTPUT_direct
범하다
# 2017 년 4 월 15 일 토요일 01:40:57에 완료
# iptables-save v1.4.21에 의해 토요일 4 월 15 일 01:40:57에 의해 생성됨
*노골적인
: 프린팅 수락 [2362 : 184437]
: 출력 수락 [1229 : 185742]
: OUTPUT_direct-[0 : 0]
: PREROUTING_direct-[0 : 0]
-A PREROUTING -j PREROUTING_direct
-A 출력 -j OUTPUT_direct
범하다
# 2017 년 4 월 15 일 토요일 01:40:57에 완료
# iptables-save v1.4.21에 의해 토요일 4 월 15 일 01:40:57에 의해 생성됨
*필터
: 입력 수락 [0 : 0]
: FOCCARD ACCEPT [0 : 0]
: 출력 수락 [80 : 8149]
: FORWARD_IN_ZONES-[0 : 0]
: FORWARD_IN_ZONES_SOURCE-[0 : 0]
: FORWARD_OUT_ZONES-[0 : 0]
: FORWARD_OUT_ZONES_SOURCE-[0 : 0]
: FORWARD_direct-[0 : 0]
: FWDI_public-[0 : 0]
: FWDI_public_allow-[0 : 0]
: FWDI_public_deny-[0 : 0]
: FWDI_public_log-[0 : 0]
: FWDO_public-[0 : 0]
: FWDO_public_allow-[0 : 0]
: FWDO_public_deny-[0 : 0]
: FWDO_public_log-[0 : 0]
: INPUT_ZONES-[0 : 0]
: INPUT_ZONES_SOURCE-[0 : 0]
: INPUT_direct-[0 : 0]
: IN_public-[0 : 0]
: IN_public_allow-[0 : 0]
: IN_public_deny-[0 : 0]
: IN_public_log-[0 : 0]
: OUTPUT_direct-[0 : 0]
-A 입력 -m conntrack --ctstate 관련, 설정 -j 수락
-A 입력 -i lo -j 수락
-A 입력 -j INPUT_direct
-A 입력 -j INPUT_ZONES_SOURCE
-A 입력 -j INPUT_ZONES
-A 입력 -m conntrack --ctstate 유효하지 않은 -j DROP
-A 입력 -j 거부 -icmp-host가 금지 된 거부
-앞으로 -m conntrack --ctstate 관련, 설정 -j 수락
-전진 -i lo -j 수락
-A FORWARD -j FORWARD_direct
-A FORWARD -j FORWARD_IN_ZONES_SOURCE
-포워드 -j FORWARD_IN_ZONES
-A FORWARD -j FORWARD_OUT_ZONES_SOURCE
-A FORWARD -j FORWARD_OUT_ZONES
-A FORWARD -m conntrack --ctstate 유효하지 않은 -j 삭제
-A FORWARD -j REJECT --icmp-host가 금지 된 거부
-A 출력 -j OUTPUT_direct
-A FORWARD_IN_ZONES -i eth0 -g FWDI_public
-A FORWARD_IN_ZONES -g FWDI_public
-A FORWARD_OUT_ZONES -o eth0 -g FWDO_public
-A FORWARD_OUT_ZONES -g FWDO_public
-A FWDI_public -j FWDI_public_log
-A FWDI_public -j FWDI_public_deny
-A FWDI_public -j FWDI_public_allow
-A FWDI_public -p icmp -j ACCEPT
-A FWDO_public -j FWDO_public_log
-A FWDO_public -j FWDO_public_deny
-A FWDO_public -j FWDO_public_allow
-A INPUT_ZONES -i eth0 -g IN_public
-A INPUT_ZONES -g IN_public
-A IN_public -j IN_public_log
-A IN_public -j IN_public_deny
-A IN_public -j IN_public_allow
-A IN_public -p icmp -j ACCEPT
-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
범하다
# 2017 년 4 월 15 일 토요일 01:40:57에 완료


참고 # 2 :
로컬 서버 만 액세스 할 수있는 별도의 호스트에 Apache 웹 서버를 설정했습니다. 포트 80에서 수신 대기하는 웹 서버에서 tcpdump를 실행했습니다. 실행할 때 telnet webserver 80다음 패킷을 캡처합니다. 이것은 TCP 연결이 설정되었으므로 예상되는 동작입니다 (S, S-Ack, Ack).

[user @ webserver ~] $ sudo tcpdump -nn -vv '22와 80이 아닌 포트 '-i eth0 
tcpdump : eth0에서 청취, 링크 유형 EN10MB (이더넷), 캡처 크기 65535 바이트
07 : 17 : 30.411474 IP (tos 0x10, ttl 64, id 34376, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    local.server.46710> web.server.80 : 플래그 [S], cksum 0x8412 (잘못된-> 0x6d96), seq 3018586542, win 29200, 옵션 [mss 1460, sackOK, TS val 3047398 ecr 0, nop, wscale 7] 길이 0
07 : 17 : 30.411557 IP (tos 0x0, ttl 64, id 0, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    web.server.80> local.server.46710 : 플래그 [S.], cksum 0x8412 (잘못된-> 0x9114), seq 2651711943, ack 3018586543, win 28960, 옵션 [mss 1460, sackOK, TS val 37704524 ecr 3047398, nop , wscale 7], 길이 0
07 : 17 : 30.411725 IP (tos 0x10, ttl 64, id 34377, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 52)
    local.server.46710> web.server.80 : 플래그 [.], cksum 0x840a (잘못된-> 0x301c), seq 1, ack 1, win 229, 옵션 [nop, nop, TS val 3047398 ecr 37704524], 길이 0

로컬 서버를 통해 원격 서버에서 웹 서버에 연결하려고하면 웹 서버의 tcpdump가 패킷을 캡처하지 않지만 (초기 동기화조차도) 로컬 서버는 웹 서버로 전송되는 동기화 패킷을 캡처합니다 (아래 참조). 이로 인해 패킷이 웹 서버로 전송되는 것을 방해하고 있다고 잘못 판단 할 수 있습니다. 잘못 구성되었거나 방화벽 일 수 있습니다.

[user @ local ~] $ sudo tcpdump -nn -vv '22 및 80이 아닌 포트 '-i any
tcpdump : 링크 유형 LINUX_SLL (Linux 쿠킹)에서 수신, 캡처 크기 65535 바이트
02 : 24 : 09.135842 IP (tos 0x10, ttl 64, id 38062, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    10.0.2.2.50558> web.server.80 : 플래그 [S], cksum 0x668d (정확한), seq 69756226, win 29200, 옵션 [mss 1460, sackOK, TS val 4780524 ecr 0, nop, wscale 7], 길이 0

중요 : 패킷이 eth0을 통해 라우팅되지 않고 대신 tun0을 통해 웹 서버로 패킷을 보내려고 시도합니다 (실패). tun0 인터페이스에서 tcpdump를 실행하여이를 확인할 수 있습니다.

[user @ local ~] $ sudo tcpdump -nn -vv '22 및 80 포트가 아님 '-i tun0
tcpdump : tun0에서 청취, 링크 유형 RAW (원시 IP), 캡처 크기 65535 바이트
02 : 28 : 10.295972 IP (tos 0x10, ttl 64, id 46976, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    10.0.2.2.50560> webserver.80 : 플래그 [S], cksum 0xd560 (수정), seq 605366388, win 29200, 옵션 [mss 1460, sackOK, TS val 5021684 ecr 0, nop, wscale 7], 길이 0


참고 # 3 :
로컬 컴퓨터에서 방화벽을 끄고 웹 서버에서 동기화 패킷을 받았습니다.

[user @ local ~] $ sudo systemctl 방화벽 중지
[user @ webserver ~] $ sudo tcpdump -nn -vv '22와 80이 아닌 포트 '-i eth0
tcpdump : eth0에서 청취, 링크 유형 EN10MB (이더넷), 캡처 크기 65535 바이트
08 : 25 : 17.390912 IP (tos 0x10, ttl 63, id 61767, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    10.0.2.2.50580> web.server.80 : 플래그 [S], cksum 0x30dc (수정), seq 2601927549, win 29200, 옵션 [mss 1460, sackOK, TS val 7123514 ecr 0, nop, wscale 7], 길이 0
08 : 25 : 17.391003 IP (tos 0x0, ttl 64, id 0, offset 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    web.server.80> 10.0.2.2.50580 : 플래그 [S.], cksum 0x4e23 (잘못된-> 0xa316), seq 959115533, ack 2601927550, win 28960, 옵션 [mss 1460, sackOK, TS val 41771503 ecr 7123514, nop , wscale 7], 길이 0
08 : 25 : 17.391192 IP (tos 0x0, ttl 128, id 60032, 오프셋 0, 플래그 [없음], 프로토 TCP (6), 길이 40)
    10.0.2.2.50580> web.server.80 : 플래그 [R], cksum 0x7339 (정확한), seq 2601927550, 승리 8192, 길이 0
08 : 25 : 18.393794 IP (tos 0x10, ttl 63, id 61768, 오프셋 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    10.0.2.2.50580> web.server.80 : 플래그 [S], cksum 0x2cf1 (수정), seq 2601927549, win 29200, 옵션 [mss 1460, sackOK, TS val 7124517 ecr 0, nop, wscale 7], 길이 0
08 : 25 : 18.393898 IP (tos 0x0, ttl 64, id 0, offset 0, 플래그 [DF], 프로토 TCP (6), 길이 60)
    web.server.80> 10.0.2.2.50580 : 플래그 [S.], cksum 0x4e23 (잘못된-> 0x7e71), seq 974785773, ack 2601927550, win 28960, 옵션 [mss 1460, sackOK, TS val 41772506 ecr 7124517, nop , wscale 7], 길이 0
08 : 25 : 18.394003 IP (tos 0x0, ttl 128, id 60033, 오프셋 0, 플래그 [없음], 프로토 TCP (6), 길이 40)
    10.0.2.2.50580> web.server.80 : 플래그 [R], cksum 0x566a (정확한), seq 2601927550, 승리 8192, 길이 0

이제 패킷이 웹 서버로 전송되기 전에 로컬 서버의 IP 주소와 일치하도록 소스 IP를 업데이트해야합니다. @xin이 제안한 것처럼 NAT는 로컬 서버에서 설정해야합니다.


참고 # 4 :
웹 서버에 연결을 시도하면 규칙 9의 pkts 수가 1 씩 증가 함을 알 수 있습니다 (아래 참조).

[user @ local ~] $ sudo iptables -nvL --line-numbers
..........
Chain FORWARD (정책 ACCEPT 0 패킷, 0 바이트)
num pkts 바이트 대상 prot 수신 거부 소스 대상         
100 모두 수락-* * 0.0.0.0/0 0.0.0.0/0 ctstate 관련, 설립
200 ACCEPT all-lo * 0.0.0.0/0 0.0.0.0/0           
3 1 60 FORWARD_direct all-* * 0.0.0.0/0 0.0.0.0/0           
4 1 60 FORWARD_IN_ZONES_SOURCE 모두-* * 0.0.0.0/0 0.0.0.0/0           
5 1 60 FORWARD_IN_ZONES 모두-* * 0.0.0.0/0 0.0.0.0/0           
6 1 60 FORWARD_OUT_ZONES_SOURCE 모두-* * 0.0.0.0/0 0.0.0.0/0           
7 1 60 FORWARD_OUT_ZONES 모두-* * 0.0.0.0/0 0.0.0.0/0           
8 0 0 DROP all-* * 0.0.0.0/0 0.0.0.0/0 ctstate 유효하지 않음
9 1 60 거부 모두-* * 0.0.0.0/0 0.0.0.0/0 거부 (icmp-host 금지)
..........
[user @ local ~] $ sudo iptables -D FORWARD 9

FORWARD 체인의 규칙 9가 삭제되면 (위에서 @xin이 제안한대로) 웹 서버에 연결할 수 있습니다.

[user @ local ~] $ sudo iptables -nvL --line-numbers
..........
체인 포워드 (정책 수락 1 패킷, 60 바이트)
num pkts 바이트 대상 prot 수신 거부 소스 대상         
1 12 5857 모두 수락-* * 0.0.0.0/0 0.0.0.0/0 ctstate 관련, 설립
200 ACCEPT all-lo * 0.0.0.0/0 0.0.0.0/0           
3 2 120 FORWARD_direct all-* * 0.0.0.0/0 0.0.0.0/0           
4 2 120 FORWARD_IN_ZONES_SOURCE 모두-* * 0.0.0.0/0 0.0.0.0/0           
5 2 120 FORWARD_IN_ZONES 모두-* * 0.0.0.0/0 0.0.0.0/0           
6 2 120 FORWARD_OUT_ZONES_SOURCE 모두-* * 0.0.0.0/0 0.0.0.0/0           
7 2 120 FORWARD_OUT_ZONES 모두-* * 0.0.0.0/0 0.0.0.0/0           
8 0 0 DROP all-* * 0.0.0.0/0 0.0.0.0/0 ctstate 유효하지 않음
..........

답변:


4

패킷의 소스 주소는 로컬 시스템의 주소 중 하나로 대체되어야 로컬 시스템이 응답을 수신 할 수 있습니다. iptables를 MASQUERADE하고 SNAT이러한 패킷의 변화를 소스 주소로 유용합니다 :

[user@local ~]$ iptables -t nat -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.1/30 -j MASQUERADE -o eth0

@xin 응답에 감사드립니다. 제공 한 명령을 실행했지만 여전히 동일한 응답이 있습니다. eth0과 tun0에서 tcpdump를 실행했습니다. 패킷은 eth0으로 라우팅되지 않습니다. tun0은 (는) 여전히 Google에 연락하려고합니다. 어떻게 든 패킷을 tun0에서 eth0으로 라우팅해야합니까?
Ali

1
로컬 시스템이 인터페이스 eth0을 사용하여 인터넷에 연결하는 경우이 명령이 없어도 패킷이 eth0으로 이동해야합니다. 방화벽 설정이 관련되어있을 수 있습니다. iptables-save로컬 머신의 출력 을 넣을 수 있습니까 ?
reith

iptables-save의 출력을 원래 게시물에 추가했습니다.
알리

방화벽을 꺼야했습니다. 방화벽을 끈 후 명령을 실행했는데 연결이 시작되었습니다! 당신의 도움을 주셔서 감사합니다! 진행 상황을 확인하려면 원본 게시물의 메모를 확인하십시오.
Ali

1
잘 했어. 문제는 iptable 규칙 인 것 같습니다 -A FORWARD -j REJECT --reject-with icmp-host-prohibited. 컴퓨터로 들어오는 패킷과 컴퓨터에서 대상 주소가있는 패킷은 FORWARD 체인으로 이동하므로이 규칙을 삭제하십시오.
reith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.